From 3f5b1a1c9220b15c2211a0bfdb02fce9ace3b6e8 Mon Sep 17 00:00:00 2001 From: "paul.baranowski" Date: Thu, 30 Sep 2010 13:31:38 -0400 Subject: [PATCH] CC-1695 Remove Campcaster Studio and make install easier Started removing stuff. --- src/modules/authentication/bin/autogen.sh | 89 - .../authentication/bin/gen_coverage_data.sh | 75 - src/modules/authentication/configure | 47 - src/modules/authentication/doc/.keepme | 1 - src/modules/authentication/etc/Makefile.in | 176 -- src/modules/authentication/etc/acinclude.m4 | 87 - .../etc/authenticationClient.xml | 18 - src/modules/authentication/etc/configure.ac | 104 - src/modules/authentication/etc/doxygen.config | 1140 ---------- .../authentication/etc/testAuthentication.xml | 12 - .../authentication/etc/webAuthentication.xml | 14 - .../etc/webAuthentication.xml.template | 14 - .../AuthenticationClientFactory.h | 187 -- .../AuthenticationClientInterface.h | 231 -- src/modules/authentication/lib/.keepme | 1 - .../src/AuthenticationClientFactory.cxx | 117 - .../src/AuthenticationClientFactoryTest.cxx | 252 --- .../src/AuthenticationClientFactoryTest.h | 113 - .../src/TestAuthenticationClient.cxx | 294 --- .../src/TestAuthenticationClient.h | 280 --- .../src/TestAuthenticationClientTest.cxx | 271 --- .../src/TestAuthenticationClientTest.h | 128 -- src/modules/authentication/src/TestRunner.cxx | 276 --- .../src/WebAuthenticationClient.cxx | 658 ------ .../src/WebAuthenticationClient.h | 289 --- .../src/WebAuthenticationClientTest.cxx | 276 --- .../src/WebAuthenticationClientTest.h | 128 -- src/modules/authentication/tmp/.keepme | 1 - src/modules/db/bin/autogen.sh | 90 - src/modules/db/bin/gen_coverage_data.sh | 75 - src/modules/db/configure | 47 - src/modules/db/doc/doxygen/.keepme | 1 - src/modules/db/etc/Makefile.in | 174 -- src/modules/db/etc/acinclude.m4 | 87 - src/modules/db/etc/configure.ac | 106 - .../db/etc/connectionManagerFactory.xml | 16 - .../etc/connectionManagerFactory.xml.template | 16 - src/modules/db/etc/doxygen.config | 1139 ---------- .../db/etc/simpleConnectionManager.xml | 12 - .../etc/simpleConnectionManager.xml.template | 12 - src/modules/db/etc/testResultToHtml.xsl | 63 - .../LiveSupport/Db/ConnectionManagerFactory.h | 182 -- .../Db/ConnectionManagerInterface.h | 106 - .../db/include/LiveSupport/Db/Conversion.h | 117 - src/modules/db/lib/.keepme | 1 - .../db/src/ConnectionManagerFactory.cxx | 105 - .../db/src/ConnectionManagerFactoryTest.cxx | 122 - .../db/src/ConnectionManagerFactoryTest.h | 103 - src/modules/db/src/Conversion.cxx | 92 - .../db/src/SimpleConnectionManager.cxx | 146 -- src/modules/db/src/SimpleConnectionManager.h | 184 -- .../db/src/SimpleConnectionManagerTest.cxx | 206 -- .../db/src/SimpleConnectionManagerTest.h | 112 - src/modules/db/src/TestRunner.cxx | 275 --- src/modules/db/tmp/.keepme | 1 - src/modules/widgets/bin/autogen.sh | 90 - src/modules/widgets/configure | 47 - src/modules/widgets/doc/.keepme | 1 - src/modules/widgets/etc/Makefile.in | 225 -- src/modules/widgets/etc/acinclude.m4 | 463 ---- src/modules/widgets/etc/configure.ac | 130 -- src/modules/widgets/etc/doxygen.config | 1139 ---------- src/modules/widgets/etc/resourceBundle.xml | 11 - src/modules/widgets/etc/widgetFactory.xml | 9 - .../include/LiveSupport/Widgets/Colors.h | 111 - .../LiveSupport/Widgets/ComboBoxText.h | 88 - .../LiveSupport/Widgets/CornerBitmaps.h | 129 -- .../Widgets/MetadataComboBoxText.h | 121 - .../Widgets/OperatorComboBoxText.h | 109 - .../Widgets/PlayableTreeModelColumnRecord.h | 88 - .../LiveSupport/Widgets/WidgetConstants.h | 78 - .../LiveSupport/Widgets/WidgetFactory.h | 184 -- .../LiveSupport/Widgets/ZebraCellRenderer.h | 113 - .../Widgets/ZebraTreeModelColumnRecord.h | 81 - .../LiveSupport/Widgets/ZebraTreeView.h | 430 ---- src/modules/widgets/lib/.keepme | 1 - src/modules/widgets/src/Colors.cxx | 132 -- src/modules/widgets/src/ComboBoxText.cxx | 64 - .../widgets/src/MetadataComboBoxText.cxx | 97 - .../widgets/src/OperatorComboBoxText.cxx | 122 - src/modules/widgets/src/TestWindow.cxx | 472 ---- src/modules/widgets/src/TestWindow.h | 288 --- src/modules/widgets/src/WidgetFactory.cxx | 156 -- src/modules/widgets/src/ZebraCellRenderer.cxx | 252 --- src/modules/widgets/src/ZebraTreeView.cxx | 572 ----- src/modules/widgets/src/main.cxx | 203 -- src/modules/widgets/tmp/.keepme | 1 - src/modules/widgets/var/en.txt | 3 - .../widgets/var/glade/TestWindow.glade | 118 - src/modules/widgets/var/hu.txt | 18 - .../widgets/var/icons/audioClipIcon.png | Bin 347 -> 0 bytes .../widgets/var/icons/playlistIcon.png | Bin 379 -> 0 bytes src/modules/widgets/var/root.txt | 18 - src/products/gLiveSupport/bin/autogen.sh | 90 - .../gLiveSupport/bin/campcaster-studio.sh | 59 - .../bin/campcaster-studio_devenv.sh | 66 - .../gLiveSupport/bin/gen_coverage_data.sh | 75 - src/products/gLiveSupport/configure | 47 - src/products/gLiveSupport/doc/.keepme | 1 - src/products/gLiveSupport/etc/Makefile.in | 468 ---- src/products/gLiveSupport/etc/acinclude.m4 | 575 ----- src/products/gLiveSupport/etc/audioPlayer.xml | 12 - .../gLiveSupport/etc/authenticationClient.xml | 19 - .../authenticationClient.xml.user-template | 19 - .../gLiveSupport/etc/campcaster-studio.xml | 451 ---- .../etc/campcaster-studio.xml.template | 450 ---- .../etc/campcaster-studio.xml.user-template | 450 ---- src/products/gLiveSupport/etc/configure.ac | 289 --- src/products/gLiveSupport/etc/doxygen.config | 1140 ---------- .../gLiveSupport/etc/keyboardShortcut.xml | 17 - .../gLiveSupport/etc/storageClient.xml | 20 - .../etc/storageClient.xml.user-template | 20 - .../gLiveSupport/etc/testResultToHtml.xsl | 63 - src/products/gLiveSupport/lib/.keepme | 1 - .../gLiveSupport/src/AdvancedSearchEntry.cxx | 162 -- .../gLiveSupport/src/AdvancedSearchEntry.h | 139 -- .../gLiveSupport/src/AdvancedSearchItem.cxx | 106 - .../gLiveSupport/src/AdvancedSearchItem.h | 225 -- .../gLiveSupport/src/AudioPlayerTest.cxx | 300 --- .../gLiveSupport/src/AudioPlayerTest.h | 129 -- src/products/gLiveSupport/src/BackupList.cxx | 392 ---- src/products/gLiveSupport/src/BackupList.h | 348 --- src/products/gLiveSupport/src/BackupView.cxx | 291 --- src/products/gLiveSupport/src/BackupView.h | 220 -- src/products/gLiveSupport/src/BrowseEntry.cxx | 76 - src/products/gLiveSupport/src/BrowseEntry.h | 142 -- src/products/gLiveSupport/src/BrowseItem.cxx | 157 -- src/products/gLiveSupport/src/BrowseItem.h | 252 --- .../gLiveSupport/src/ContentsStorable.h | 108 - src/products/gLiveSupport/src/CuePlayer.cxx | 234 -- src/products/gLiveSupport/src/CuePlayer.h | 192 -- .../src/DateTimeChooserWindow.cxx | 117 - .../gLiveSupport/src/DateTimeChooserWindow.h | 143 -- src/products/gLiveSupport/src/DndMethods.cxx | 181 -- src/products/gLiveSupport/src/DndMethods.h | 197 -- .../src/ExportFormatRadioButtons.cxx | 82 - .../src/ExportFormatRadioButtons.h | 99 - .../gLiveSupport/src/ExportPlaylistWindow.cxx | 217 -- .../gLiveSupport/src/ExportPlaylistWindow.h | 147 -- .../gLiveSupport/src/GLiveSupport.cxx | 1985 ----------------- src/products/gLiveSupport/src/GLiveSupport.h | 1429 ------------ .../gLiveSupport/src/GLiveSupportTest.cxx | 324 --- .../gLiveSupport/src/GLiveSupportTest.h | 170 -- .../gLiveSupport/src/GuiComponent.cxx | 71 - src/products/gLiveSupport/src/GuiComponent.h | 102 - src/products/gLiveSupport/src/GuiObject.cxx | 57 - src/products/gLiveSupport/src/GuiObject.h | 112 - src/products/gLiveSupport/src/GuiWindow.cxx | 156 -- src/products/gLiveSupport/src/GuiWindow.h | 184 -- .../gLiveSupport/src/KeyboardShortcut.cxx | 195 -- .../gLiveSupport/src/KeyboardShortcut.h | 273 --- .../src/KeyboardShortcutContainer.cxx | 116 - .../src/KeyboardShortcutContainer.h | 214 -- .../gLiveSupport/src/KeyboardShortcutList.cxx | 94 - .../gLiveSupport/src/KeyboardShortcutList.h | 186 -- .../gLiveSupport/src/KeyboardShortcutTest.cxx | 142 -- .../gLiveSupport/src/KeyboardShortcutTest.h | 111 - .../gLiveSupport/src/LiveModeWindow.cxx | 782 ------- .../gLiveSupport/src/LiveModeWindow.h | 492 ---- src/products/gLiveSupport/src/LoginWindow.cxx | 198 -- src/products/gLiveSupport/src/LoginWindow.h | 182 -- .../gLiveSupport/src/MasterPanelWindow.cxx | 814 ------- .../gLiveSupport/src/MasterPanelWindow.h | 610 ----- src/products/gLiveSupport/src/NowPlaying.cxx | 506 ----- src/products/gLiveSupport/src/NowPlaying.h | 318 --- .../gLiveSupport/src/OptionsWindow.cxx | 785 ------- src/products/gLiveSupport/src/OptionsWindow.h | 434 ---- .../gLiveSupport/src/PlaylistWindow.cxx | 806 ------- .../gLiveSupport/src/PlaylistWindow.h | 425 ---- src/products/gLiveSupport/src/RdsEntry.cxx | 116 - src/products/gLiveSupport/src/RdsEntry.h | 170 -- src/products/gLiveSupport/src/RdsView.cxx | 147 -- src/products/gLiveSupport/src/RdsView.h | 157 -- .../gLiveSupport/src/RestoreBackupWindow.cxx | 281 --- .../gLiveSupport/src/RestoreBackupWindow.h | 242 -- .../src/SchedulePlaylistWindow.cxx | 137 -- .../gLiveSupport/src/SchedulePlaylistWindow.h | 145 -- .../gLiveSupport/src/SchedulerWindow.cxx | 369 --- .../gLiveSupport/src/SchedulerWindow.h | 266 --- .../gLiveSupport/src/ScratchpadWindow.cxx | 673 ------ .../gLiveSupport/src/ScratchpadWindow.h | 424 ---- .../gLiveSupport/src/SearchWindow.cxx | 1128 ---------- src/products/gLiveSupport/src/SearchWindow.h | 697 ------ .../gLiveSupport/src/TaskbarIcons.cxx | 106 - src/products/gLiveSupport/src/TaskbarIcons.h | 163 -- src/products/gLiveSupport/src/TestRunner.cxx | 279 --- .../gLiveSupport/src/TransportList.cxx | 494 ---- src/products/gLiveSupport/src/TransportList.h | 395 ---- .../gLiveSupport/src/UploadFileWindow.cxx | 567 ----- .../gLiveSupport/src/UploadFileWindow.h | 328 --- src/products/gLiveSupport/src/main.cxx | 214 -- src/products/gLiveSupport/tmp/.keepme | 1 - src/products/gLiveSupport/var/.keepme | 1 - src/products/gLiveSupport/var/campcaster.png | Bin 1081 -> 0 bytes src/products/gLiveSupport/var/en.txt | 3 - src/products/gLiveSupport/var/es.txt | 466 ---- src/products/gLiveSupport/var/fr.txt | 467 ---- .../var/glade/DateTimeChooserWindow.glade | 150 -- .../var/glade/ExportPlaylistWindow.glade | 164 -- .../gLiveSupport/var/glade/GLiveSupport.glade | 173 -- .../var/glade/LiveModeWindow.glade | 142 -- .../gLiveSupport/var/glade/LoginWindow.glade | 221 -- .../var/glade/MasterPanelWindow.glade | 434 ---- .../var/glade/OptionsWindow.glade | 1645 -------------- .../var/glade/PlaylistWindow.glade | 284 --- .../var/glade/RestoreBackupWindow.glade | 65 - .../var/glade/SchedulePlaylistWindow.glade | 192 -- .../var/glade/SchedulerWindow.glade | 259 --- .../var/glade/ScratchpadWindow.glade | 101 - .../gLiveSupport/var/glade/SearchWindow.glade | 855 ------- .../var/glade/UploadFileWindow.glade | 1697 -------------- src/products/gLiveSupport/var/hu.txt | 464 ---- src/products/gLiveSupport/var/icon16.png | Bin 613 -> 0 bytes src/products/gLiveSupport/var/icon22.png | Bin 928 -> 0 bytes src/products/gLiveSupport/var/icon32.png | Bin 1655 -> 0 bytes src/products/gLiveSupport/var/icon48.png | Bin 3078 -> 0 bytes src/products/gLiveSupport/var/nl.txt | 466 ---- src/products/gLiveSupport/var/pl.txt | 465 ---- src/products/gLiveSupport/var/root.txt | 467 ---- src/products/gLiveSupport/var/sr_CS.txt | 460 ---- .../gLiveSupport/var/sr_CS_CYRILLIC.txt | 460 ---- src/products/gLiveSupport/var/stationLogo.png | Bin 3612 -> 0 bytes src/products/gLiveSupport/var/sv.txt | 467 ---- src/products/gLiveSupport/var/testAudio.ogg | Bin 17343 -> 0 bytes .../var/widgets/blueBin/bottom.png | Bin 2818 -> 0 bytes .../var/widgets/blueBin/bottomLeft.png | Bin 2830 -> 0 bytes .../var/widgets/blueBin/bottomRight.png | Bin 2827 -> 0 bytes .../gLiveSupport/var/widgets/blueBin/left.png | Bin 2817 -> 0 bytes .../var/widgets/blueBin/right.png | Bin 2817 -> 0 bytes .../gLiveSupport/var/widgets/blueBin/top.png | Bin 2819 -> 0 bytes .../var/widgets/blueBin/topLeft.png | Bin 2830 -> 0 bytes .../var/widgets/blueBin/topRight.png | Bin 2830 -> 0 bytes .../var/widgets/button/center.png | Bin 2891 -> 0 bytes .../var/widgets/button/centerGray.png | Bin 2891 -> 0 bytes .../var/widgets/button/centerRoll.png | Bin 2889 -> 0 bytes .../var/widgets/button/centerSel.png | Bin 2896 -> 0 bytes .../gLiveSupport/var/widgets/button/left.png | Bin 2988 -> 0 bytes .../var/widgets/button/leftGray.png | Bin 2988 -> 0 bytes .../var/widgets/button/leftRoll.png | Bin 2973 -> 0 bytes .../var/widgets/button/leftSel.png | Bin 3100 -> 0 bytes .../gLiveSupport/var/widgets/button/right.png | Bin 3077 -> 0 bytes .../var/widgets/button/rightGray.png | Bin 3077 -> 0 bytes .../var/widgets/button/rightRoll.png | Bin 3073 -> 0 bytes .../var/widgets/button/rightSel.png | Bin 3096 -> 0 bytes .../gLiveSupport/var/widgets/combo/center.png | Bin 2870 -> 0 bytes .../gLiveSupport/var/widgets/combo/left.png | Bin 2933 -> 0 bytes .../gLiveSupport/var/widgets/combo/right.png | Bin 3464 -> 0 bytes .../var/widgets/darkBlueBin/bottom.png | Bin 2817 -> 0 bytes .../var/widgets/darkBlueBin/bottomLeft.png | Bin 2830 -> 0 bytes .../var/widgets/darkBlueBin/bottomRight.png | Bin 2830 -> 0 bytes .../var/widgets/darkBlueBin/left.png | Bin 2817 -> 0 bytes .../var/widgets/darkBlueBin/right.png | Bin 2817 -> 0 bytes .../var/widgets/darkBlueBin/top.png | Bin 2819 -> 0 bytes .../var/widgets/darkBlueBin/topLeft.png | Bin 2830 -> 0 bytes .../var/widgets/darkBlueBin/topRight.png | Bin 2830 -> 0 bytes .../var/widgets/entryBin/bottom.png | Bin 143 -> 0 bytes .../var/widgets/entryBin/bottomLeft.png | Bin 176 -> 0 bytes .../var/widgets/entryBin/bottomRight.png | Bin 174 -> 0 bytes .../var/widgets/entryBin/left.png | Bin 140 -> 0 bytes .../var/widgets/entryBin/right.png | Bin 140 -> 0 bytes .../gLiveSupport/var/widgets/entryBin/top.png | Bin 143 -> 0 bytes .../var/widgets/entryBin/topLeft.png | Bin 173 -> 0 bytes .../var/widgets/entryBin/topRight.png | Bin 172 -> 0 bytes .../var/widgets/icons/audioClipIcon.png | Bin 347 -> 0 bytes .../var/widgets/icons/playlistIcon.png | Bin 379 -> 0 bytes .../var/widgets/imageButton/delete.png | Bin 3493 -> 0 bytes .../var/widgets/imageButton/deleteRoll.png | Bin 3480 -> 0 bytes .../var/widgets/imageButton/hugePlay.png | Bin 3658 -> 0 bytes .../var/widgets/imageButton/hugePlayRoll.png | Bin 3683 -> 0 bytes .../var/widgets/imageButton/masterPause.png | Bin 1079 -> 0 bytes .../widgets/imageButton/masterPauseRoll.png | Bin 1080 -> 0 bytes .../var/widgets/imageButton/masterPlay.png | Bin 1288 -> 0 bytes .../widgets/imageButton/masterPlayRoll.png | Bin 1280 -> 0 bytes .../var/widgets/imageButton/masterStop.png | Bin 1155 -> 0 bytes .../widgets/imageButton/masterStopRoll.png | Bin 1148 -> 0 bytes .../var/widgets/imageButton/minus.png | Bin 3493 -> 0 bytes .../var/widgets/imageButton/minusRoll.png | Bin 3480 -> 0 bytes .../var/widgets/imageButton/plus.png | Bin 3358 -> 0 bytes .../var/widgets/imageButton/plusRoll.png | Bin 3349 -> 0 bytes .../var/widgets/imageButton/smallPause.png | Bin 3320 -> 0 bytes .../widgets/imageButton/smallPauseRoll.png | Bin 3290 -> 0 bytes .../var/widgets/imageButton/smallPlay.png | Bin 3406 -> 0 bytes .../var/widgets/imageButton/smallPlayRoll.png | Bin 3393 -> 0 bytes .../var/widgets/imageButton/smallStop.png | Bin 3303 -> 0 bytes .../var/widgets/imageButton/smallStopRoll.png | Bin 3280 -> 0 bytes .../var/widgets/imageButton/windowClose.png | Bin 357 -> 0 bytes .../widgets/imageButton/windowCloseRoll.png | Bin 361 -> 0 bytes .../var/widgets/imageButton/windowMax.png | Bin 352 -> 0 bytes .../var/widgets/imageButton/windowMaxRoll.png | Bin 352 -> 0 bytes .../var/widgets/imageButton/windowMin.png | Bin 338 -> 0 bytes .../var/widgets/imageButton/windowMinRoll.png | Bin 333 -> 0 bytes .../var/widgets/tabButton/center.png | Bin 173 -> 0 bytes .../var/widgets/tabButton/centerGray.png | Bin 173 -> 0 bytes .../var/widgets/tabButton/centerRoll.png | Bin 161 -> 0 bytes .../var/widgets/tabButton/centerSel.png | Bin 218 -> 0 bytes .../var/widgets/tabButton/left.png | Bin 276 -> 0 bytes .../var/widgets/tabButton/leftGray.png | Bin 307 -> 0 bytes .../var/widgets/tabButton/leftRoll.png | Bin 253 -> 0 bytes .../var/widgets/tabButton/leftSel.png | Bin 381 -> 0 bytes .../var/widgets/tabButton/right.png | Bin 310 -> 0 bytes .../var/widgets/tabButton/rightGray.png | Bin 404 -> 0 bytes .../var/widgets/tabButton/rightRoll.png | Bin 314 -> 0 bytes .../var/widgets/tabButton/rightSel.png | Bin 439 -> 0 bytes .../var/widgets/whiteWindow/bottom.png | Bin 2834 -> 0 bytes .../var/widgets/whiteWindow/bottomLeft.png | Bin 2927 -> 0 bytes .../var/widgets/whiteWindow/bottomRight.png | Bin 2920 -> 0 bytes .../var/widgets/whiteWindow/left.png | Bin 2826 -> 0 bytes .../var/widgets/whiteWindow/resize.png | Bin 3181 -> 0 bytes .../var/widgets/whiteWindow/right.png | Bin 2825 -> 0 bytes .../var/widgets/whiteWindow/top.png | Bin 2831 -> 0 bytes .../var/widgets/whiteWindow/topLeft.png | Bin 2908 -> 0 bytes .../var/widgets/whiteWindow/topRight.png | Bin 2942 -> 0 bytes .../widgets/whiteWindow/windowTitleLogo.png | Bin 664 -> 0 bytes src/products/scheduler/bin/autogen.sh | 90 - .../scheduler/bin/campcaster-scheduler.sh | 102 - .../bin/campcaster-scheduler_devenv.sh | 118 - src/products/scheduler/bin/createDatabase.sh | 206 -- .../scheduler/bin/createOdbcDataSource.sh | 187 -- .../scheduler/bin/gen_coverage_data.sh | 75 - src/products/scheduler/bin/run_tests.sh | 65 - src/products/scheduler/configure | 47 - src/products/scheduler/doc/doxygen/.keepme | 1 - .../scheduler/doc/model/SchedulerModel.zuml | Bin 164753 -> 0 bytes src/products/scheduler/etc/Makefile.in | 462 ---- src/products/scheduler/etc/acinclude.m4 | 575 ----- .../scheduler/etc/authenticationClient.xml | 18 - .../etc/campcaster-scheduler-local.xml | 145 -- .../scheduler/etc/campcaster-scheduler.xml | 130 -- .../etc/campcaster-scheduler.xml.template | 130 -- src/products/scheduler/etc/configure.ac | 312 --- .../etc/connectionManagerFactory.xml | 16 - src/products/scheduler/etc/doxygen.config | 1140 ---------- src/products/scheduler/etc/odbc_template | 18 - src/products/scheduler/etc/odbc_test_template | 18 - .../etc/odbcinst_new_debian_template | 5 - .../etc/odbcinst_old_debian_template | 5 - src/products/scheduler/etc/odbcinst_template | 5 - src/products/scheduler/etc/playLogFactory.xml | 10 - src/products/scheduler/etc/playlist.xml | 37 - .../scheduler/etc/scheduleFactory.xml | 10 - src/products/scheduler/etc/storageClient.xml | 50 - .../etc/testAuthenticationClient.xml | 18 - .../scheduler/etc/testResultToHtml.xsl | 63 - .../scheduler/etc/testStorageClient.xml | 50 - .../scheduler/etc/webAuthenticationClient.xml | 19 - .../scheduler/etc/webStorageClient.xml | 20 - src/products/scheduler/src/BackupFactory.cxx | 120 - src/products/scheduler/src/BackupFactory.h | 175 -- src/products/scheduler/src/BackupInterface.h | 183 -- src/products/scheduler/src/BaseTestMethod.cxx | 87 - src/products/scheduler/src/BaseTestMethod.h | 127 -- .../scheduler/src/CreateBackupCheckMethod.cxx | 138 -- .../scheduler/src/CreateBackupCheckMethod.h | 152 -- .../scheduler/src/CreateBackupCloseMethod.cxx | 121 - .../scheduler/src/CreateBackupCloseMethod.h | 136 -- .../scheduler/src/CreateBackupOpenMethod.cxx | 152 -- .../scheduler/src/CreateBackupOpenMethod.h | 158 -- .../scheduler/src/DisplayScheduleMethod.cxx | 138 -- .../scheduler/src/DisplayScheduleMethod.h | 165 -- .../src/DisplayScheduleMethodTest.cxx | 409 ---- .../scheduler/src/DisplayScheduleMethodTest.h | 138 -- .../src/GeneratePlayReportMethod.cxx | 136 -- .../scheduler/src/GeneratePlayReportMethod.h | 162 -- .../src/GeneratePlayReportMethodTest.cxx | 391 ---- .../src/GeneratePlayReportMethodTest.h | 138 -- .../scheduler/src/GetSchedulerTimeMethod.cxx | 102 - .../scheduler/src/GetSchedulerTimeMethod.h | 139 -- .../src/GetSchedulerTimeMethodTest.cxx | 129 -- .../src/GetSchedulerTimeMethodTest.h | 101 - .../scheduler/src/GetVersionMethod.cxx | 94 - src/products/scheduler/src/GetVersionMethod.h | 133 -- .../scheduler/src/GetVersionMethodTest.cxx | 107 - .../scheduler/src/GetVersionMethodTest.h | 105 - src/products/scheduler/src/LoginMethod.cxx | 119 - src/products/scheduler/src/LoginMethod.h | 142 -- src/products/scheduler/src/LogoutMethod.cxx | 107 - src/products/scheduler/src/LogoutMethod.h | 134 -- src/products/scheduler/src/PlayLogFactory.cxx | 110 - src/products/scheduler/src/PlayLogFactory.h | 176 -- src/products/scheduler/src/PlayLogInterface.h | 117 - src/products/scheduler/src/PlaylistEvent.cxx | 182 -- src/products/scheduler/src/PlaylistEvent.h | 240 -- .../scheduler/src/PlaylistEventContainer.cxx | 114 - .../scheduler/src/PlaylistEventContainer.h | 162 -- .../src/PlaylistEventContainerTest.cxx | 184 -- .../src/PlaylistEventContainerTest.h | 159 -- .../scheduler/src/PlaylistEventTest.cxx | 202 -- .../scheduler/src/PlaylistEventTest.h | 168 -- .../scheduler/src/PostgresqlBackup.cxx | 429 ---- src/products/scheduler/src/PostgresqlBackup.h | 306 --- .../scheduler/src/PostgresqlBackupTest.cxx | 231 -- .../scheduler/src/PostgresqlBackupTest.h | 136 -- .../scheduler/src/PostgresqlPlayLog.cxx | 201 -- .../scheduler/src/PostgresqlPlayLog.h | 208 -- .../scheduler/src/PostgresqlPlayLogTest.cxx | 179 -- .../scheduler/src/PostgresqlPlayLogTest.h | 128 -- .../scheduler/src/PostgresqlSchedule.cxx | 761 ------- .../scheduler/src/PostgresqlSchedule.h | 401 ---- .../scheduler/src/PostgresqlScheduleTest.cxx | 594 ----- .../scheduler/src/PostgresqlScheduleTest.h | 203 -- .../src/RemoveFromScheduleMethod.cxx | 143 -- .../scheduler/src/RemoveFromScheduleMethod.h | 144 -- .../src/RemoveFromScheduleMethodTest.cxx | 270 --- .../src/RemoveFromScheduleMethodTest.h | 141 -- .../scheduler/src/RescheduleMethod.cxx | 161 -- src/products/scheduler/src/RescheduleMethod.h | 147 -- .../scheduler/src/RescheduleMethodTest.cxx | 271 --- .../scheduler/src/RescheduleMethodTest.h | 133 -- .../scheduler/src/ResetStorageMethod.cxx | 94 - .../scheduler/src/ResetStorageMethod.h | 128 -- .../scheduler/src/ResetStorageMethodTest.cxx | 84 - .../scheduler/src/ResetStorageMethodTest.h | 102 - .../scheduler/src/RestoreBackupMethod.cxx | 123 - .../scheduler/src/RestoreBackupMethod.h | 141 -- src/products/scheduler/src/RpcBackupTest.cxx | 315 --- src/products/scheduler/src/RpcBackupTest.h | 128 -- .../scheduler/src/RpcDisplayScheduleTest.cxx | 238 -- .../scheduler/src/RpcDisplayScheduleTest.h | 120 - .../src/RpcGeneratePlayReportTest.cxx | 389 ---- .../scheduler/src/RpcGeneratePlayReportTest.h | 126 -- .../scheduler/src/RpcGetSchedulerTimeTest.cxx | 131 -- .../scheduler/src/RpcGetSchedulerTimeTest.h | 101 - .../scheduler/src/RpcGetVersionTest.cxx | 101 - .../scheduler/src/RpcGetVersionTest.h | 99 - .../src/RpcRemoveFromScheduleTest.cxx | 235 -- .../scheduler/src/RpcRemoveFromScheduleTest.h | 129 -- .../scheduler/src/RpcRescheduleTest.cxx | 290 --- .../scheduler/src/RpcRescheduleTest.h | 130 -- .../src/RpcStopCurrentlyPlayingTest.cxx | 237 -- .../src/RpcStopCurrentlyPlayingTest.h | 138 -- .../scheduler/src/RpcUploadPlaylistTest.cxx | 209 -- .../scheduler/src/RpcUploadPlaylistTest.h | 123 - .../scheduler/src/ScheduleFactory.cxx | 109 - src/products/scheduler/src/ScheduleFactory.h | 176 -- .../scheduler/src/ScheduleInterface.h | 257 --- .../scheduler/src/SchedulerDaemon.cxx | 365 --- src/products/scheduler/src/SchedulerDaemon.h | 465 ---- .../scheduler/src/SchedulerDaemonTest.cxx | 129 -- .../scheduler/src/SchedulerDaemonTest.h | 123 - .../scheduler/src/SignalDispatcher.cxx | 137 -- src/products/scheduler/src/SignalDispatcher.h | 140 -- src/products/scheduler/src/SignalHandler.h | 87 - .../src/StopCurrentlyPlayingMethod.cxx | 151 -- .../src/StopCurrentlyPlayingMethod.h | 150 -- src/products/scheduler/src/TestRunner.cxx | 304 --- .../scheduler/src/UploadPlaylistMethod.cxx | 174 -- .../scheduler/src/UploadPlaylistMethod.h | 160 -- .../src/UploadPlaylistMethodTest.cxx | 254 --- .../scheduler/src/UploadPlaylistMethodTest.h | 133 -- src/products/scheduler/src/XmlRpcDaemon.cxx | 369 --- src/products/scheduler/src/XmlRpcDaemon.h | 434 ---- .../src/XmlRpcDaemonShutdownSignalHandler.h | 111 - src/products/scheduler/src/main.cxx | 244 -- src/products/scheduler/tmp/.keepme | 1 - src/products/scheduler/var/test1.mp3 | Bin 236563 -> 0 bytes src/products/scheduler/var/test2.mp3 | Bin 236563 -> 0 bytes .../libodbc++/libodbc++-0.2.5/bin/autogen.sh | 95 - .../libodbc++/libodbc++-0.2.5/bin/prepare.sh | 53 - src/tools/libodbc++/libodbc++-0.2.5/configure | 48 - .../libodbc++/libodbc++-0.2.5/etc/Makefile.in | 78 - .../libodbc++-0.2.5/etc/configure.ac | 54 - .../etc/libodbc++-add-cstdio-include.patch | 11 - .../src/libodbc++-0.2.5.tar.bz2 | Bin 362310 -> 0 bytes .../libodbc++/libodbc++-0.2.5/tmp/.keepme | 1 - src/tools/taglib/taglib-1.5/bin/autogen.sh | 95 - src/tools/taglib/taglib-1.5/bin/prepare.sh | 53 - src/tools/taglib/taglib-1.5/configure | 47 - src/tools/taglib/taglib-1.5/etc/Makefile.in | 90 - src/tools/taglib/taglib-1.5/etc/configure.ac | 54 - .../taglib-1.5-length-in-microseconds.patch | 127 -- .../taglib/taglib-1.5/src/taglib-1.5.tar.gz | Bin 1394506 -> 0 bytes src/tools/taglib/taglib-1.5/tmp/.keepme | 1 - .../xmlrpc++/xmlrpc++-20040713/bin/autogen.sh | 95 - .../xmlrpc++/xmlrpc++-20040713/bin/prepare.sh | 55 - .../xmlrpc++/xmlrpc++-20040713/configure | 47 - .../xmlrpc++-20040713/etc/Makefile.in | 78 - .../xmlrpc++-20040713/etc/configure.ac | 55 - ...ect_XmlRpcValue_struct_tm_conversion.patch | 31 - .../uninitialised_XmlRpcSource_ssl_ssl.patch | 11 - .../etc/xmlrpc++-automake.patch | 252 --- .../src/xmlrpc++-20040713.tar.gz | Bin 73013 -> 0 bytes .../xmlrpc++/xmlrpc++-20040713/tmp/.keepme | 1 - 482 files changed, 79963 deletions(-) delete mode 100755 src/modules/authentication/bin/autogen.sh delete mode 100755 src/modules/authentication/bin/gen_coverage_data.sh delete mode 100755 src/modules/authentication/configure delete mode 100644 src/modules/authentication/doc/.keepme delete mode 100644 src/modules/authentication/etc/Makefile.in delete mode 100644 src/modules/authentication/etc/acinclude.m4 delete mode 100644 src/modules/authentication/etc/authenticationClient.xml delete mode 100644 src/modules/authentication/etc/configure.ac delete mode 100644 src/modules/authentication/etc/doxygen.config delete mode 100644 src/modules/authentication/etc/testAuthentication.xml delete mode 100644 src/modules/authentication/etc/webAuthentication.xml delete mode 100644 src/modules/authentication/etc/webAuthentication.xml.template delete mode 100644 src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h delete mode 100644 src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h delete mode 100644 src/modules/authentication/lib/.keepme delete mode 100644 src/modules/authentication/src/AuthenticationClientFactory.cxx delete mode 100644 src/modules/authentication/src/AuthenticationClientFactoryTest.cxx delete mode 100644 src/modules/authentication/src/AuthenticationClientFactoryTest.h delete mode 100644 src/modules/authentication/src/TestAuthenticationClient.cxx delete mode 100644 src/modules/authentication/src/TestAuthenticationClient.h delete mode 100644 src/modules/authentication/src/TestAuthenticationClientTest.cxx delete mode 100644 src/modules/authentication/src/TestAuthenticationClientTest.h delete mode 100644 src/modules/authentication/src/TestRunner.cxx delete mode 100644 src/modules/authentication/src/WebAuthenticationClient.cxx delete mode 100644 src/modules/authentication/src/WebAuthenticationClient.h delete mode 100644 src/modules/authentication/src/WebAuthenticationClientTest.cxx delete mode 100644 src/modules/authentication/src/WebAuthenticationClientTest.h delete mode 100644 src/modules/authentication/tmp/.keepme delete mode 100755 src/modules/db/bin/autogen.sh delete mode 100755 src/modules/db/bin/gen_coverage_data.sh delete mode 100755 src/modules/db/configure delete mode 100644 src/modules/db/doc/doxygen/.keepme delete mode 100644 src/modules/db/etc/Makefile.in delete mode 100644 src/modules/db/etc/acinclude.m4 delete mode 100644 src/modules/db/etc/configure.ac delete mode 100644 src/modules/db/etc/connectionManagerFactory.xml delete mode 100644 src/modules/db/etc/connectionManagerFactory.xml.template delete mode 100644 src/modules/db/etc/doxygen.config delete mode 100644 src/modules/db/etc/simpleConnectionManager.xml delete mode 100644 src/modules/db/etc/simpleConnectionManager.xml.template delete mode 100644 src/modules/db/etc/testResultToHtml.xsl delete mode 100644 src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h delete mode 100644 src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h delete mode 100644 src/modules/db/include/LiveSupport/Db/Conversion.h delete mode 100644 src/modules/db/lib/.keepme delete mode 100644 src/modules/db/src/ConnectionManagerFactory.cxx delete mode 100644 src/modules/db/src/ConnectionManagerFactoryTest.cxx delete mode 100644 src/modules/db/src/ConnectionManagerFactoryTest.h delete mode 100644 src/modules/db/src/Conversion.cxx delete mode 100644 src/modules/db/src/SimpleConnectionManager.cxx delete mode 100644 src/modules/db/src/SimpleConnectionManager.h delete mode 100644 src/modules/db/src/SimpleConnectionManagerTest.cxx delete mode 100644 src/modules/db/src/SimpleConnectionManagerTest.h delete mode 100644 src/modules/db/src/TestRunner.cxx delete mode 100644 src/modules/db/tmp/.keepme delete mode 100755 src/modules/widgets/bin/autogen.sh delete mode 100755 src/modules/widgets/configure delete mode 100644 src/modules/widgets/doc/.keepme delete mode 100644 src/modules/widgets/etc/Makefile.in delete mode 100644 src/modules/widgets/etc/acinclude.m4 delete mode 100644 src/modules/widgets/etc/configure.ac delete mode 100644 src/modules/widgets/etc/doxygen.config delete mode 100644 src/modules/widgets/etc/resourceBundle.xml delete mode 100644 src/modules/widgets/etc/widgetFactory.xml delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/Colors.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/ComboBoxText.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/MetadataComboBoxText.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/OperatorComboBoxText.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/PlayableTreeModelColumnRecord.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/WidgetConstants.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/ZebraCellRenderer.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeModelColumnRecord.h delete mode 100644 src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeView.h delete mode 100644 src/modules/widgets/lib/.keepme delete mode 100644 src/modules/widgets/src/Colors.cxx delete mode 100644 src/modules/widgets/src/ComboBoxText.cxx delete mode 100644 src/modules/widgets/src/MetadataComboBoxText.cxx delete mode 100644 src/modules/widgets/src/OperatorComboBoxText.cxx delete mode 100644 src/modules/widgets/src/TestWindow.cxx delete mode 100644 src/modules/widgets/src/TestWindow.h delete mode 100644 src/modules/widgets/src/WidgetFactory.cxx delete mode 100644 src/modules/widgets/src/ZebraCellRenderer.cxx delete mode 100644 src/modules/widgets/src/ZebraTreeView.cxx delete mode 100644 src/modules/widgets/src/main.cxx delete mode 100644 src/modules/widgets/tmp/.keepme delete mode 100644 src/modules/widgets/var/en.txt delete mode 100644 src/modules/widgets/var/glade/TestWindow.glade delete mode 100644 src/modules/widgets/var/hu.txt delete mode 100644 src/modules/widgets/var/icons/audioClipIcon.png delete mode 100644 src/modules/widgets/var/icons/playlistIcon.png delete mode 100644 src/modules/widgets/var/root.txt delete mode 100755 src/products/gLiveSupport/bin/autogen.sh delete mode 100755 src/products/gLiveSupport/bin/campcaster-studio.sh delete mode 100755 src/products/gLiveSupport/bin/campcaster-studio_devenv.sh delete mode 100755 src/products/gLiveSupport/bin/gen_coverage_data.sh delete mode 100755 src/products/gLiveSupport/configure delete mode 100644 src/products/gLiveSupport/doc/.keepme delete mode 100644 src/products/gLiveSupport/etc/Makefile.in delete mode 100644 src/products/gLiveSupport/etc/acinclude.m4 delete mode 100644 src/products/gLiveSupport/etc/audioPlayer.xml delete mode 100644 src/products/gLiveSupport/etc/authenticationClient.xml delete mode 100644 src/products/gLiveSupport/etc/authenticationClient.xml.user-template delete mode 100644 src/products/gLiveSupport/etc/campcaster-studio.xml delete mode 100644 src/products/gLiveSupport/etc/campcaster-studio.xml.template delete mode 100644 src/products/gLiveSupport/etc/campcaster-studio.xml.user-template delete mode 100644 src/products/gLiveSupport/etc/configure.ac delete mode 100644 src/products/gLiveSupport/etc/doxygen.config delete mode 100644 src/products/gLiveSupport/etc/keyboardShortcut.xml delete mode 100644 src/products/gLiveSupport/etc/storageClient.xml delete mode 100644 src/products/gLiveSupport/etc/storageClient.xml.user-template delete mode 100644 src/products/gLiveSupport/etc/testResultToHtml.xsl delete mode 100644 src/products/gLiveSupport/lib/.keepme delete mode 100644 src/products/gLiveSupport/src/AdvancedSearchEntry.cxx delete mode 100644 src/products/gLiveSupport/src/AdvancedSearchEntry.h delete mode 100644 src/products/gLiveSupport/src/AdvancedSearchItem.cxx delete mode 100644 src/products/gLiveSupport/src/AdvancedSearchItem.h delete mode 100644 src/products/gLiveSupport/src/AudioPlayerTest.cxx delete mode 100644 src/products/gLiveSupport/src/AudioPlayerTest.h delete mode 100644 src/products/gLiveSupport/src/BackupList.cxx delete mode 100644 src/products/gLiveSupport/src/BackupList.h delete mode 100644 src/products/gLiveSupport/src/BackupView.cxx delete mode 100644 src/products/gLiveSupport/src/BackupView.h delete mode 100644 src/products/gLiveSupport/src/BrowseEntry.cxx delete mode 100644 src/products/gLiveSupport/src/BrowseEntry.h delete mode 100644 src/products/gLiveSupport/src/BrowseItem.cxx delete mode 100644 src/products/gLiveSupport/src/BrowseItem.h delete mode 100644 src/products/gLiveSupport/src/ContentsStorable.h delete mode 100644 src/products/gLiveSupport/src/CuePlayer.cxx delete mode 100644 src/products/gLiveSupport/src/CuePlayer.h delete mode 100644 src/products/gLiveSupport/src/DateTimeChooserWindow.cxx delete mode 100644 src/products/gLiveSupport/src/DateTimeChooserWindow.h delete mode 100644 src/products/gLiveSupport/src/DndMethods.cxx delete mode 100644 src/products/gLiveSupport/src/DndMethods.h delete mode 100644 src/products/gLiveSupport/src/ExportFormatRadioButtons.cxx delete mode 100644 src/products/gLiveSupport/src/ExportFormatRadioButtons.h delete mode 100644 src/products/gLiveSupport/src/ExportPlaylistWindow.cxx delete mode 100644 src/products/gLiveSupport/src/ExportPlaylistWindow.h delete mode 100644 src/products/gLiveSupport/src/GLiveSupport.cxx delete mode 100644 src/products/gLiveSupport/src/GLiveSupport.h delete mode 100644 src/products/gLiveSupport/src/GLiveSupportTest.cxx delete mode 100644 src/products/gLiveSupport/src/GLiveSupportTest.h delete mode 100644 src/products/gLiveSupport/src/GuiComponent.cxx delete mode 100644 src/products/gLiveSupport/src/GuiComponent.h delete mode 100644 src/products/gLiveSupport/src/GuiObject.cxx delete mode 100644 src/products/gLiveSupport/src/GuiObject.h delete mode 100644 src/products/gLiveSupport/src/GuiWindow.cxx delete mode 100644 src/products/gLiveSupport/src/GuiWindow.h delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcut.cxx delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcut.h delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcutContainer.cxx delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcutContainer.h delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcutList.cxx delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcutList.h delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcutTest.cxx delete mode 100644 src/products/gLiveSupport/src/KeyboardShortcutTest.h delete mode 100644 src/products/gLiveSupport/src/LiveModeWindow.cxx delete mode 100644 src/products/gLiveSupport/src/LiveModeWindow.h delete mode 100644 src/products/gLiveSupport/src/LoginWindow.cxx delete mode 100644 src/products/gLiveSupport/src/LoginWindow.h delete mode 100644 src/products/gLiveSupport/src/MasterPanelWindow.cxx delete mode 100644 src/products/gLiveSupport/src/MasterPanelWindow.h delete mode 100644 src/products/gLiveSupport/src/NowPlaying.cxx delete mode 100644 src/products/gLiveSupport/src/NowPlaying.h delete mode 100644 src/products/gLiveSupport/src/OptionsWindow.cxx delete mode 100644 src/products/gLiveSupport/src/OptionsWindow.h delete mode 100644 src/products/gLiveSupport/src/PlaylistWindow.cxx delete mode 100644 src/products/gLiveSupport/src/PlaylistWindow.h delete mode 100644 src/products/gLiveSupport/src/RdsEntry.cxx delete mode 100644 src/products/gLiveSupport/src/RdsEntry.h delete mode 100644 src/products/gLiveSupport/src/RdsView.cxx delete mode 100644 src/products/gLiveSupport/src/RdsView.h delete mode 100644 src/products/gLiveSupport/src/RestoreBackupWindow.cxx delete mode 100644 src/products/gLiveSupport/src/RestoreBackupWindow.h delete mode 100644 src/products/gLiveSupport/src/SchedulePlaylistWindow.cxx delete mode 100644 src/products/gLiveSupport/src/SchedulePlaylistWindow.h delete mode 100644 src/products/gLiveSupport/src/SchedulerWindow.cxx delete mode 100644 src/products/gLiveSupport/src/SchedulerWindow.h delete mode 100644 src/products/gLiveSupport/src/ScratchpadWindow.cxx delete mode 100644 src/products/gLiveSupport/src/ScratchpadWindow.h delete mode 100644 src/products/gLiveSupport/src/SearchWindow.cxx delete mode 100644 src/products/gLiveSupport/src/SearchWindow.h delete mode 100644 src/products/gLiveSupport/src/TaskbarIcons.cxx delete mode 100644 src/products/gLiveSupport/src/TaskbarIcons.h delete mode 100644 src/products/gLiveSupport/src/TestRunner.cxx delete mode 100644 src/products/gLiveSupport/src/TransportList.cxx delete mode 100644 src/products/gLiveSupport/src/TransportList.h delete mode 100644 src/products/gLiveSupport/src/UploadFileWindow.cxx delete mode 100644 src/products/gLiveSupport/src/UploadFileWindow.h delete mode 100644 src/products/gLiveSupport/src/main.cxx delete mode 100644 src/products/gLiveSupport/tmp/.keepme delete mode 100644 src/products/gLiveSupport/var/.keepme delete mode 100644 src/products/gLiveSupport/var/campcaster.png delete mode 100644 src/products/gLiveSupport/var/en.txt delete mode 100644 src/products/gLiveSupport/var/es.txt delete mode 100644 src/products/gLiveSupport/var/fr.txt delete mode 100644 src/products/gLiveSupport/var/glade/DateTimeChooserWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/ExportPlaylistWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/GLiveSupport.glade delete mode 100644 src/products/gLiveSupport/var/glade/LiveModeWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/LoginWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/MasterPanelWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/OptionsWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/PlaylistWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/RestoreBackupWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/SchedulePlaylistWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/SchedulerWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/ScratchpadWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/SearchWindow.glade delete mode 100644 src/products/gLiveSupport/var/glade/UploadFileWindow.glade delete mode 100644 src/products/gLiveSupport/var/hu.txt delete mode 100644 src/products/gLiveSupport/var/icon16.png delete mode 100644 src/products/gLiveSupport/var/icon22.png delete mode 100644 src/products/gLiveSupport/var/icon32.png delete mode 100644 src/products/gLiveSupport/var/icon48.png delete mode 100644 src/products/gLiveSupport/var/nl.txt delete mode 100644 src/products/gLiveSupport/var/pl.txt delete mode 100644 src/products/gLiveSupport/var/root.txt delete mode 100644 src/products/gLiveSupport/var/sr_CS.txt delete mode 100644 src/products/gLiveSupport/var/sr_CS_CYRILLIC.txt delete mode 100644 src/products/gLiveSupport/var/stationLogo.png delete mode 100644 src/products/gLiveSupport/var/sv.txt delete mode 100644 src/products/gLiveSupport/var/testAudio.ogg delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/bottom.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/bottomLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/bottomRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/top.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/topLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/blueBin/topRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/center.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/centerGray.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/centerRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/centerSel.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/leftGray.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/leftRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/leftSel.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/rightGray.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/rightRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/button/rightSel.png delete mode 100644 src/products/gLiveSupport/var/widgets/combo/center.png delete mode 100644 src/products/gLiveSupport/var/widgets/combo/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/combo/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/bottom.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/bottomLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/bottomRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/top.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/topLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/darkBlueBin/topRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/bottom.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/bottomLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/bottomRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/top.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/topLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/entryBin/topRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/icons/audioClipIcon.png delete mode 100644 src/products/gLiveSupport/var/widgets/icons/playlistIcon.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/delete.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/deleteRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/hugePlay.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/hugePlayRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/masterPause.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/masterPauseRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/masterPlay.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/masterPlayRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/masterStop.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/masterStopRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/minus.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/minusRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/plus.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/plusRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/smallPause.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/smallPauseRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/smallPlay.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/smallPlayRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/smallStop.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/smallStopRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/windowClose.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/windowCloseRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/windowMax.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/windowMaxRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/windowMin.png delete mode 100644 src/products/gLiveSupport/var/widgets/imageButton/windowMinRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/center.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/centerGray.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/centerRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/centerSel.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/leftGray.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/leftRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/leftSel.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/rightGray.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/rightRoll.png delete mode 100644 src/products/gLiveSupport/var/widgets/tabButton/rightSel.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/bottom.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/bottomLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/bottomRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/left.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/resize.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/right.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/top.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/topLeft.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/topRight.png delete mode 100644 src/products/gLiveSupport/var/widgets/whiteWindow/windowTitleLogo.png delete mode 100755 src/products/scheduler/bin/autogen.sh delete mode 100755 src/products/scheduler/bin/campcaster-scheduler.sh delete mode 100755 src/products/scheduler/bin/campcaster-scheduler_devenv.sh delete mode 100755 src/products/scheduler/bin/createDatabase.sh delete mode 100755 src/products/scheduler/bin/createOdbcDataSource.sh delete mode 100755 src/products/scheduler/bin/gen_coverage_data.sh delete mode 100755 src/products/scheduler/bin/run_tests.sh delete mode 100755 src/products/scheduler/configure delete mode 100644 src/products/scheduler/doc/doxygen/.keepme delete mode 100644 src/products/scheduler/doc/model/SchedulerModel.zuml delete mode 100644 src/products/scheduler/etc/Makefile.in delete mode 100644 src/products/scheduler/etc/acinclude.m4 delete mode 100644 src/products/scheduler/etc/authenticationClient.xml delete mode 100644 src/products/scheduler/etc/campcaster-scheduler-local.xml delete mode 100644 src/products/scheduler/etc/campcaster-scheduler.xml delete mode 100644 src/products/scheduler/etc/campcaster-scheduler.xml.template delete mode 100644 src/products/scheduler/etc/configure.ac delete mode 100644 src/products/scheduler/etc/connectionManagerFactory.xml delete mode 100644 src/products/scheduler/etc/doxygen.config delete mode 100644 src/products/scheduler/etc/odbc_template delete mode 100644 src/products/scheduler/etc/odbc_test_template delete mode 100644 src/products/scheduler/etc/odbcinst_new_debian_template delete mode 100644 src/products/scheduler/etc/odbcinst_old_debian_template delete mode 100644 src/products/scheduler/etc/odbcinst_template delete mode 100644 src/products/scheduler/etc/playLogFactory.xml delete mode 100644 src/products/scheduler/etc/playlist.xml delete mode 100644 src/products/scheduler/etc/scheduleFactory.xml delete mode 100644 src/products/scheduler/etc/storageClient.xml delete mode 100644 src/products/scheduler/etc/testAuthenticationClient.xml delete mode 100644 src/products/scheduler/etc/testResultToHtml.xsl delete mode 100644 src/products/scheduler/etc/testStorageClient.xml delete mode 100644 src/products/scheduler/etc/webAuthenticationClient.xml delete mode 100644 src/products/scheduler/etc/webStorageClient.xml delete mode 100644 src/products/scheduler/src/BackupFactory.cxx delete mode 100644 src/products/scheduler/src/BackupFactory.h delete mode 100644 src/products/scheduler/src/BackupInterface.h delete mode 100644 src/products/scheduler/src/BaseTestMethod.cxx delete mode 100644 src/products/scheduler/src/BaseTestMethod.h delete mode 100644 src/products/scheduler/src/CreateBackupCheckMethod.cxx delete mode 100644 src/products/scheduler/src/CreateBackupCheckMethod.h delete mode 100644 src/products/scheduler/src/CreateBackupCloseMethod.cxx delete mode 100644 src/products/scheduler/src/CreateBackupCloseMethod.h delete mode 100644 src/products/scheduler/src/CreateBackupOpenMethod.cxx delete mode 100644 src/products/scheduler/src/CreateBackupOpenMethod.h delete mode 100644 src/products/scheduler/src/DisplayScheduleMethod.cxx delete mode 100644 src/products/scheduler/src/DisplayScheduleMethod.h delete mode 100644 src/products/scheduler/src/DisplayScheduleMethodTest.cxx delete mode 100644 src/products/scheduler/src/DisplayScheduleMethodTest.h delete mode 100644 src/products/scheduler/src/GeneratePlayReportMethod.cxx delete mode 100644 src/products/scheduler/src/GeneratePlayReportMethod.h delete mode 100644 src/products/scheduler/src/GeneratePlayReportMethodTest.cxx delete mode 100644 src/products/scheduler/src/GeneratePlayReportMethodTest.h delete mode 100644 src/products/scheduler/src/GetSchedulerTimeMethod.cxx delete mode 100644 src/products/scheduler/src/GetSchedulerTimeMethod.h delete mode 100644 src/products/scheduler/src/GetSchedulerTimeMethodTest.cxx delete mode 100644 src/products/scheduler/src/GetSchedulerTimeMethodTest.h delete mode 100644 src/products/scheduler/src/GetVersionMethod.cxx delete mode 100644 src/products/scheduler/src/GetVersionMethod.h delete mode 100644 src/products/scheduler/src/GetVersionMethodTest.cxx delete mode 100644 src/products/scheduler/src/GetVersionMethodTest.h delete mode 100644 src/products/scheduler/src/LoginMethod.cxx delete mode 100644 src/products/scheduler/src/LoginMethod.h delete mode 100644 src/products/scheduler/src/LogoutMethod.cxx delete mode 100644 src/products/scheduler/src/LogoutMethod.h delete mode 100644 src/products/scheduler/src/PlayLogFactory.cxx delete mode 100644 src/products/scheduler/src/PlayLogFactory.h delete mode 100644 src/products/scheduler/src/PlayLogInterface.h delete mode 100644 src/products/scheduler/src/PlaylistEvent.cxx delete mode 100644 src/products/scheduler/src/PlaylistEvent.h delete mode 100644 src/products/scheduler/src/PlaylistEventContainer.cxx delete mode 100644 src/products/scheduler/src/PlaylistEventContainer.h delete mode 100644 src/products/scheduler/src/PlaylistEventContainerTest.cxx delete mode 100644 src/products/scheduler/src/PlaylistEventContainerTest.h delete mode 100644 src/products/scheduler/src/PlaylistEventTest.cxx delete mode 100644 src/products/scheduler/src/PlaylistEventTest.h delete mode 100644 src/products/scheduler/src/PostgresqlBackup.cxx delete mode 100644 src/products/scheduler/src/PostgresqlBackup.h delete mode 100644 src/products/scheduler/src/PostgresqlBackupTest.cxx delete mode 100644 src/products/scheduler/src/PostgresqlBackupTest.h delete mode 100644 src/products/scheduler/src/PostgresqlPlayLog.cxx delete mode 100644 src/products/scheduler/src/PostgresqlPlayLog.h delete mode 100644 src/products/scheduler/src/PostgresqlPlayLogTest.cxx delete mode 100644 src/products/scheduler/src/PostgresqlPlayLogTest.h delete mode 100644 src/products/scheduler/src/PostgresqlSchedule.cxx delete mode 100644 src/products/scheduler/src/PostgresqlSchedule.h delete mode 100644 src/products/scheduler/src/PostgresqlScheduleTest.cxx delete mode 100644 src/products/scheduler/src/PostgresqlScheduleTest.h delete mode 100644 src/products/scheduler/src/RemoveFromScheduleMethod.cxx delete mode 100644 src/products/scheduler/src/RemoveFromScheduleMethod.h delete mode 100644 src/products/scheduler/src/RemoveFromScheduleMethodTest.cxx delete mode 100644 src/products/scheduler/src/RemoveFromScheduleMethodTest.h delete mode 100644 src/products/scheduler/src/RescheduleMethod.cxx delete mode 100644 src/products/scheduler/src/RescheduleMethod.h delete mode 100644 src/products/scheduler/src/RescheduleMethodTest.cxx delete mode 100644 src/products/scheduler/src/RescheduleMethodTest.h delete mode 100644 src/products/scheduler/src/ResetStorageMethod.cxx delete mode 100644 src/products/scheduler/src/ResetStorageMethod.h delete mode 100644 src/products/scheduler/src/ResetStorageMethodTest.cxx delete mode 100644 src/products/scheduler/src/ResetStorageMethodTest.h delete mode 100644 src/products/scheduler/src/RestoreBackupMethod.cxx delete mode 100644 src/products/scheduler/src/RestoreBackupMethod.h delete mode 100644 src/products/scheduler/src/RpcBackupTest.cxx delete mode 100644 src/products/scheduler/src/RpcBackupTest.h delete mode 100644 src/products/scheduler/src/RpcDisplayScheduleTest.cxx delete mode 100644 src/products/scheduler/src/RpcDisplayScheduleTest.h delete mode 100644 src/products/scheduler/src/RpcGeneratePlayReportTest.cxx delete mode 100644 src/products/scheduler/src/RpcGeneratePlayReportTest.h delete mode 100644 src/products/scheduler/src/RpcGetSchedulerTimeTest.cxx delete mode 100644 src/products/scheduler/src/RpcGetSchedulerTimeTest.h delete mode 100644 src/products/scheduler/src/RpcGetVersionTest.cxx delete mode 100644 src/products/scheduler/src/RpcGetVersionTest.h delete mode 100644 src/products/scheduler/src/RpcRemoveFromScheduleTest.cxx delete mode 100644 src/products/scheduler/src/RpcRemoveFromScheduleTest.h delete mode 100644 src/products/scheduler/src/RpcRescheduleTest.cxx delete mode 100644 src/products/scheduler/src/RpcRescheduleTest.h delete mode 100644 src/products/scheduler/src/RpcStopCurrentlyPlayingTest.cxx delete mode 100644 src/products/scheduler/src/RpcStopCurrentlyPlayingTest.h delete mode 100644 src/products/scheduler/src/RpcUploadPlaylistTest.cxx delete mode 100644 src/products/scheduler/src/RpcUploadPlaylistTest.h delete mode 100644 src/products/scheduler/src/ScheduleFactory.cxx delete mode 100644 src/products/scheduler/src/ScheduleFactory.h delete mode 100644 src/products/scheduler/src/ScheduleInterface.h delete mode 100644 src/products/scheduler/src/SchedulerDaemon.cxx delete mode 100644 src/products/scheduler/src/SchedulerDaemon.h delete mode 100644 src/products/scheduler/src/SchedulerDaemonTest.cxx delete mode 100644 src/products/scheduler/src/SchedulerDaemonTest.h delete mode 100644 src/products/scheduler/src/SignalDispatcher.cxx delete mode 100644 src/products/scheduler/src/SignalDispatcher.h delete mode 100644 src/products/scheduler/src/SignalHandler.h delete mode 100644 src/products/scheduler/src/StopCurrentlyPlayingMethod.cxx delete mode 100644 src/products/scheduler/src/StopCurrentlyPlayingMethod.h delete mode 100644 src/products/scheduler/src/TestRunner.cxx delete mode 100644 src/products/scheduler/src/UploadPlaylistMethod.cxx delete mode 100644 src/products/scheduler/src/UploadPlaylistMethod.h delete mode 100644 src/products/scheduler/src/UploadPlaylistMethodTest.cxx delete mode 100644 src/products/scheduler/src/UploadPlaylistMethodTest.h delete mode 100644 src/products/scheduler/src/XmlRpcDaemon.cxx delete mode 100644 src/products/scheduler/src/XmlRpcDaemon.h delete mode 100644 src/products/scheduler/src/XmlRpcDaemonShutdownSignalHandler.h delete mode 100644 src/products/scheduler/src/main.cxx delete mode 100644 src/products/scheduler/tmp/.keepme delete mode 100644 src/products/scheduler/var/test1.mp3 delete mode 100644 src/products/scheduler/var/test2.mp3 delete mode 100755 src/tools/libodbc++/libodbc++-0.2.5/bin/autogen.sh delete mode 100755 src/tools/libodbc++/libodbc++-0.2.5/bin/prepare.sh delete mode 100755 src/tools/libodbc++/libodbc++-0.2.5/configure delete mode 100644 src/tools/libodbc++/libodbc++-0.2.5/etc/Makefile.in delete mode 100644 src/tools/libodbc++/libodbc++-0.2.5/etc/configure.ac delete mode 100644 src/tools/libodbc++/libodbc++-0.2.5/etc/libodbc++-add-cstdio-include.patch delete mode 100644 src/tools/libodbc++/libodbc++-0.2.5/src/libodbc++-0.2.5.tar.bz2 delete mode 100644 src/tools/libodbc++/libodbc++-0.2.5/tmp/.keepme delete mode 100755 src/tools/taglib/taglib-1.5/bin/autogen.sh delete mode 100755 src/tools/taglib/taglib-1.5/bin/prepare.sh delete mode 100755 src/tools/taglib/taglib-1.5/configure delete mode 100644 src/tools/taglib/taglib-1.5/etc/Makefile.in delete mode 100644 src/tools/taglib/taglib-1.5/etc/configure.ac delete mode 100644 src/tools/taglib/taglib-1.5/etc/taglib-1.5-length-in-microseconds.patch delete mode 100644 src/tools/taglib/taglib-1.5/src/taglib-1.5.tar.gz delete mode 100644 src/tools/taglib/taglib-1.5/tmp/.keepme delete mode 100755 src/tools/xmlrpc++/xmlrpc++-20040713/bin/autogen.sh delete mode 100755 src/tools/xmlrpc++/xmlrpc++-20040713/bin/prepare.sh delete mode 100755 src/tools/xmlrpc++/xmlrpc++-20040713/configure delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/etc/Makefile.in delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/etc/configure.ac delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/etc/incorrect_XmlRpcValue_struct_tm_conversion.patch delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/etc/uninitialised_XmlRpcSource_ssl_ssl.patch delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/etc/xmlrpc++-automake.patch delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/src/xmlrpc++-20040713.tar.gz delete mode 100644 src/tools/xmlrpc++/xmlrpc++-20040713/tmp/.keepme diff --git a/src/modules/authentication/bin/autogen.sh b/src/modules/authentication/bin/autogen.sh deleted file mode 100755 index ab010fe7d..000000000 --- a/src/modules/authentication/bin/autogen.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="Authentication" - -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -echo " aclocal $ACLOCAL_FLAGS" -cp -f ${configure_ac} ${tmpdir} -cp -f ${etcdir}/acinclude.m4 ${tmpdir} -aclocal $ACLOCAL_FLAGS - -echo " autoheader ${configure_ac}" -autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/modules/authentication/bin/gen_coverage_data.sh b/src/modules/authentication/bin/gen_coverage_data.sh deleted file mode 100755 index d3ed74d3b..000000000 --- a/src/modules/authentication/bin/gen_coverage_data.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script generates code coverage data for the module -#------------------------------------------------------------------------------- -module="Campcaster Authentication" - -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -docdir=$basedir/doc -tmpdir=$basedir/tmp - -usrdir=`cd $basedir/../../../usr; pwd;` - -coverage_report_dir=$docdir/coverage - -raw_coverage_file=$tmpdir/raw_coverage.info -coverage_file=$tmpdir/coverage.info - -lcov=$usrdir/bin/lcov -genhtml=$usrdir/bin/genhtml - - -cd $basedir - -#------------------------------------------------------------------------------- -# Re-configure with covarege collection enabled, compile and run the tests -#------------------------------------------------------------------------------- -$bindir/autogen.sh --enable-coverage -make clean -make check - -#------------------------------------------------------------------------------- -# Generate some symlinks so that the sources are visible from tmpdir -#------------------------------------------------------------------------------- -ln -s $basedir/include $tmpdir/include -ln -s $basedir/src $tmpdir/src - - -#------------------------------------------------------------------------------- -# Use lcov to generate an HTML report on the coverage data -#------------------------------------------------------------------------------- -$lcov -d $tmpdir -c > $raw_coverage_file -$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file -rm -rf $coverage_report_dir -mkdir -p $coverage_report_dir -$genhtml -t "$module" -o $coverage_report_dir $coverage_file - - -#------------------------------------------------------------------------------- -# Clean up -#------------------------------------------------------------------------------- -rm -f $tmpdir/include -rm -f $tmpdir/src diff --git a/src/modules/authentication/configure b/src/modules/authentication/configure deleted file mode 100755 index abb0fa62e..000000000 --- a/src/modules/authentication/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen "$@") -fi - -(cd $tmpdir && $configure "$@") - diff --git a/src/modules/authentication/doc/.keepme b/src/modules/authentication/doc/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/authentication/doc/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/authentication/etc/Makefile.in b/src/modules/authentication/etc/Makefile.in deleted file mode 100644 index 4199c2f85..000000000 --- a/src/modules/authentication/etc/Makefile.in +++ /dev/null @@ -1,176 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# @configure_input@ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -CP = cp -f - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -BASE_DIR = @builddir@ -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -ETC_DIR = ${BASE_DIR}/etc -INCLUDE_DIR = ${BASE_DIR}/include -LIB_DIR = ${BASE_DIR}/lib -SRC_DIR = ${BASE_DIR}/src -TMP_DIR = ${BASE_DIR}/tmp - -prefix = @prefix@ - -USR_DIR = ${prefix} -USR_INCLUDE_DIR = ${USR_DIR}/include -USR_LIB_DIR = ${USR_DIR}/lib - -MODULES_DIR = ${BASE_DIR}/.. - -CORE_DIR = ${MODULES_DIR}/core -CORE_INCLUDE_DIR = ${CORE_DIR}/include -CORE_LIB_DIR = ${CORE_DIR}/lib -CORE_LIB = livesupport_core -CORE_LIB_FILE = ${CORE_LIB_DIR}/lib${CORE_LIB}.a - -STORAGE_SERVER_DIR = ${MODULES_DIR}/storageServer - -VPATH = ${SRC_DIR} - -LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ -LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ - -TEST_RESULTS = ${DOC_DIR}/testResults.xml -# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR -TEST_XSLT = ../etc/testResultToHtml.xsl - -AUTHENTICATION_LIB = livesupport_authentication -AUTHENTICATION_LIB_FILE = ${LIB_DIR}/lib${AUTHENTICATION_LIB}.a -TEST_RUNNER = ${TMP_DIR}/testRunner - -DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config - -export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} - - -#------------------------------------------------------------------------------- -# Configuration parameters -#------------------------------------------------------------------------------- -CPPFLAGS = @CPPFLAGS@ -CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ - -pedantic -Wall -Wno-long-long \ - ${LIBXMLPP_CFLAGS} \ - -I${USR_INCLUDE_DIR} \ - -I${CORE_INCLUDE_DIR} \ - -I${INCLUDE_DIR} -I${TMP_DIR} -LDFLAGS = @LDFLAGS@ -pthread \ - ${LIBXMLPP_LIBS} \ - -L${USR_LIB_DIR} \ - -L${CORE_LIB_DIR} \ - -L${LIB_DIR} - - -#------------------------------------------------------------------------------- -# Dependencies -#------------------------------------------------------------------------------- -AUTHENTICATION_LIB_OBJS = ${TMP_DIR}/AuthenticationClientFactory.o \ - ${TMP_DIR}/TestAuthenticationClient.o \ - ${TMP_DIR}/WebAuthenticationClient.o - -TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ - ${TMP_DIR}/TestAuthenticationClientTest.o \ - ${TMP_DIR}/WebAuthenticationClientTest.o \ - ${TMP_DIR}/AuthenticationClientFactoryTest.o - -TEST_RUNNER_LIBS = -l${AUTHENTICATION_LIB} -l${CORE_LIB} \ - -lcppunit -ldl -lxmlrpc++ -lssl - - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -.PHONY: all dir_setup doc clean docclean depclean distclean check install - -all: dir_setup ${AUTHENTICATION_LIB_FILE} - -dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} - -doc: - ${DOXYGEN} ${DOXYGEN_CONFIG} - -clean: - ${RM} ${AUTHENTICATION_LIB_OBJS} ${AUTHENTICATION_LIB_FILE} - ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER} - ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info - -docclean: - ${RMDIR} ${DOXYGEN_DIR}/html - ${RMDIR} ${COVERAGE_DIR}/* - ${RM} ${TEST_RESULTS} - -depclean: clean - -distclean: clean docclean - ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 - -check: all ${TEST_RUNNER} - ${MAKE} -C ${STORAGE_SERVER_DIR} - ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} - -install: all - ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/Authentication - ${CP} ${INCLUDE_DIR}/LiveSupport/Authentication/*.h \ - ${USR_INCLUDE_DIR}/LiveSupport/Authentication - ${CP} ${AUTHENTICATION_LIB_FILE} ${USR_LIB_DIR} - - -#------------------------------------------------------------------------------- -# Specific targets -#------------------------------------------------------------------------------- -${AUTHENTICATION_LIB_FILE}: ${AUTHENTICATION_LIB_OBJS} - ${AR} crus $@ $^ - -${TMP_DIR}: - ${MKDIR} ${TMP_DIR} - -${DOXYGEN_DIR}: - ${MKDIR} ${DOXYGEN_DIR} - -${TEST_RUNNER}: ${CORE_LIB_FILE} ${TEST_RUNNER_OBJS} ${AUTHENTICATION_LIB_FILE} - ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} - -${CORE_LIB_FILE}: - ${MAKE} -C ${CORE_DIR} - - -#------------------------------------------------------------------------------- -# Pattern rules -#------------------------------------------------------------------------------- -${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx - ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< - diff --git a/src/modules/authentication/etc/acinclude.m4 b/src/modules/authentication/etc/acinclude.m4 deleted file mode 100644 index 83e8ed1c0..000000000 --- a/src/modules/authentication/etc/acinclude.m4 +++ /dev/null @@ -1,87 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl Macro to check for available modules using pkg-conf -dnl -dnl usage: -dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) -dnl -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -dnl -dnl This function was taken from the glade-- project -dnl----------------------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - - diff --git a/src/modules/authentication/etc/authenticationClient.xml b/src/modules/authentication/etc/authenticationClient.xml deleted file mode 100644 index 7a1580f07..000000000 --- a/src/modules/authentication/etc/authenticationClient.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - -]> - - - - - diff --git a/src/modules/authentication/etc/configure.ac b/src/modules/authentication/etc/configure.ac deleted file mode 100644 index 648a654e8..000000000 --- a/src/modules/authentication/etc/configure.ac +++ /dev/null @@ -1,104 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(Authentication, 0.0, support@sourcefabric.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../src/AuthenticationClientFactory.cxx) - -AC_CONFIG_HEADERS(configure.h) -AC_PROG_CXX() - -AC_CHECK_HEADERS(getopt.h) - - -dnl----------------------------------------------------------------------------- -dnl specify whether debug info should be compiled into the executable -dnl----------------------------------------------------------------------------- -AC_SUBST(CXXFLAGS) - -AC_ARG_ENABLE([debug], - AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), - [], - [enable_debug=no]) - -if test "x${enable_debug}" = "xyes"; then - CXXFLAGS="-g -O0" - AC_DEFINE( YDEBUG, 1, [Debug is on] ) -else - CXXFLAGS="-O3" -fi - - -AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the pkg-config path -dnl----------------------------------------------------------------------------- -AC_ARG_WITH([pkg-config-path], - AC_HELP_STRING([--with-pkg-config-path], - [use the pkg-config path (prefix/lib/pkgconfig)]), - [PKG_CONFIG_PATH=${withval}], - [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig:$PKG_CONFIG_PATH]) - -AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) - -export PKG_CONFIG_PATH - -export PATH=${prefix}/bin:${PATH} - - -PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) -AC_SUBST(LIBXMLPP_CFLAGS) -AC_SUBST(LIBXMLPP_LIBS) - - -dnl----------------------------------------------------------------------------- -dnl enable compilaton for code coverage data -dnl----------------------------------------------------------------------------- -AC_SUBST(COVERAGE_CXXFLAGS) - -AC_ARG_ENABLE( coverage, -[ --enable-coverage enable code coverage data generaton (no) ], - ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) - -if test "x${ENABLE_COVERAGE}" == "xyes" ; then - COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" - AC_MSG_RESULT([compiling in code coverage mode]) -else - AC_MSG_RESULT([not compiling in code coverage mode]) -fi - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() diff --git a/src/modules/authentication/etc/doxygen.config b/src/modules/authentication/etc/doxygen.config deleted file mode 100644 index 71bbba6e4..000000000 --- a/src/modules/authentication/etc/doxygen.config +++ /dev/null @@ -1,1140 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -# Doxyfile 1.3.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Campcaster - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/doxygen - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is used -# as the annotated text. Otherwise, the brief description is used as-is. If left -# blank, the following values are used ("$name" is automatically replaced with the -# name of the entity): "The $name class" "The $name widget" "The $name file" -# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = YES - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = include src - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - -INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = include - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superseded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/src/modules/authentication/etc/testAuthentication.xml b/src/modules/authentication/etc/testAuthentication.xml deleted file mode 100644 index 581498e59..000000000 --- a/src/modules/authentication/etc/testAuthentication.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - -]> - - - diff --git a/src/modules/authentication/etc/webAuthentication.xml b/src/modules/authentication/etc/webAuthentication.xml deleted file mode 100644 index c10f709e7..000000000 --- a/src/modules/authentication/etc/webAuthentication.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - -]> - - - diff --git a/src/modules/authentication/etc/webAuthentication.xml.template b/src/modules/authentication/etc/webAuthentication.xml.template deleted file mode 100644 index c5bd5dd13..000000000 --- a/src/modules/authentication/etc/webAuthentication.xml.template +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - -]> - - - diff --git a/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h b/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h deleted file mode 100644 index f960c244c..000000000 --- a/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h +++ /dev/null @@ -1,187 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Authentication_AuthenticationClientFactory_h -#define LiveSupport_Authentication_AuthenticationClientFactory_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" - - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The factory to create AuthenticationClientInterface objects. - * - * This object has to be configured with an XML configuration element - * called authenticationClientFactory. This element contains a child element - * specifying and configuring the kind of AuthenticationClient that the - * factory builds. This client is either a TestAuthenticationClient or - * a WebAuthenticationClient, and the child element name is either - * testAuthentication or webAuthentication, correspondingly. - * - * An authenticationClientFactory configuration element may look like - * the following: - * - *

- *  <authenticationClientFactory>
- *      <webAuthentication>
- *          ...
- *      </webAuthentication>
- *  </authenticationClientFactory>
- *  
- * - * For detais of the testAuthentication and webAuthentication elements, see the - * documentation for the TestAuthenticationClient and WebAuthenticationClient - * classes. - * - * The DTD for the above element is: - * - *

- *  <!ELEMENT authenticationClientFactory (testAuthentication|
- *                                         webAuthentication) >
- *  
- * - * @see TestAuthenticationClient - * @see WebAuthenticationClient - */ -class AuthenticationClientFactory : - virtual public Configurable -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The authentication client created by this factory. - */ - Ptr::Ref authenticationClient; - - /** - * The default constructor. - */ - AuthenticationClientFactory(void) throw() - { - } - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~AuthenticationClientFactory(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Return an authentication client. - * - * @return the appropriate authentication client, according to the - * configuration of this factory. - */ - Ptr::Ref - getAuthenticationClient(void) throw () - { - return authenticationClient; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // LiveSupport_Authentication_AuthenticationClientFactory_h - diff --git a/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h b/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h deleted file mode 100644 index 855d2e381..000000000 --- a/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h +++ /dev/null @@ -1,231 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Authentication_AuthenticationClientInterface_h -#define LiveSupport_Authentication_AuthenticationClientInterface_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "LiveSupport/Core/XmlRpcInvalidArgumentException.h" -#include "LiveSupport/Core/XmlRpcCommunicationException.h" -#include "LiveSupport/Core/XmlRpcMethodFaultException.h" -#include "LiveSupport/Core/XmlRpcMethodResponseException.h" - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An interface for authentication clients. - */ -class AuthenticationClientInterface -{ - public: - - /** - * Return the version string from the storage. - * - * @return the version string of the storage. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - */ - virtual Ptr::Ref - getVersion(void) throw (XmlRpcException) - = 0; - - /** - * Login to the authentication server. - * Returns a new session ID; in case of an error, throws - * AuthenticationException or one of its subclasses. - * Note that an incorrect login or password is considered an error - * and will throw an XmlRpcException (in the case of WebStorageClient, - * an XmlRpcMethodFaultException, which is also an XmlRpcException). - * - * @param login the login to the server - * @param password the password to the server - * @exception XmlRpcCommunicationException problem with performing - * XML-RPC call - * @exception XmlRpcMethodFaultException XML-RPC method returned - * fault response - * @exception XmlRpcMethodResponseException response from XML-RPC - * method is incorrect - * @exception XmlRpcException other error - * (TestAuthenticationClient only) - * @return the new session ID - */ - virtual Ptr::Ref - login(const std::string &login, const std::string &password) - throw (XmlRpcException) - = 0; - - /** - * Logout from the authentication server. - * - * @param sessionId the ID of the session to end - * @exception XmlRpcCommunicationException problem with performing - * XML-RPC call - * @exception XmlRpcMethodFaultException XML-RPC method returned - * fault response - * @exception XmlRpcMethodResponseException response from XML-RPC - * method is incorrect - * @exception XmlRpcException other error - * (TestAuthenticationClient only) - */ - virtual void - logout(Ptr::Ref sessionId) - throw (XmlRpcException) - = 0; - - /** - * Load a `user preferences' item from the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * - * @exception std::invalid_argument - * no such preference key found - * @exception XmlRpcInvalidArgumentException - * bad sessionId argument - * @exception XmlRpcCommunicationException - * problem with performing XML-RPC call - * @exception XmlRpcMethodFaultException - * XML-RPC method returned fault response - * @exception XmlRpcMethodResponseException - * response from XML-RPC method is incorrect - * @exception XmlRpcException other error - * (TestAuthenticationClient only) - */ - virtual Ptr::Ref - loadPreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException, - std::invalid_argument) - = 0; - - /** - * Store a `user preferences' item on the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * @param value the (new) value of the item - * - * @exception XmlRpcInvalidArgumentException - * bad sessionId or value argument - * @exception XmlRpcCommunicationException - * problem with performing XML-RPC call - * @exception XmlRpcMethodFaultException - * XML-RPC method returned fault response - * @exception XmlRpcMethodResponseException - * response from XML-RPC method is incorrect - * @exception XmlRpcException other error - * (TestAuthenticationClient only) - */ - virtual void - savePreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key, - Ptr::Ref value) - throw (XmlRpcException) - = 0; - - /** - * Delete a `user preferences' item from the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * - * @exception XmlRpcInvalidArgumentException - * bad sessionId argument - * @exception XmlRpcCommunicationException - * problem with performing XML-RPC call - * @exception XmlRpcMethodFaultException - * XML-RPC method returned fault response - * @exception XmlRpcMethodResponseException - * response from XML-RPC method is incorrect - * @exception XmlRpcException other error - * (TestAuthenticationClient only) - */ - virtual void - deletePreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException) - = 0; - - /** - * Reset the authentication client. - * Invalidates all active session IDs, and resets the list of - * preferences to its initial (empty) state. - * - * @exception XmlRpcException if the server returns an error. - */ - virtual void - reset(void) - throw (XmlRpcException) - = 0; - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~AuthenticationClientInterface(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // LiveSupport_Authentication_AuthenticationClientInterface_h - diff --git a/src/modules/authentication/lib/.keepme b/src/modules/authentication/lib/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/authentication/lib/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/authentication/src/AuthenticationClientFactory.cxx b/src/modules/authentication/src/AuthenticationClientFactory.cxx deleted file mode 100644 index e8587af94..000000000 --- a/src/modules/authentication/src/AuthenticationClientFactory.cxx +++ /dev/null @@ -1,117 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "TestAuthenticationClient.h" -#include "WebAuthenticationClient.h" - -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string AuthenticationClientFactory::configElementNameStr = - "authenticationClientFactory"; - -/*------------------------------------------------------------------------------ - * The singleton instance of AuthenticationClientFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref AuthenticationClientFactory::singleton; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance to AuthenticationClientFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref -AuthenticationClientFactory :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new AuthenticationClientFactory()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the test authentication client. - *----------------------------------------------------------------------------*/ -void -AuthenticationClientFactory :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - authenticationClient.reset(); - - // try to look for a TestAuthenticationClient configuration element - xmlpp::Node::NodeList nodes = - element.get_children(TestAuthenticationClient::getConfigElementName()); - if (nodes.size() >= 1) { - const xmlpp::Element * configElement = - dynamic_cast (*(nodes.begin())); - Ptr::Ref tac(new TestAuthenticationClient()); - tac->configure(*configElement); - authenticationClient = tac; - return; - } - - // try to look for a WebAuthenticationClient configuration element - nodes = - element.get_children(WebAuthenticationClient::getConfigElementName()); - if (nodes.size() >= 1) { - const xmlpp::Element * configElement = - dynamic_cast (*(nodes.begin())); - Ptr::Ref wac(new WebAuthenticationClient()); - wac->configure(*configElement); - authenticationClient = wac; - return; - } - - throw std::invalid_argument("no authentication client configuration found"); -} - diff --git a/src/modules/authentication/src/AuthenticationClientFactoryTest.cxx b/src/modules/authentication/src/AuthenticationClientFactoryTest.cxx deleted file mode 100644 index 9d34755d9..000000000 --- a/src/modules/authentication/src/AuthenticationClientFactoryTest.cxx +++ /dev/null @@ -1,252 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Core/SessionId.h" -#include "AuthenticationClientFactoryTest.h" - - -using namespace std; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(AuthenticationClientFactoryTest); - -/** - * The name of the configuration file for the authentication client factory. - */ -static const std::string configFileName = "authenticationClient.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -AuthenticationClientFactoryTest :: setUp(void) throw () -{ - Ptr::Ref - acf = AuthenticationClientFactory::getInstance(); - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - configFileName); - const xmlpp::Element * root = document->get_root_node(); - - acf->configure(*root); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -AuthenticationClientFactoryTest :: tearDown(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can log on and off - *----------------------------------------------------------------------------*/ -void -AuthenticationClientFactoryTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref - acf = AuthenticationClientFactory::getInstance(); - Ptr::Ref - authentication = acf->getAuthenticationClient(); - - CPPUNIT_ASSERT_NO_THROW( - authentication->reset() - ); - - Ptr::Ref sessionId; - - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - CPPUNIT_ASSERT(sessionId); - - try { - authentication->logout(sessionId); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can save and load user preferences. - *----------------------------------------------------------------------------*/ -void -AuthenticationClientFactoryTest :: preferencesTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref - acf = AuthenticationClientFactory::getInstance(); - Ptr::Ref - authentication = acf->getAuthenticationClient(); - - CPPUNIT_ASSERT_NO_THROW( - authentication->reset() - ); - - Ptr::Ref sessionId; - Ptr::Ref prefValue; - - // check "please log in" error - try { - prefValue = authentication->loadPreferencesItem(sessionId, "something"); - CPPUNIT_FAIL("Allowed operation without login."); - } catch (XmlRpcException &e) { - } - - // log in - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // check "no such key" error - try { - prefValue = authentication->loadPreferencesItem(sessionId, "eye_color"); - CPPUNIT_FAIL("Retrieved non-existent user preferences item."); - } catch (std::invalid_argument &e) { - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // check normal save and load - prefValue.reset(new const Glib::ustring("chyornye")); - try { - authentication->savePreferencesItem(sessionId, "eye_color", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - Ptr::Ref newPrefValue; - try { - newPrefValue = authentication->loadPreferencesItem(sessionId, "eye_color"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == *prefValue); - - // try some unicode characters - prefValue.reset(new const Glib::ustring("страстные")); - try { - authentication->savePreferencesItem(sessionId, "eye_color", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = authentication->loadPreferencesItem(sessionId, "eye_color"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == "страстные"); - - // check another normal save and load... - prefValue.reset(new const Glib::ustring("ne dobryj")); - try { - authentication->savePreferencesItem(sessionId, "hour", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // ... but now change session ID in the middle - try { - authentication->logout(sessionId); - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = authentication->loadPreferencesItem(sessionId, "hour"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == *prefValue); - - // check the delete method - try { - authentication->deletePreferencesItem(sessionId, "hour"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = authentication->loadPreferencesItem(sessionId, "hour"); - CPPUNIT_FAIL("Allowed to load preference after it was deleted"); - } catch (std::invalid_argument &e) { - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // and log out - try { - authentication->logout(sessionId); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - diff --git a/src/modules/authentication/src/AuthenticationClientFactoryTest.h b/src/modules/authentication/src/AuthenticationClientFactoryTest.h deleted file mode 100644 index 086a54320..000000000 --- a/src/modules/authentication/src/AuthenticationClientFactoryTest.h +++ /dev/null @@ -1,113 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef AuthenticationClientFactoryTest_h -#define AuthenticationClientFactoryTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/BaseTestMethod.h" - -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the AuthenticationClientFactory class. - * - * @see AuthenticationClientFactory - */ -class AuthenticationClientFactoryTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(AuthenticationClientFactoryTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(preferencesTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test saving and load of user preferences. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - preferencesTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // AuthenticationClientFactoryTest_h - diff --git a/src/modules/authentication/src/TestAuthenticationClient.cxx b/src/modules/authentication/src/TestAuthenticationClient.cxx deleted file mode 100644 index fda964705..000000000 --- a/src/modules/authentication/src/TestAuthenticationClient.cxx +++ /dev/null @@ -1,294 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#include -#include -#include -#include - -#include "TestAuthenticationClient.h" - -using namespace boost::posix_time; -using namespace XmlRpc; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ configuration file constants */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string TestAuthenticationClient::configElementNameStr - = "testAuthentication"; - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the config child element for the login and password - *----------------------------------------------------------------------------*/ -const std::string userConfigElementName = "user"; - -/*------------------------------------------------------------------------------ - * The name of the config element attribute for the login - *----------------------------------------------------------------------------*/ -const std::string userLoginAttrName = "login"; - -/*------------------------------------------------------------------------------ - * The name of the config element attribute for the password - *----------------------------------------------------------------------------*/ -const std::string userPasswordAttrName = "password"; - -/*------------------------------------------------------------------------------ - * The dummy sessionId string returned by this authentication client - *----------------------------------------------------------------------------*/ -const std::string dummySessionIdString = "dummySessionId"; - -/*------------------------------------------------------------------------------ - * The version string, returned by getVersion - *----------------------------------------------------------------------------*/ -const std::string versionStr = "TestAuthentication"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the test storage client. - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClient :: configure(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - const xmlpp::Attribute * attribute = 0; - - // read the user data - xmlpp::Node::NodeList childNodes - = element.get_children(userConfigElementName); - xmlpp::Node::NodeList::iterator it = childNodes.begin(); - - if (it == childNodes.end()) { - std::string eMsg = "missing "; - eMsg += userConfigElementName; - eMsg += " XML element"; - throw std::invalid_argument(eMsg); - } - - const xmlpp::Element * userConfigElement - = dynamic_cast (*it); - if (!(attribute = userConfigElement - ->get_attribute(userLoginAttrName))) { - std::string eMsg = "missing attribute "; - eMsg += userLoginAttrName; - throw std::invalid_argument(eMsg); - } - userLogin = attribute->get_value(); - - if (!(attribute = userConfigElement - ->get_attribute(userPasswordAttrName))) { - std::string eMsg = "missing attribute "; - eMsg += userPasswordAttrName; - throw std::invalid_argument(eMsg); - } - userPassword = attribute->get_value(); - - ++it; - if (it != childNodes.end()) { - std::string eMsg = "more than one "; - eMsg += userConfigElementName; - eMsg += " XML element"; - throw std::invalid_argument(eMsg); - } - - versionString.reset(new Glib::ustring(versionStr)); - - sessionIdList.clear(); - sessionCounter = 0; -} - - -/*------------------------------------------------------------------------------ - * Return the version string of the test storage. - *----------------------------------------------------------------------------*/ -Ptr::Ref -TestAuthenticationClient :: getVersion(void) - throw (Core::XmlRpcException) -{ - return versionString; -} - - -/*------------------------------------------------------------------------------ - * Login to the authentication server. - *----------------------------------------------------------------------------*/ -Ptr::Ref -TestAuthenticationClient :: login(const std::string & login, - const std::string & password) - throw (XmlRpcException) -{ - Ptr::Ref sessionId; - - if (login == userLogin && password == userPassword) { - std::stringstream sessionIdStream; - sessionIdStream << dummySessionIdString - << sessionCounter++ - << '-' - << rand(); - sessionIdList.insert(sessionIdStream.str()); - sessionId.reset(new SessionId(sessionIdStream.str())); - return sessionId; - } else { - throw XmlRpcException("incorrect login or password"); - } -} - - -/*------------------------------------------------------------------------------ - * Logout from the authentication server. - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClient :: logout(Ptr::Ref sessionId) - throw (XmlRpcException) -{ - // this returns the number of entries found and erased - if (!sessionId || sessionIdList.erase(sessionId->getId())) { - return; - } else { - throw XmlRpcException("logout() called without previous login()"); - } -} - - -/*------------------------------------------------------------------------------ - * Load a `user preferences' item from the server. - *----------------------------------------------------------------------------*/ -Ptr::Ref -TestAuthenticationClient :: loadPreferencesItem( - Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException, - std::invalid_argument) -{ - if (!sessionId - || sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { - throw XmlRpcException("bad session ID"); - } - - PreferencesType::iterator it; - - if ((it = preferences.find(key)) == preferences.end()) { - throw std::invalid_argument("no such user preferences item"); - } - - Ptr::Ref value(new Glib::ustring(*it->second)); - return value; -} - - -/*------------------------------------------------------------------------------ - * Store a `user preferences' item on the server. - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClient :: savePreferencesItem( - Ptr::Ref sessionId, - const Glib::ustring & key, - Ptr::Ref value) - throw (XmlRpcException) -{ - if (!sessionId - || sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { - throw XmlRpcException("bad session ID"); - } - - if (sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { - throw XmlRpcException("loadPreferences() called before login()"); - } - - preferences[key] = value; -} - - -/*------------------------------------------------------------------------------ - * Delete a `user preferences' item from the server. - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClient :: deletePreferencesItem( - Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException) -{ - if (!sessionId - || sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { - throw XmlRpcException("bad session ID"); - } - - PreferencesType::iterator it; - - if ((it = preferences.find(key)) == preferences.end()) { - throw XmlRpcException("no such user preferences item"); - } - - preferences.erase(it); -} - - -/*------------------------------------------------------------------------------ - * Reset the list of preferences to its initial (empty) state. - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClient :: reset(void) - throw (XmlRpcException) -{ - sessionIdList.clear(); - sessionCounter = 0; - - preferences.clear(); -} - diff --git a/src/modules/authentication/src/TestAuthenticationClient.h b/src/modules/authentication/src/TestAuthenticationClient.h deleted file mode 100644 index c364123e3..000000000 --- a/src/modules/authentication/src/TestAuthenticationClient.h +++ /dev/null @@ -1,280 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef TestAuthenticationClient_h -#define TestAuthenticationClient_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" - - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A dummy authentication client. It only supports one user, whose name and - * password are read from a configuration file. It issues session IDs when - * login() is called, and deletes these session IDs when logout() is called. - * It also stores (key, value) pairs of user preferences for this one user. - * - * This object has to be configured with an XML configuration element - * called testAuthentication. This element contains a child element - * specifying the login and password. - * - * A testAuthentication configuration element may look like the following: - * - *

- *  <testAuthentication>
- *      <user
- *          login="root"
- *          password="q" 
- *      />
- *  </testAuthentication>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT testAuthentication (user) >
- *  <!ELEMENT user EMPTY >
- *  <!ATTLIST user login      CDATA      #REQUIRED >
- *  <!ATTLIST user password   CDATA      #REQUIRED >
- *  
- */ -class TestAuthenticationClient : - virtual public Configurable, - virtual public AuthenticationClientInterface -{ - private: - /** - * The name of the configuration XML elmenent used by - * TestAuthenticationClient - */ - static const std::string configElementNameStr; - - /** - * The version string of the test storage client. - */ - Ptr::Ref versionString; - - /** - * The login name of the (one) authorized test user. - */ - std::string userLogin; - - /** - * The password for the test user. - */ - std::string userPassword; - - /** - * A type for the list of sessionId's. - */ - typedef std::set - SessionIdListType; - - /** - * A list of the sessionId's we have issued. - */ - SessionIdListType sessionIdList; - - /** - * The number of the sessionId's we have issued. - */ - int sessionCounter; - - /** - * A type for the list of user preferences. - */ - typedef std::map::Ref> - PreferencesType; - - /** - * A list of the user preferences items stored. - */ - PreferencesType preferences; - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~TestAuthenticationClient(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the scheduler daemon has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument); - - /** - * Return the version string from the storage. - * - * @return the version string of the storage. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - */ - virtual Ptr::Ref - getVersion(void) throw (XmlRpcException); - - /** - * Login to the authentication server, using the data read from the - * configuration file. - * Returns a new session ID; in case of an error, returns a - * null pointer. - * Note that an incorrect login or password is considered an error - * and will throw an XmlRpcException. - * - * @return the new session ID - * @exception XmlRpcException login or password is incorrect - * (does not match those given in the configuration file) - */ - virtual Ptr::Ref - login(const std::string &login, const std::string &password) - throw (XmlRpcException); - - /** - * Logout from the authentication server. - * - * @param sessionId the ID of the session to end - * @exception XmlRpcException the sessionId does not match - * one issued by login() - */ - virtual void - logout(Ptr::Ref sessionId) - throw (XmlRpcException); - - /** - * Load a `user preferences' item from the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * @exception XmlRpcException invalid session ID - * @exception std::invalid_argument no such preference key found - */ - virtual Ptr::Ref - loadPreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException, - std::invalid_argument); - - /** - * Store a `user preferences' item on the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * @param value the (new) value of the item - * @exception XmlRpcException invalid session ID - */ - virtual void - savePreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key, - Ptr::Ref value) - throw (XmlRpcException); - - /** - * Delete a `user preferences' item from the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * @exception XmlRpcException invalid session ID, or no such key - */ - virtual void - deletePreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException); - - /** - * Reset the authentication client. - * Invalidates all active session IDs, and resets the list of - * preferences to its initial (empty) state. - * - * @exception XmlRpcException if the server returns an error. - */ - virtual void - reset(void) - throw (XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // TestAuthenticationClient_h - diff --git a/src/modules/authentication/src/TestAuthenticationClientTest.cxx b/src/modules/authentication/src/TestAuthenticationClientTest.cxx deleted file mode 100644 index 4a4eb6e70..000000000 --- a/src/modules/authentication/src/TestAuthenticationClientTest.cxx +++ /dev/null @@ -1,271 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Core/SessionId.h" -#include "TestAuthenticationClientTest.h" - - -using namespace std; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAuthenticationClientTest); - -/** - * The name of the configuration file for the authentication client factory. - */ -static const std::string configFileName = "../etc/testAuthentication.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClientTest :: setUp(void) throw () -{ - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - configFileName); - const xmlpp::Element * root = document->get_root_node(); - - tac.reset(new TestAuthenticationClient()); - tac->configure(*root); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClientTest :: tearDown(void) throw () -{ - tac.reset(); -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can log on and off - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClientTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref sessionId; - - try { - sessionId = tac->login("Piszkos Fred", "malnaszor"); - CPPUNIT_FAIL("Allowed login with incorrect login and password."); - } catch (XmlRpcException &e) { - } - - // TODO: this call writes some garbage to cerr; it should be told not to - sessionId.reset(new SessionId("ceci n'est pas un session ID")); - try { - tac->logout(sessionId); - CPPUNIT_FAIL("Allowed logout without previous login."); - } catch (XmlRpcException &e) { - } - - try { - sessionId = tac->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - tac->logout(sessionId); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - tac->logout(sessionId); - CPPUNIT_FAIL("Allowed to logout twice."); - } catch (XmlRpcException &e) { - } -} - - -/*------------------------------------------------------------------------------ - * Test the getVersion function - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClientTest :: getVersionTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref version; - - try { - version = tac->getVersion(); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - CPPUNIT_ASSERT(version.get()); - CPPUNIT_ASSERT(*version == "TestAuthentication"); -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can save and load user preferences. - *----------------------------------------------------------------------------*/ -void -TestAuthenticationClientTest :: preferencesTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref sessionId; - Ptr::Ref prefValue; - - // check "please log in" error - try { - prefValue = tac->loadPreferencesItem(sessionId, "something"); - CPPUNIT_FAIL("Allowed operation without login."); - } catch (XmlRpcException &e) { - } - - // log in - try { - sessionId = tac->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // check "no such key" error - try { - prefValue = tac->loadPreferencesItem(sessionId, "eye_color"); - CPPUNIT_FAIL("Retrieved non-existent user preferences item."); - } catch (std::invalid_argument &e) { - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // check normal save and load - prefValue.reset(new const Glib::ustring("chyornye")); - try { - tac->savePreferencesItem(sessionId, "eye_color", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - Ptr::Ref newPrefValue; - try { - newPrefValue = tac->loadPreferencesItem(sessionId, "eye_color"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == *prefValue); - - // try some unicode characters - prefValue.reset(new const Glib::ustring("страстные")); - try { - tac->savePreferencesItem(sessionId, "eye_color", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = tac->loadPreferencesItem(sessionId, "eye_color"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == "страстные"); - - // check another normal save and load... - prefValue.reset(new const Glib::ustring("ne dobryj")); - try { - tac->savePreferencesItem(sessionId, "hour", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - - // ... but now change session ID in the middle - try { - tac->logout(sessionId); - sessionId = tac->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - try { - newPrefValue = tac->loadPreferencesItem(sessionId, "hour"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == *prefValue); - - // check the delete method - try { - tac->deletePreferencesItem(sessionId, "hour"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = tac->loadPreferencesItem(sessionId, "hour"); - CPPUNIT_FAIL("Allowed to load preference after it was deleted"); - } catch (std::invalid_argument &e) { - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // and log out - try { - tac->logout(sessionId); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} diff --git a/src/modules/authentication/src/TestAuthenticationClientTest.h b/src/modules/authentication/src/TestAuthenticationClientTest.h deleted file mode 100644 index 8e247fc94..000000000 --- a/src/modules/authentication/src/TestAuthenticationClientTest.h +++ /dev/null @@ -1,128 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef TestAuthenticationClientTest_h -#define TestAuthenticationClientTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/BaseTestMethod.h" - -#include "TestAuthenticationClient.h" - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the TestAuthenticationClient class. - * - * @see TestAuthenticationClient - */ -class TestAuthenticationClientTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(TestAuthenticationClientTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(getVersionTest); - CPPUNIT_TEST(preferencesTest); - CPPUNIT_TEST_SUITE_END(); - - private: - /** - * The TestAuthenticationClient instance to test. - */ - Ptr::Ref tac; - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test the gerVersion() function. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - getVersionTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test saving and load of user preferences. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - preferencesTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // TestAuthenticationClientTest_h - diff --git a/src/modules/authentication/src/TestRunner.cxx b/src/modules/authentication/src/TestRunner.cxx deleted file mode 100644 index 350009b57..000000000 --- a/src/modules/authentication/src/TestRunner.cxx +++ /dev/null @@ -1,276 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -using namespace LiveSupport::Core; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * Our copyright notice, should be at most 80 columns - */ -static const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -static const char options[] = "ho:s:v"; - -/** - * Structure describing the long options - */ -static const struct option longOptions[] = { - { "help", no_argument, 0, 'h' }, - { "output", required_argument, 0, 'o' }, - { "stylesheet", required_argument, 0, 's' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } -}; - -/** - * The encoding to use for the output file. - */ -static const std::string encoding = "utf-8"; - -/** - * The output XML file name. - */ -static Ptr::Ref xmlOutFileName; - -/** - * The XSLT attached to the output file. - */ -static Ptr::Ref xsltFileName; - - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -static void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -static void -printUsage ( const char invocation[], - std::ostream & os ); - -/** - * Process command line arguments. - * - * @param argc the number of arguments. - * @param argv the arguments themselves. - * @return true of all went well, false in case the program should exit - * after this call. - */ -static bool -processArguments(int argc, char *argv[]); - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Run all tests - *----------------------------------------------------------------------------*/ -int -main( int argc, - char * argv[] ) throw () -{ - if (!processArguments(argc, argv)) { - return 0; - } - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as test run. - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - // Add the top suite to the test runner - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - runner.run( controller ); - - // Print test in a compiler compatible format. - CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr ); - outputter.setLocationFormat("%p:%l:"); - outputter.write(); - - // also generate an XML document as an output - std::ofstream xmlOutFile(xmlOutFileName->c_str()); - CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); - xmlOutputter.setStandalone(false); - if (xsltFileName) { - xmlOutputter.setStyleSheet(*xsltFileName); - } - xmlOutputter.write(); - xmlOutFile.flush(); - xmlOutFile.close(); - - return result.wasSuccessful() ? 0 : 1; -} - - -/*------------------------------------------------------------------------------ - * Process command line arguments. - *----------------------------------------------------------------------------*/ -static bool -processArguments(int argc, char *argv[]) -{ - int i; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'h': - printUsage(argv[0], std::cout); - return false; - - case 'o': - xmlOutFileName.reset(new std::string(optarg)); - break; - - case 's': - xsltFileName.reset(new std::string(optarg)); - break; - - case 'v': - printVersion(std::cout); - return false; - - default: - printUsage(argv[0], std::cout); - return false; - } - } - - if (optind < argc) { - std::cerr << "error processing command line arguments" << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - if (!xmlOutFileName) { - std::cerr << "mandatory option output file name not specified" - << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; - if (xsltFileName) { - std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -static void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -static void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION]" - << std::endl - << " mandatory options:" << std::endl - << " -o, --output=file.name write test results into this XML file" - << std::endl - << " optional options:" << std::endl - << " -s, --stylesheet specify this XSLT for the output file" - << std::endl - << " this is either an absolute URI, or a" - << std::endl - << " relative path for the output document" - << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/modules/authentication/src/WebAuthenticationClient.cxx b/src/modules/authentication/src/WebAuthenticationClient.cxx deleted file mode 100644 index 5f44deb0a..000000000 --- a/src/modules/authentication/src/WebAuthenticationClient.cxx +++ /dev/null @@ -1,658 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#include -#include -#include -#include - -#include "WebAuthenticationClient.h" - -using namespace boost::posix_time; -using namespace XmlRpc; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ configuration file constants */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string WebAuthenticationClient::configElementNameStr - = "webAuthentication"; - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the config child element for the authentication server location - *----------------------------------------------------------------------------*/ -const std::string locationConfigElementName = "location"; - -/*------------------------------------------------------------------------------ - * The name of the config element attribute for the server name - *----------------------------------------------------------------------------*/ -const std::string locationServerAttrName = "server"; - -/*------------------------------------------------------------------------------ - * The name of the config element attribute for the server port - *----------------------------------------------------------------------------*/ -const std::string locationPortAttrName = "port"; - -/*------------------------------------------------------------------------------ - * The name of the config element attribute for the server php page - *----------------------------------------------------------------------------*/ -const std::string locationPathAttrName = "path"; - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ authentication server constants: login */ - -/*------------------------------------------------------------------------------ - * The name of the get version method on the storage server - *----------------------------------------------------------------------------*/ -const std::string getVersionMethodName = "locstor.getVersion"; - -/*------------------------------------------------------------------------------ - * The name of version return parameter for getVersion - *----------------------------------------------------------------------------*/ -const std::string getVersionResultParamName = "version"; - -/*------------------------------------------------------------------------------ - * The name of the login method on the server - *----------------------------------------------------------------------------*/ -const std::string loginMethodName = "locstor.login"; - -/*------------------------------------------------------------------------------ - * The name of the login parameter in the input structure - *----------------------------------------------------------------------------*/ -const std::string loginParamName = "login"; - -/*------------------------------------------------------------------------------ - * The name of the password parameter in the input structure - *----------------------------------------------------------------------------*/ -const std::string passwordParamName = "pass"; - -/*------------------------------------------------------------------------------ - * The name of the session ID parameter in the output structure - *----------------------------------------------------------------------------*/ -const std::string outputSessionIdParamName = "sessid"; - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ authentication server constants: logout */ - -/*------------------------------------------------------------------------------ - * The name of the logout method on the server - *----------------------------------------------------------------------------*/ -const std::string logoutMethodName = "locstor.logout"; - -/*------------------------------------------------------------------------------ - * The name of the session ID parameter in the input structure - *----------------------------------------------------------------------------*/ -const std::string inputSessionIdParamName = "sessid"; - -/*------------------------------------------------------------------------------ - * The name of the status parameter in the output structure - *----------------------------------------------------------------------------*/ -const std::string statusParamName = "status"; - - -/* ~~~~~~~~~~~~~~~~~~ authentication server constants: load/save preferences */ - -/*------------------------------------------------------------------------------ - * The name of the load preferences method on the server - *----------------------------------------------------------------------------*/ -const std::string loadPreferencesMethodName = "locstor.loadPref"; - -/*------------------------------------------------------------------------------ - * The name of the save preferences method on the server - *----------------------------------------------------------------------------*/ -const std::string savePreferencesMethodName = "locstor.savePref"; - -/*------------------------------------------------------------------------------ - * The name of the delete preferences method on the server - *----------------------------------------------------------------------------*/ -const std::string deletePreferencesMethodName = "locstor.delPref"; - -/*------------------------------------------------------------------------------ - * The name of the session ID parameter in the input structure - *----------------------------------------------------------------------------*/ -const std::string preferencesSessionIdParamName = "sessid"; - -/*------------------------------------------------------------------------------ - * The name of the key parameter in the input structure - *----------------------------------------------------------------------------*/ -const std::string preferencesKeyParamName = "key"; - -/*------------------------------------------------------------------------------ - * The name of the value parameter for both save and load methods - *----------------------------------------------------------------------------*/ -const std::string preferencesValueParamName = "value"; - -/*------------------------------------------------------------------------------ - * The name of the return parameter for the save method - *----------------------------------------------------------------------------*/ -const std::string preferencesStatusParamName = "status"; - -/*------------------------------------------------------------------------------ - * The name of the fault code parameter - *----------------------------------------------------------------------------*/ -const std::string faultCodeParamName = "faultCode"; - -/*------------------------------------------------------------------------------ - * The fault code for the "invalid preference key" error - *----------------------------------------------------------------------------*/ -const int invalidPreferenceKeyFaultCode = 849; - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~ authentication server constants: resetStorage */ - -/*------------------------------------------------------------------------------ - * The name of the reset storage method on the server - *----------------------------------------------------------------------------*/ -const std::string resetStorageMethodName = "locstor.resetStorage"; - -/*------------------------------------------------------------------------------ - * The name of the result parameter returned by the method (ignored here) - *----------------------------------------------------------------------------*/ -const std::string resetStorageResultParamName = "results"; - -/*------------------------------------------------------------------------------ - * The name of the count parameter returned by the method (ignored here) - *----------------------------------------------------------------------------*/ -const std::string resetStorageCountParamName = "cnt"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the web storage client. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClient :: configure(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - const xmlpp::Attribute * attribute = 0; - - // read the storage server location - xmlpp::Node::NodeList childNodes - = element.get_children(locationConfigElementName); - xmlpp::Node::NodeList::iterator it = childNodes.begin(); - - if (it == childNodes.end()) { - std::string eMsg = "missing "; - eMsg += locationConfigElementName; - eMsg += " XML element"; - throw std::invalid_argument(eMsg); - } - - const xmlpp::Element * locationConfigElement - = dynamic_cast (*it); - if (!(attribute = locationConfigElement - ->get_attribute(locationServerAttrName))) { - std::string eMsg = "Missing attribute "; - eMsg += locationServerAttrName; - throw std::invalid_argument(eMsg); - } - storageServerName = attribute->get_value(); - - if (!(attribute = locationConfigElement - ->get_attribute(locationPortAttrName))) { - std::string eMsg = "Missing attribute "; - eMsg += locationPortAttrName; - throw std::invalid_argument(eMsg); - } - std::stringstream storageServerPortValue(attribute->get_value()); - storageServerPortValue >> storageServerPort; - - if (!(attribute = locationConfigElement - ->get_attribute(locationPathAttrName))) { - std::string eMsg = "Missing attribute "; - eMsg += locationPathAttrName; - throw std::invalid_argument(eMsg); - } - storageServerPath = attribute->get_value(); - - ++it; - if (it != childNodes.end()) { - std::string eMsg = "more than one "; - eMsg += locationConfigElementName; - eMsg += " XML element"; - throw std::invalid_argument(eMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Return the version string of the test storage. - *----------------------------------------------------------------------------*/ -Ptr::Ref -WebAuthenticationClient :: getVersion(void) - throw (Core::XmlRpcException) -{ - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - // add a dummy parameter, as this is the only way to enforce parameters - // to be of XML-RPC type struct - parameters["dummy"] = 0; - result.clear(); - if (!xmlRpcClient.execute(getVersionMethodName.c_str(), - parameters, result)) { - xmlRpcClient.close(); - std::string eMsg = "cannot execute XML-RPC method '"; - eMsg += getVersionMethodName; - eMsg += "'"; - throw XmlRpcCommunicationException(eMsg); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "XML-RPC method '" - << getVersionMethodName - << "' returned error message:\n" - << result; - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - - if (!result.hasMember(getVersionResultParamName) - || result[getVersionResultParamName].getType() - != XmlRpcValue::TypeString) { - std::stringstream eMsg; - eMsg << "XML-RPC method '" - << getVersionMethodName - << "' returned unexpected value:\n" - << result; - throw XmlRpcMethodResponseException(eMsg.str()); - } - - Ptr::Ref version(new Glib::ustring( - result[getVersionResultParamName])); - - xmlRpcClient.close(); - - return version; -} - - -/*------------------------------------------------------------------------------ - * Login to the authentication server. - *----------------------------------------------------------------------------*/ -Ptr::Ref -WebAuthenticationClient :: login(const std::string & login, - const std::string & password) - throw (XmlRpcException) -{ - XmlRpcValue parameters; - XmlRpcValue result; - Ptr::Ref sessionId; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - parameters[loginParamName] = login; - parameters[passwordParamName] = password; - - result.clear(); - if (!xmlRpcClient.execute(loginMethodName.c_str(), parameters, result)) { - xmlRpcClient.close(); - throw Authentication::XmlRpcCommunicationException("Login failed."); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "Login method returned fault response:\n" - << result; - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - - if (! result.hasMember(outputSessionIdParamName)) { - std::stringstream eMsg; - eMsg << "Login method returned unexpected response:\n" - << result; - throw Core::XmlRpcMethodResponseException(eMsg.str()); - } - - if (result[outputSessionIdParamName].getType() != XmlRpcValue::TypeString) { - std::stringstream eMsg; - eMsg << "Login method returned unexpected response:\n" - << result; - throw Core::XmlRpcMethodResponseException(eMsg.str()); - } - - sessionId.reset(new SessionId(result[outputSessionIdParamName])); - return sessionId; -} - - -/*------------------------------------------------------------------------------ - * Logout from the authentication server. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClient :: logout(Ptr::Ref sessionId) - throw (XmlRpcException) -{ - if (!sessionId) { - throw Core::XmlRpcInvalidArgumentException("Missing session ID."); - } - - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - parameters[inputSessionIdParamName] = sessionId->getId(); - - result.clear(); - if (!xmlRpcClient.execute(logoutMethodName.c_str(), parameters, result)) { - xmlRpcClient.close(); - throw Core::XmlRpcCommunicationException("Logout failed."); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "Logout method returned fault response:\n" - << result; - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - - if (! result.hasMember(statusParamName) - || result[statusParamName].getType() != XmlRpcValue::TypeBoolean - || ! bool(result[statusParamName])) { - std::stringstream eMsg; - eMsg << "Logout method returned unexpected response:\n" - << result; - throw Core::XmlRpcMethodResponseException(eMsg.str()); - } -} - - -/*------------------------------------------------------------------------------ - * Load a `user preferences' item from the server. - *----------------------------------------------------------------------------*/ -Ptr::Ref -WebAuthenticationClient :: loadPreferencesItem( - Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException, - std::invalid_argument) -{ - if (!sessionId) { - throw Core::XmlRpcInvalidArgumentException("Missing session ID."); - } - - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - parameters[preferencesSessionIdParamName] = sessionId->getId(); - parameters[preferencesKeyParamName] = std::string(key); - - result.clear(); - if (!xmlRpcClient.execute(loadPreferencesMethodName.c_str(), - parameters, result)) { - xmlRpcClient.close(); - throw Core::XmlRpcCommunicationException( - "Could not execute XML-RPC method."); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "XML-RPC method " - << loadPreferencesMethodName - << " returned fault response:\n" - << result; - if (result.hasMember(faultCodeParamName) - && result[faultCodeParamName].getType() - == XmlRpcValue::TypeInt - && int(result[faultCodeParamName]) - == invalidPreferenceKeyFaultCode) { - throw std::invalid_argument(eMsg.str()); - } else { - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - } - - if (! result.hasMember(preferencesValueParamName) - || result[preferencesValueParamName].getType() - != XmlRpcValue::TypeString) { - std::stringstream eMsg; - eMsg << "XML-RPC method " - << loadPreferencesMethodName - << " returned unexpected response:\n" - << result; - throw Core::XmlRpcMethodResponseException(eMsg.str()); - } - - Ptr::Ref value(new Glib::ustring(std::string( - result[preferencesValueParamName] ))); - return value; -} - - -/*------------------------------------------------------------------------------ - * Store a `user preferences' item on the server. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClient :: savePreferencesItem( - Ptr::Ref sessionId, - const Glib::ustring & key, - Ptr::Ref value) - throw (XmlRpcException) -{ - if (!sessionId) { - throw Core::XmlRpcInvalidArgumentException("Missing session ID."); - } - - if (!value) { - throw Core::XmlRpcInvalidArgumentException("Missing value argument."); - } - - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - parameters[preferencesSessionIdParamName] = sessionId->getId(); - parameters[preferencesKeyParamName] = std::string(key); - parameters[preferencesValueParamName] = std::string(*value); - - result.clear(); - if (!xmlRpcClient.execute(savePreferencesMethodName.c_str(), - parameters, result)) { - xmlRpcClient.close(); - throw Core::XmlRpcCommunicationException( - "Could not execute XML-RPC method."); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "XML-RPC method " - << savePreferencesMethodName - << " returned fault response:\n" - << result; - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - - if (! result.hasMember(preferencesStatusParamName) - || result[preferencesStatusParamName].getType() - != XmlRpcValue::TypeBoolean - || ! bool(result[preferencesStatusParamName])) { - std::stringstream eMsg; - eMsg << "XML-RPC method " - << savePreferencesMethodName - << " returned unexpected response:\n" - << result; - throw Core::XmlRpcMethodResponseException(eMsg.str()); - } -} - - -/*------------------------------------------------------------------------------ - * Delete a `user preferences' item from the server. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClient :: deletePreferencesItem( - Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException) -{ - if (!sessionId) { - throw Core::XmlRpcInvalidArgumentException("Missing session ID."); - } - - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - parameters[preferencesSessionIdParamName] = sessionId->getId(); - parameters[preferencesKeyParamName] = std::string(key); - - result.clear(); - if (!xmlRpcClient.execute(deletePreferencesMethodName.c_str(), - parameters, result)) { - xmlRpcClient.close(); - throw Core::XmlRpcCommunicationException( - "Could not execute XML-RPC method."); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "XML-RPC method " - << deletePreferencesMethodName - << " returned fault response:\n" - << result; - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - - if (! result.hasMember(preferencesStatusParamName) - || result[preferencesStatusParamName].getType() - != XmlRpcValue::TypeBoolean - || ! bool(result[preferencesStatusParamName])) { - std::stringstream eMsg; - eMsg << "XML-RPC method " - << deletePreferencesMethodName - << " returned unexpected response:\n" - << result; - throw Core::XmlRpcMethodResponseException(eMsg.str()); - } -} - - -/*------------------------------------------------------------------------------ - * Reset the list of preferences to its initial (empty) state. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClient :: reset(void) - throw (Core::XmlRpcException) -{ - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, - storageServerPath.c_str(), false); - - parameters.clear(); - parameters["dummy_param"] = "dummy_value"; - - result.clear(); - if (!xmlRpcClient.execute(resetStorageMethodName.c_str(), - parameters, result)) { - xmlRpcClient.close(); - throw Core::XmlRpcCommunicationException( - "Could not execute XML-RPC method."); - } - xmlRpcClient.close(); - - if (xmlRpcClient.isFault()) { - std::stringstream eMsg; - eMsg << "XML-RPC method '" - << resetStorageMethodName - << "' returned error message:\n" - << result; - throw Core::XmlRpcMethodFaultException(eMsg.str()); - } - - if (! result.hasMember(resetStorageResultParamName) - || result[resetStorageResultParamName].getType() - != XmlRpcValue::TypeArray - || ! result.hasMember(resetStorageCountParamName) - || result[resetStorageCountParamName].getType() - != XmlRpcValue::TypeInt) { - std::stringstream eMsg; - eMsg << "XML-RPC method '" - << resetStorageMethodName - << "' returned unexpected value:\n" - << result; - throw XmlRpcMethodResponseException(eMsg.str()); - } -} - diff --git a/src/modules/authentication/src/WebAuthenticationClient.h b/src/modules/authentication/src/WebAuthenticationClient.h deleted file mode 100644 index 24980fced..000000000 --- a/src/modules/authentication/src/WebAuthenticationClient.h +++ /dev/null @@ -1,289 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef WebAuthenticationClient_h -#define WebAuthenticationClient_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" - - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An interface to the authentication methods on the php authentication - * server (which is currently the same as the storage server). - * - * This object has to be configured with an XML configuration element - * called webAuthentication. This element contains a child element - * specifying the location of the authentication server. - * - * A webAuthentication configuration element may look like the following: - * - *

- *  <webAuthentication>
- *      <location
- *          server="localhost"
- *          port="80" 
- *          path="/livesupportStorageServer/xmlrpc/xrLocStor.php"
- *      />
- *  </webAuthentication>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT webAuthentication (location) >
- *  <!ELEMENT location EMPTY >
- *  <!ATTLIST location server   CDATA       #REQUIRED >
- *  <!ATTLIST location port     NMTOKEN     #REQUIRED >
- *  <!ATTLIST location path     CDATA       #REQUIRED >
- *  
- */ -class WebAuthenticationClient : - virtual public Configurable, - virtual public AuthenticationClientInterface -{ - private: - /** - * The name of the configuration XML elmenent used by - * WebAuthenticationClient - */ - static const std::string configElementNameStr; - - /** - * The name of the authentication server, e.g. - * "myserver.mycompany.com". - */ - std::string storageServerName; - - /** - * The port wher the authentication server is listening - * (default is 80). - */ - int storageServerPort; - - /** - * The path to the authentication server php page. - */ - std::string storageServerPath; - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~WebAuthenticationClient(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the scheduler daemon has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument); - - /** - * Return the version string from the storage. - * - * @return the version string of the storage. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - */ - virtual Ptr::Ref - getVersion(void) throw (XmlRpcException); - - /** - * Login to the authentication server, using the data read from the - * configuration file. - * Returns a new session ID; in case of an error, throws one of three - * types of AuthenticationException. - * Note that an incorrect login or password is considered an error - * and will throw an XmlRpcMethodFaultException. - * - * @param login the login to the server - * @param password the password to the server - * @exception XmlRpcCommunicationException problem with performing - * XML-RPC call - * @exception XmlRpcMethodFaultException XML-RPC method returned - * fault response - * @exception XmlRpcMethodResponseException response from XML-RPC - * method is incorrect - * @return the new session ID - */ - virtual Ptr::Ref - login(const std::string &login, const std::string &password) - throw (XmlRpcException); - - /** - * Logout from the authentication server. - * - * @param sessionId the ID of the session to end - * @exception XmlRpcCommunicationException problem with performing - * XML-RPC call - * @exception XmlRpcMethodFaultException XML-RPC method returned - * fault response - * @exception XmlRpcMethodResponseException response from XML-RPC - * method is incorrect - * @return true if logged out successfully, false if not - */ - virtual void - logout(Ptr::Ref sessionId) - throw (XmlRpcException); - - /** - * Load a `user preferences' item from the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * - * @exception std::invalid_argument - * no such preference key found - * @exception XmlRpcInvalidArgumentException - * bad sessionId argument - * @exception XmlRpcCommunicationException - * problem with performing XML-RPC call - * @exception XmlRpcMethodFaultException - * XML-RPC method returned fault response - * @exception XmlRpcMethodResponseException - * response from XML-RPC method is incorrect - */ - virtual Ptr::Ref - loadPreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException, - std::invalid_argument); - - /** - * Store a `user preferences' item on the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * @param value the (new) value of the item - * - * @exception XmlRpcInvalidArgumentException - * bad sessionId or value argument - * @exception XmlRpcCommunicationException - * problem with performing XML-RPC call - * @exception XmlRpcMethodFaultException - * XML-RPC method returned fault response - * @exception XmlRpcMethodResponseException - * response from XML-RPC method is incorrect - */ - virtual void - savePreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key, - Ptr::Ref value) - throw (XmlRpcException); - - /** - * Delete a `user preferences' item from the server. - * - * @param sessionId the ID of the current session (from login()) - * @param key the name of the item - * - * @exception XmlRpcInvalidArgumentException - * bad sessionId argument - * @exception XmlRpcCommunicationException - * problem with performing XML-RPC call - * @exception XmlRpcMethodFaultException - * XML-RPC method returned fault response - * @exception XmlRpcMethodResponseException - * response from XML-RPC method is incorrect - */ - virtual void - deletePreferencesItem(Ptr::Ref sessionId, - const Glib::ustring & key) - throw (XmlRpcException); - - /** - * Reset the authentication client. - * Invalidates all active session IDs, and resets the list of - * preferences to its initial (empty) state. - * - * @exception XmlRpcException if the server returns an error. - */ - virtual void - reset(void) - throw (XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // WebAuthenticationClient_h - diff --git a/src/modules/authentication/src/WebAuthenticationClientTest.cxx b/src/modules/authentication/src/WebAuthenticationClientTest.cxx deleted file mode 100644 index 8f978ffe4..000000000 --- a/src/modules/authentication/src/WebAuthenticationClientTest.cxx +++ /dev/null @@ -1,276 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Core/SessionId.h" -#include "WebAuthenticationClientTest.h" - - -using namespace std; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(WebAuthenticationClientTest); - -/** - * The name of the configuration file for the authentication client factory. - */ -static const std::string configFileName = "webAuthentication.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClientTest :: setUp(void) throw () -{ - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - configFileName); - const xmlpp::Element * root = document->get_root_node(); - - wac.reset(new WebAuthenticationClient()); - wac->configure(*root); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClientTest :: tearDown(void) throw () -{ - wac.reset(); -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can log on and off. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClientTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref sessionId; - - try { - sessionId = wac->login("Piszkos Fred", "malnaszor"); - CPPUNIT_FAIL("Allowed login with incorrect login and password."); - } catch (XmlRpcException &e) { - } - - sessionId.reset(new SessionId("bad_session_ID")); - try { - wac->logout(sessionId); - CPPUNIT_FAIL("Allowed logout without previous login."); - } catch (XmlRpcException &e) { - } - - try { - sessionId = wac->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - wac->logout(sessionId); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - wac->logout(sessionId); - CPPUNIT_FAIL("Allowed to logout twice."); - } catch (XmlRpcException &e) { - } -} - - -/*------------------------------------------------------------------------------ - * Test the getVersion function - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClientTest :: getVersionTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref version; - - try { - version = wac->getVersion(); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - CPPUNIT_ASSERT(version.get()); -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can save and load user preferences. - *----------------------------------------------------------------------------*/ -void -WebAuthenticationClientTest :: preferencesTest(void) - throw (CPPUNIT_NS::Exception) -{ - try { - wac->reset(); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - Ptr::Ref sessionId; - Ptr::Ref prefValue; - - // check "please log in" error - try { - prefValue = wac->loadPreferencesItem(sessionId, "something"); - CPPUNIT_FAIL("Allowed operation without login."); - } catch (XmlRpcException &e) { - } - - // log in - try { - sessionId = wac->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // check "no such key" error - try { - prefValue = wac->loadPreferencesItem(sessionId, "eye_color"); - CPPUNIT_FAIL("Retrieved non-existent user preferences item"); - } catch (std::invalid_argument &e) { - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // check normal save and load - prefValue.reset(new const Glib::ustring("chjornyje")); - try { - wac->savePreferencesItem(sessionId, "eye_color", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - Ptr::Ref newPrefValue; - try { - newPrefValue = wac->loadPreferencesItem(sessionId, "eye_color"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == *prefValue); - - // try some unicode characters - prefValue.reset(new const Glib::ustring("страстные")); - try { - wac->savePreferencesItem(sessionId, "eye_color", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = wac->loadPreferencesItem(sessionId, "eye_color"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == "страстные"); - - // check another normal save and load ... - prefValue.reset(new const Glib::ustring("ne dobryj")); - try { - wac->savePreferencesItem(sessionId, "hour", prefValue); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // ... but now change session ID in the middle - try { - wac->logout(sessionId); - sessionId = wac->login("root", "q"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = wac->loadPreferencesItem(sessionId, "hour"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - CPPUNIT_ASSERT(*newPrefValue == *prefValue); - - // check the delete method - try { - wac->deletePreferencesItem(sessionId, "hour"); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - try { - newPrefValue = wac->loadPreferencesItem(sessionId, "hour"); - CPPUNIT_FAIL("Allowed to load preference after it was deleted"); - } catch (std::invalid_argument &e) { - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - // and log out - try { - wac->logout(sessionId); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - diff --git a/src/modules/authentication/src/WebAuthenticationClientTest.h b/src/modules/authentication/src/WebAuthenticationClientTest.h deleted file mode 100644 index 08c90aa4a..000000000 --- a/src/modules/authentication/src/WebAuthenticationClientTest.h +++ /dev/null @@ -1,128 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef WebAuthenticationClientTest_h -#define WebAuthenticationClientTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/BaseTestMethod.h" - -#include "WebAuthenticationClient.h" - -namespace LiveSupport { -namespace Authentication { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the WebAuthenticationClient class. - * - * @see WebAuthenticationClient - */ -class WebAuthenticationClientTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(WebAuthenticationClientTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(getVersionTest); - CPPUNIT_TEST(preferencesTest); - CPPUNIT_TEST_SUITE_END(); - - private: - /** - * The WebAuthenticationClient instance to test. - */ - Ptr::Ref wac; - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test the getVersion() function. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - getVersionTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test saving and load of user preferences. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - preferencesTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Authentication -} // namespace LiveSupport - -#endif // WebAuthenticationClientTest_h - diff --git a/src/modules/authentication/tmp/.keepme b/src/modules/authentication/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/authentication/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/db/bin/autogen.sh b/src/modules/db/bin/autogen.sh deleted file mode 100755 index 57044e4a6..000000000 --- a/src/modules/db/bin/autogen.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="Db" - -# assume we're in $basedir/bin -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -echo " aclocal $ACLOCAL_FLAGS" -cp -f ${configure_ac} ${tmpdir} -cp -f ${etcdir}/acinclude.m4 ${tmpdir} -aclocal $ACLOCAL_FLAGS - -echo " autoheader ${configure_ac}" -autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/modules/db/bin/gen_coverage_data.sh b/src/modules/db/bin/gen_coverage_data.sh deleted file mode 100755 index c8a4606a5..000000000 --- a/src/modules/db/bin/gen_coverage_data.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script generates code coverage data for the module -#------------------------------------------------------------------------------- -module="Campcaster Db" - -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -docdir=$basedir/doc -tmpdir=$basedir/tmp - -usrdir=`cd $basedir/../../../usr; pwd;` - -coverage_report_dir=$docdir/coverage - -raw_coverage_file=$tmpdir/raw_coverage.info -coverage_file=$tmpdir/coverage.info - -lcov=$usrdir/bin/lcov -genhtml=$usrdir/bin/genhtml - - -cd $basedir - -#------------------------------------------------------------------------------- -# Re-configure with covarege collection enabled, compile and run the tests -#------------------------------------------------------------------------------- -$bindir/autogen.sh --enable-coverage -make clean -make check - -#------------------------------------------------------------------------------- -# Generate some symlinks so that the sources are visible from tmpdir -#------------------------------------------------------------------------------- -ln -s $basedir/include $tmpdir/include -ln -s $basedir/src $tmpdir/src - - -#------------------------------------------------------------------------------- -# Use lcov to generate an HTML report on the coverage data -#------------------------------------------------------------------------------- -$lcov -d $tmpdir -c > $raw_coverage_file -$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file -rm -rf $coverage_report_dir -mkdir -p $coverage_report_dir -$genhtml -t "$module" -o $coverage_report_dir $coverage_file - - -#------------------------------------------------------------------------------- -# Clean up -#------------------------------------------------------------------------------- -rm -f $tmpdir/include -rm -f $tmpdir/src diff --git a/src/modules/db/configure b/src/modules/db/configure deleted file mode 100755 index 0c58cc366..000000000 --- a/src/modules/db/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen "$@") -fi - -(cd $tmpdir && $configure "$@") - diff --git a/src/modules/db/doc/doxygen/.keepme b/src/modules/db/doc/doxygen/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/db/doc/doxygen/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/db/etc/Makefile.in b/src/modules/db/etc/Makefile.in deleted file mode 100644 index 1564d01eb..000000000 --- a/src/modules/db/etc/Makefile.in +++ /dev/null @@ -1,174 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# @configure_input@ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -CP = cp -f - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -BASE_DIR = @builddir@ -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -BIN_DIR = ${BASE_DIR}/bin -ETC_DIR = ${BASE_DIR}/etc -INCLUDE_DIR = ${BASE_DIR}/include -LIB_DIR = ${BASE_DIR}/lib -SRC_DIR = ${BASE_DIR}/src -TMP_DIR = ${BASE_DIR}/tmp - -prefix = @prefix@ - -USR_DIR = ${prefix} -USR_INCLUDE_DIR = ${USR_DIR}/include -USR_LIB_DIR = ${USR_DIR}/lib - -MODULES_DIR = ${BASE_DIR}/.. - -CORE_DIR = ${MODULES_DIR}/core -CORE_INCLUDE_DIR = ${CORE_DIR}/include -CORE_LIB_DIR = ${CORE_DIR}/lib -CORE_LIB = livesupport_core -CORE_LIB_FILE = ${CORE_LIB_DIR}/lib${CORE_LIB}.a - -VPATH = ${SRC_DIR} - -LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ -LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ -LIBODBCXX_CFLAGS=@LIBODBCXX_CFLAGS@ -LIBODBCXX_LIBS=@LIBODBCXX_LIBS@ - -TEST_RESULTS = ${DOC_DIR}/testResults.xml -# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR -TEST_XSLT = ../etc/testResultToHtml.xsl - -DB_LIB = livesupport_db -DB_LIB_FILE = ${LIB_DIR}/lib${DB_LIB}.a -TEST_RUNNER = ${TMP_DIR}/testRunner - -DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config - -export LD_LIBRARY_PATH:=${LD_LIBRARY_PATH}:${USR_LIB_DIR} - - -#------------------------------------------------------------------------------- -# Configuration parameters -#------------------------------------------------------------------------------- -CPPFLAGS = @CPPFLAGS@ -CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ - -pedantic -Wall -Wno-long-long \ - ${LIBXMLPP_CFLAGS} \ - ${LIBODBCXX_CFLAGS} \ - -I${USR_INCLUDE_DIR} \ - -I${CORE_INCLUDE_DIR} \ - -I${INCLUDE_DIR} -I${TMP_DIR} -LDFLAGS = @LDFLAGS@ -pthread \ - ${LIBXMLPP_LIBS} \ - ${LIBODBCXX_LIBS} \ - -L${USR_LIB_DIR} \ - -L${CORE_LIB_DIR} \ - -L${LIB_DIR} - - -#------------------------------------------------------------------------------- -# Dependencies -#------------------------------------------------------------------------------- -DB_LIB_OBJS = ${TMP_DIR}/SimpleConnectionManager.o \ - ${TMP_DIR}/ConnectionManagerFactory.o \ - ${TMP_DIR}/Conversion.o -TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ - ${TMP_DIR}/SimpleConnectionManagerTest.o \ - ${TMP_DIR}/ConnectionManagerFactoryTest.o -TEST_RUNNER_LIBS = -l${DB_LIB} -l${CORE_LIB} -lcppunit -ldl - - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -.PHONY: all dir_setup doc clean docclean depclean distclean check install - -all: dir_setup ${DB_LIB_FILE} - -dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} - -doc: - ${DOXYGEN} ${DOXYGEN_CONFIG} - -clean: - ${RM} ${DB_LIB_OBJS} ${DB_LIB_FILE} - ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER} - ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info - -docclean: - ${RMDIR} ${DOXYGEN_DIR}/html - ${RMDIR} ${COVERAGE_DIR}/* - ${RM} ${TEST_RESULTS} - -depclean: clean - -distclean: clean docclean - ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 - -check: all ${TEST_RUNNER} - ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} - -install: all - ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/Db - ${CP} ${INCLUDE_DIR}/LiveSupport/Db/*.h \ - ${USR_INCLUDE_DIR}/LiveSupport/Db - ${CP} ${DB_LIB_FILE} ${USR_LIB_DIR} - - -#------------------------------------------------------------------------------- -# Specific targets -#------------------------------------------------------------------------------- -${DB_LIB_FILE}: ${DB_LIB_OBJS} - ${AR} crus $@ $^ - -${TMP_DIR}: - ${MKDIR} ${TMP_DIR} - -${DOXYGEN_DIR}: - ${MKDIR} ${DOXYGEN_DIR} - -${TEST_RUNNER}: ${CORE_LIB_FILE} ${TEST_RUNNER_OBJS} ${DB_LIB_FILE} - ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} - -${CORE_LIB_FILE}: - ${MAKE} -C ${CORE_DIR} - - -#------------------------------------------------------------------------------- -# Pattern rules -#------------------------------------------------------------------------------- -${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx - ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< - diff --git a/src/modules/db/etc/acinclude.m4 b/src/modules/db/etc/acinclude.m4 deleted file mode 100644 index 83e8ed1c0..000000000 --- a/src/modules/db/etc/acinclude.m4 +++ /dev/null @@ -1,87 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl Macro to check for available modules using pkg-conf -dnl -dnl usage: -dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) -dnl -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -dnl -dnl This function was taken from the glade-- project -dnl----------------------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - - diff --git a/src/modules/db/etc/configure.ac b/src/modules/db/etc/configure.ac deleted file mode 100644 index 05a4753dc..000000000 --- a/src/modules/db/etc/configure.ac +++ /dev/null @@ -1,106 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(Db, 0.0, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../include/LiveSupport/Db/ConnectionManagerInterface.h) - -AC_CONFIG_HEADERS(configure.h) -AC_PROG_CXX() - -AC_CHECK_HEADERS(getopt.h) - - -dnl----------------------------------------------------------------------------- -dnl specify whether debug info should be compiled into the executable -dnl----------------------------------------------------------------------------- -AC_SUBST(CXXFLAGS) - -AC_ARG_ENABLE([debug], - AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), - [], - [enable_debug=no]) - -if test "x${enable_debug}" = "xyes"; then - CXXFLAGS="-g -O0" - AC_DEFINE( YDEBUG, 1, [Debug is on] ) -else - CXXFLAGS="-O3" -fi - - -AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the pkg-config path -dnl----------------------------------------------------------------------------- -AC_ARG_WITH([pkg-config-path], - AC_HELP_STRING([--with-pkg-config-path], - [use the pkg-config path (prefix/lib/pkgconfig)]), - [PKG_CONFIG_PATH=${withval}], - [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig:$PKG_CONFIG_PATH]) - -AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) - -export PKG_CONFIG_PATH - -export PATH=${prefix}/bin:${PATH} - - -PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) -AC_SUBST(LIBXMLPP_CFLAGS) -AC_SUBST(LIBXMLPP_LIBS) - -PKG_CHECK_MODULES(LIBODBCXX,[libodbc++]) - - -dnl----------------------------------------------------------------------------- -dnl enable compilaton for code coverage data -dnl----------------------------------------------------------------------------- -AC_SUBST(COVERAGE_CXXFLAGS) - -AC_ARG_ENABLE( coverage, -[ --enable-coverage enable code coverage data generaton (no) ], - ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) - -if test "x${ENABLE_COVERAGE}" == "xyes" ; then - COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" - AC_MSG_RESULT([compiling in code coverage mode]) -else - AC_MSG_RESULT([not compiling in code coverage mode]) -fi - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() diff --git a/src/modules/db/etc/connectionManagerFactory.xml b/src/modules/db/etc/connectionManagerFactory.xml deleted file mode 100644 index 9e7c74905..000000000 --- a/src/modules/db/etc/connectionManagerFactory.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - -]> - - - diff --git a/src/modules/db/etc/connectionManagerFactory.xml.template b/src/modules/db/etc/connectionManagerFactory.xml.template deleted file mode 100644 index 5c0df33ff..000000000 --- a/src/modules/db/etc/connectionManagerFactory.xml.template +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - -]> - - - diff --git a/src/modules/db/etc/doxygen.config b/src/modules/db/etc/doxygen.config deleted file mode 100644 index c8e2f7373..000000000 --- a/src/modules/db/etc/doxygen.config +++ /dev/null @@ -1,1139 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -# Doxyfile 1.3.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Campcaster - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/doxygen - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is used -# as the annotated text. Otherwise, the brief description is used as-is. If left -# blank, the following values are used ("$name" is automatically replaced with the -# name of the entity): "The $name class" "The $name widget" "The $name file" -# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = YES - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = include src - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - -INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = include - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superseded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/src/modules/db/etc/simpleConnectionManager.xml b/src/modules/db/etc/simpleConnectionManager.xml deleted file mode 100644 index aa25afaab..000000000 --- a/src/modules/db/etc/simpleConnectionManager.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - -]> - diff --git a/src/modules/db/etc/simpleConnectionManager.xml.template b/src/modules/db/etc/simpleConnectionManager.xml.template deleted file mode 100644 index aaec38768..000000000 --- a/src/modules/db/etc/simpleConnectionManager.xml.template +++ /dev/null @@ -1,12 +0,0 @@ - - - - - -]> - diff --git a/src/modules/db/etc/testResultToHtml.xsl b/src/modules/db/etc/testResultToHtml.xsl deleted file mode 100644 index f9e893521..000000000 --- a/src/modules/db/etc/testResultToHtml.xsl +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - Campcaster unit test results - - -

Preface

-This document is part of the -Campcaster -project, Copyright © 2004 Media -Development Loan Fund, under the GNU -GPL. -
-This is an automatically generated document. -

Scope

-This document contains the generated unit test results for the -Campcaster project. -

Summary

- - - - - - - - - - - - - - - - - - -
Total number of tests:
Tests passed:
Tests failed:
Test errors:
-
-

Tests

- - - - - - - - - - - - - -
test nametest status
failedpassed
- - -
- -
- diff --git a/src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h b/src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h deleted file mode 100644 index 609eb1584..000000000 --- a/src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h +++ /dev/null @@ -1,182 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Db_ConnectionManagerFactory_h -#define LiveSupport_Db_ConnectionManagerFactory_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Db/ConnectionManagerInterface.h" - - -namespace LiveSupport { -namespace Db { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The factory to create appropriate ConnectionManager objects. - * This singleton class has to be configured with an XML element, - * describing the ConnectionManagerInterface that it should build - * and maintain. This is done by including the configuration element - * for the desired type of connection manager inside the configuration - * element for the factory. - * - * Currently only the SimpleConnectionManager is supported, thus a - * configuration file may look like this: - * - *

- *  <connectionManagerFactory>
- *      
- *  </connectionManagerFactory>
- *  
- * - * The DTD for the above XML structure is: - * - *

- *  
- *  
- * - * For the DTD and details of the simpleConnectionManager configuration - * element, see the SimpleConnectionManager documentation. - * - * @see SimpleConnectionManager - */ -class ConnectionManagerFactory : - virtual public Configurable -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The connection manager created by this factory. - */ - Ptr::Ref connectionManager; - - /** - * The default constructor. - */ - ConnectionManagerFactory(void) throw() - { - } - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~ConnectionManagerFactory(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Return a connection manager. - * - * @return the appropriate connection manager, according to the - * configuration of this factory. - */ - Ptr::Ref - getConnectionManager(void) throw () - { - return connectionManager; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Db -} // namespace LiveSupport - -#endif // LiveSupport_Db_ConnectionManagerFactory_h - diff --git a/src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h b/src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h deleted file mode 100644 index 65ea45bc2..000000000 --- a/src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h +++ /dev/null @@ -1,106 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Db_ConnectionManagerInterface_h -#define LiveSupport_Db_ConnectionManagerInterface_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - - -#include "LiveSupport/Core/Ptr.h" - -namespace LiveSupport { -namespace Db { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The interface for handing out and managing database connections. - */ -class ConnectionManagerInterface -{ - public: - /** - * Get a database connection from the manager. - * After use, the connection must be returned by calling - * returnConnection(). - * - * @return a database connection to the database this manager - * serves. - * @see #returnConnection - */ - virtual Ptr::Ref - getConnection(void) throw (std::runtime_error) - = 0; - - /** - * Return a database connection previously aquired by a call to - * getConnection(), after it is not needed anymore. - * - * @param connection the connection to return. - * @see #getConnection - */ - virtual void - returnConnection(Ptr::Ref connection) - throw (std::runtime_error) - = 0; - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~ConnectionManagerInterface(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Db -} // namespace LiveSupport - -#endif // LiveSupport_Db_ConnectionManagerInterface_h - diff --git a/src/modules/db/include/LiveSupport/Db/Conversion.h b/src/modules/db/include/LiveSupport/Db/Conversion.h deleted file mode 100644 index 893a6c607..000000000 --- a/src/modules/db/include/LiveSupport/Db/Conversion.h +++ /dev/null @@ -1,117 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Db_Conversion_h -#define LiveSupport_Db_Conversion_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Db { - -using namespace boost; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A helper object holding static conversion functions, that are - * helpful when accessing databases. - */ -class Conversion -{ - private: - /** - * The default constructor. - */ - Conversion(void) throw () - { - } - - - public: - /** - * Constants to specify whether we round time values up or down. - */ - typedef enum { roundDown, - roundUp, - roundNearest } RoundingType; - - /** - * Convert a boost::ptime to a odbc::Timestamp. - * - * @param ptime the boost ptime to convert. - * @param round specify how to round the fractional part - * (default: down). - * @return an odbc::Timestamp, holding the same time. - */ - static Ptr::Ref - ptimeToTimestamp(Ptr::Ref ptime, - RoundingType round = roundDown) - throw (); - - /** - * Convert an odbc::Timestamp to a boost::ptime. - * - * @param timestamp an odbc::Timestamp to convert. - * @return a boost ptime, holding the same time. - */ - static Ptr::Ref - timestampToPtime(Ptr::Ref timestamp) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Db -} // namespace LiveSupport - -#endif // LiveSupport_Db_Conversion_h - diff --git a/src/modules/db/lib/.keepme b/src/modules/db/lib/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/db/lib/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/db/src/ConnectionManagerFactory.cxx b/src/modules/db/src/ConnectionManagerFactory.cxx deleted file mode 100644 index f7c695b00..000000000 --- a/src/modules/db/src/ConnectionManagerFactory.cxx +++ /dev/null @@ -1,105 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "SimpleConnectionManager.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string ConnectionManagerFactory::configElementNameStr = - "connectionManagerFactory"; - -/*------------------------------------------------------------------------------ - * The singleton instance of ConnectionManagerFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref ConnectionManagerFactory::singleton; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance to ConnectionManagerFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref -ConnectionManagerFactory :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new ConnectionManagerFactory()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the connection manager factory. - *----------------------------------------------------------------------------*/ -void -ConnectionManagerFactory :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - connectionManager.reset(); - - // try to look for a SimpleConnectionManager configuration element - xmlpp::Node::NodeList nodes = element.get_children( - SimpleConnectionManager::getConfigElementName()); - if (nodes.size() >= 1) { - const xmlpp::Element * configElement = - dynamic_cast (*(nodes.begin())); - Ptr::Ref scm(new SimpleConnectionManager()); - scm->configure(*configElement); - connectionManager = scm; - } - - if (!connectionManager) { - throw std::invalid_argument("no storage client factories to configure"); - } -} - - diff --git a/src/modules/db/src/ConnectionManagerFactoryTest.cxx b/src/modules/db/src/ConnectionManagerFactoryTest.cxx deleted file mode 100644 index 3dc2fd854..000000000 --- a/src/modules/db/src/ConnectionManagerFactoryTest.cxx +++ /dev/null @@ -1,122 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "ConnectionManagerFactoryTest.h" - - -using namespace odbc; -using namespace LiveSupport::Db; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(ConnectionManagerFactoryTest); - -/** - * The name of the configuration file for the connection manager factory. - */ -static const std::string configFileName = "connectionManagerFactory.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -ConnectionManagerFactoryTest :: setUp(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -ConnectionManagerFactoryTest :: tearDown(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Test to see if the singleton Hello object is accessible - *----------------------------------------------------------------------------*/ -void -ConnectionManagerFactoryTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - configFileName); - const xmlpp::Element * root = document->get_root_node(); - Ptr::Ref cmf = - ConnectionManagerFactory::getInstance(); - - cmf->configure(*root); - - Ptr::Ref cm = cmf->getConnectionManager(); - CPPUNIT_ASSERT(cm); - - Ptr::Ref connection = cm->getConnection(); - CPPUNIT_ASSERT(connection); - - // so far, so good. now simply execute "SELECT 1", and see if - // it works - Ptr::Ref stmt(connection->createStatement()); - Ptr::Ref rs(stmt->executeQuery("SELECT 1")); - CPPUNIT_ASSERT(rs->next()); - CPPUNIT_ASSERT(rs->getInt(1) == 1); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } catch (std::runtime_error &e) { - CPPUNIT_FAIL(e.what()); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL(e.what()); - } -} - diff --git a/src/modules/db/src/ConnectionManagerFactoryTest.h b/src/modules/db/src/ConnectionManagerFactoryTest.h deleted file mode 100644 index a7382bfc8..000000000 --- a/src/modules/db/src/ConnectionManagerFactoryTest.h +++ /dev/null @@ -1,103 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ConnectionManagerFactoryTest_h -#define ConnectionManagerFactoryTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/BaseTestMethod.h" - - -namespace LiveSupport { -namespace Db { - -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the ConnectionManagerFactory class. - * - * @see ConnectionManagerFactory - */ -class ConnectionManagerFactoryTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(ConnectionManagerFactoryTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Db -} // namespace LiveSupport - -#endif // ConnectionManagerFactoryTest_h - diff --git a/src/modules/db/src/Conversion.cxx b/src/modules/db/src/Conversion.cxx deleted file mode 100644 index d0012471e..000000000 --- a/src/modules/db/src/Conversion.cxx +++ /dev/null @@ -1,92 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Db/Conversion.h" - - -using namespace boost; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Convert a boost::ptime to an odbc::Timestamp - *----------------------------------------------------------------------------*/ -Ptr::Ref -Conversion :: ptimeToTimestamp(Ptr::Ref ptime, - RoundingType round) - throw () -{ - posix_time::ptime newPtime = *ptime; - if (round == roundUp && newPtime.time_of_day().fractional_seconds() != 0) { - newPtime += posix_time::seconds(1); - } else if (round == roundNearest) { - newPtime += posix_time::microseconds(500000); - } - - gregorian::date date = newPtime.date(); - posix_time::time_duration time = newPtime.time_of_day(); - - Ptr::Ref timestamp(new odbc::Timestamp(date.year(), - date.month(), - date.day(), - time.hours(), - time.minutes(), - time.seconds())); - return timestamp; -} - - -/*------------------------------------------------------------------------------ - * Convert an odbc::Timestamp to a boost::ptime - *----------------------------------------------------------------------------*/ -Ptr::Ref -Conversion :: timestampToPtime(Ptr::Ref timestamp) - throw() -{ - // don't convert through the time_t format, as probably because of - // timezone settings, boost::posix_time::from_time_t() ruins the - // actual value - std::string timeStr = timestamp->toString(); - Ptr::Ref ptime(new posix_time::ptime( - posix_time::time_from_string(timeStr))); - return ptime; -} - diff --git a/src/modules/db/src/SimpleConnectionManager.cxx b/src/modules/db/src/SimpleConnectionManager.cxx deleted file mode 100644 index 81254d578..000000000 --- a/src/modules/db/src/SimpleConnectionManager.cxx +++ /dev/null @@ -1,146 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "SimpleConnectionManager.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string SimpleConnectionManager::configElementNameStr = - "simpleConnectionManager"; - -/** - * The name of the attribute to get the dsn for the connection. - */ -static const std::string dsnAttrName = "dsn"; - -/** - * The name of the attribute to get the userName for the connection. - */ -static const std::string userNameAttrName = "userName"; - -/** - * The name of the attribute to get the password for the connection. - */ -static const std::string passwordAttrName = "password"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the connection manager factory. - *----------------------------------------------------------------------------*/ -void -SimpleConnectionManager :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - const xmlpp::Attribute * attribute = 0; - - if (!(attribute = element.get_attribute(dsnAttrName))) { - std::string eMsg = "Missing attribute "; - eMsg += dsnAttrName; - throw std::invalid_argument(eMsg); - } - dsn = attribute->get_value(); - - if (!(attribute = element.get_attribute(userNameAttrName))) { - std::string eMsg = "Missing attribute "; - eMsg += userNameAttrName; - throw std::invalid_argument(eMsg); - } - userName = attribute->get_value(); - - if (!(attribute = element.get_attribute(passwordAttrName))) { - std::string eMsg = "Missing attribute "; - eMsg += passwordAttrName; - throw std::invalid_argument(eMsg); - } - password = attribute->get_value(); -} - - -/*------------------------------------------------------------------------------ - * Give out a connection. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SimpleConnectionManager :: getConnection(void) - throw (std::runtime_error) -{ - odbc::Connection * conn; - try { - conn = odbc::DriverManager::getConnection(dsn, userName, password); - } catch (std::exception &e) { - throw std::runtime_error(e.what()); - } - - if (!conn) { - std::string eMsg = "unable to open ODBC connection for DSN "; - eMsg += dsn; - throw std::runtime_error(eMsg); - } - - Ptr::Ref connection(conn); - return connection; -} - - -/*------------------------------------------------------------------------------ - * Receive a connection back. - *----------------------------------------------------------------------------*/ -void -SimpleConnectionManager :: returnConnection( - Ptr::Ref connection) - throw (std::runtime_error) -{ - // nothing to do here... - // we could save the outgoing connections to a set in getConnection() - // and check here to see if the returned one is contained there -} - diff --git a/src/modules/db/src/SimpleConnectionManager.h b/src/modules/db/src/SimpleConnectionManager.h deleted file mode 100644 index 8aa98f942..000000000 --- a/src/modules/db/src/SimpleConnectionManager.h +++ /dev/null @@ -1,184 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SimpleConnectionManager_h -#define SimpleConnectionManager_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include -#include - - -namespace LiveSupport { -namespace Db { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A simple connection manager, basically a facade to the underlying - * odbc::DriverManager class. - * This class can be configured with the following XML element, containing - * the ODBC Data Source Name (DSN), ODBC user name and ODBC password - * the manager will connect with to the ODBC source. The XML element looks - * as follows: - * - *

- *  
- *  
- * - * The DTD for the above XML structure is: - * - *

- *  
- *  
- *  
- *  
- *  
- */ -class SimpleConnectionManager : - virtual public Configurable, - virtual public ConnectionManagerInterface -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The ODBC Data Source Name this manager connects to. - */ - std::string dsn; - - /** - * The user name to use when connecting to the ODBC DSN. - */ - std::string userName; - - /** - * The password to use when connecting to the ODBC DSN. - */ - std::string password; - - - public: - /** - * The default constructor. - */ - SimpleConnectionManager(void) throw () - { - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~SimpleConnectionManager(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Get a database connection from the manager. - * After use, the connection must be returned by calling - * returnConnection(). - * - * @return a database connection to the database this manager - * serves. - * @see #returnConnection - */ - virtual Ptr::Ref - getConnection(void) throw (std::runtime_error); - - /** - * Return a database connection previously aquired by a call to - * getConnection(), after it is not needed anymore. - * - * @param connection the connection to return. - * @see #getConnection - */ - virtual void - returnConnection(Ptr::Ref connection) - throw (std::runtime_error); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Db -} // namespace LiveSupport - -#endif // SimpleConnectionManager_h - diff --git a/src/modules/db/src/SimpleConnectionManagerTest.cxx b/src/modules/db/src/SimpleConnectionManagerTest.cxx deleted file mode 100644 index 232afe44d..000000000 --- a/src/modules/db/src/SimpleConnectionManagerTest.cxx +++ /dev/null @@ -1,206 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include -#include - -#include "SimpleConnectionManager.h" -#include "SimpleConnectionManagerTest.h" - - -using namespace odbc; -using namespace LiveSupport::Db; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(SimpleConnectionManagerTest); - -/** - * The name of the configuration file for the connection manager. - */ -static const std::string configFileName = "simpleConnectionManager.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -SimpleConnectionManagerTest :: setUp(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -SimpleConnectionManagerTest :: tearDown(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Test to see if the singleton Hello object is accessible - *----------------------------------------------------------------------------*/ -void -SimpleConnectionManagerTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - configFileName); - const xmlpp::Element * root = document->get_root_node(); - Ptr::Ref scm(new SimpleConnectionManager()); - - scm->configure(*root); - - Ptr::Ref connection = scm->getConnection(); - CPPUNIT_ASSERT(connection); - - // so far, so good. now simply execute "SELECT 1", and see if - // it works - Ptr::Ref stmt(connection->createStatement()); - Ptr::Ref rs(stmt->executeQuery("SELECT 1")); - CPPUNIT_ASSERT(rs->next()); - CPPUNIT_ASSERT(rs->getInt(1) == 1); - - rs.reset(); - stmt->close(); - stmt.reset(); - scm->returnConnection(connection); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } catch (std::runtime_error &e) { - CPPUNIT_FAIL(e.what()); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Test to handle large integers. - *----------------------------------------------------------------------------*/ -void -SimpleConnectionManagerTest :: bigIntTest(void) - throw (CPPUNIT_NS::Exception) -{ - long long testValue = 0x7fffffffffffffffLL; - std::string createStmt = "CREATE TABLE testTable\n" - "(\n" - " id BIGINT NOT NULL\n" - ");"; - bool b; - - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - configFileName); - const xmlpp::Element * root = document->get_root_node(); - Ptr::Ref scm(new SimpleConnectionManager()); - - scm->configure(*root); - - Ptr::Ref connection = scm->getConnection(); - CPPUNIT_ASSERT(connection); - - // simply see if selecting the highest 63 bit number works... - Ptr::Ref pstmt(connection->prepareStatement( - "SELECT ?")); - pstmt->setLong(1, testValue); - Ptr::Ref rs(pstmt->executeQuery()); - CPPUNIT_ASSERT(rs->next()); - CPPUNIT_ASSERT(rs->getLong(1) == testValue); - rs.reset(); - pstmt->close(); - pstmt.reset(); - - // so far, so good. now create a table with a BIGINT column - // and try the same - Ptr::Ref stmt(connection->createStatement()); - stmt->execute(createStmt); - stmt->close(); - stmt.reset(); - - pstmt.reset(connection->prepareStatement("INSERT INTO testTable " - " VALUES(?)")); - pstmt->setLong(1, testValue); - CPPUNIT_ASSERT(pstmt->executeUpdate() == 1); - pstmt->close(); - pstmt.reset(); - - stmt.reset(connection->createStatement()); - rs.reset(stmt->executeQuery("SELECT * FROM testTable")); - CPPUNIT_ASSERT(rs->next()); -//std::cerr << std::endl; -//std::cerr << "rs->getLong: " << rs->getLong(1) << std::endl; -//std::cerr << "testValue: " << testValue << std::endl; - b = rs->getLong(1) == testValue; - CPPUNIT_ASSERT(b); - rs.reset(); - stmt->close(); - stmt.reset(); - - stmt.reset(connection->createStatement()); - stmt->executeUpdate("DROP TABLE testTable"); - stmt->close(); - stmt.reset(); - - scm->returnConnection(connection); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } catch (std::runtime_error &e) { - CPPUNIT_FAIL(e.what()); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL(e.what()); - } catch (SQLException &e) { - CPPUNIT_FAIL(e.what()); - } -} - diff --git a/src/modules/db/src/SimpleConnectionManagerTest.h b/src/modules/db/src/SimpleConnectionManagerTest.h deleted file mode 100644 index 8feebcc5e..000000000 --- a/src/modules/db/src/SimpleConnectionManagerTest.h +++ /dev/null @@ -1,112 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SimpleConnectionManagerTest_h -#define SimpleConnectionManagerTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/BaseTestMethod.h" - - -namespace LiveSupport { -namespace Db { - -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the SimpleConnectionManager class. - * - * @see SimpleConnectionManager - */ -class SimpleConnectionManagerTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(SimpleConnectionManagerTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(bigIntTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to handle large integers. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - bigIntTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Db -} // namespace LiveSupport - -#endif // SimpleConnectionManagerTest_h - diff --git a/src/modules/db/src/TestRunner.cxx b/src/modules/db/src/TestRunner.cxx deleted file mode 100644 index 8ce1c29bb..000000000 --- a/src/modules/db/src/TestRunner.cxx +++ /dev/null @@ -1,275 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -using namespace LiveSupport::Core; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * Our copyright notice, should be at most 80 columns - */ -static const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -static const char options[] = "ho:s:v"; - -/** - * Structure describing the long options - */ -static const struct option longOptions[] = { - { "help", no_argument, 0, 'h' }, - { "output", required_argument, 0, 'o' }, - { "stylesheet", required_argument, 0, 's' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } -}; - -/** - * The encoding to use for the output file. - */ -static const std::string encoding = "utf-8"; - -/** - * The output XML file name. - */ -static Ptr::Ref xmlOutFileName; - -/** - * The XSLT attached to the output file. - */ -static Ptr::Ref xsltFileName; - - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -static void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -static void -printUsage ( const char invocation[], - std::ostream & os ); - -/** - * Process command line arguments. - * - * @param argc the number of arguments. - * @param argv the arguments themselves. - * @return true of all went well, false in case the program should exit - * after this call. - */ -static bool -processArguments(int argc, char *argv[]); - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Run all tests - *----------------------------------------------------------------------------*/ -int -main( int argc, - char * argv[] ) throw () -{ - if (!processArguments(argc, argv)) { - return 0; - } - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as test run. - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - // Add the top suite to the test runner - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - runner.run( controller ); - - // Print test in a compiler compatible format. - CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr ); - outputter.setLocationFormat("%p:%l:"); - outputter.write(); - - // also generate an XML document as an output - std::ofstream xmlOutFile(xmlOutFileName->c_str()); - CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); - xmlOutputter.setStandalone(false); - if (xsltFileName) { - xmlOutputter.setStyleSheet(*xsltFileName); - } - xmlOutputter.write(); - xmlOutFile.flush(); - xmlOutFile.close(); - - return result.wasSuccessful() ? 0 : 1; -} - - -/*------------------------------------------------------------------------------ - * Process command line arguments. - *----------------------------------------------------------------------------*/ -static bool -processArguments(int argc, char *argv[]) -{ - int i; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'h': - printUsage(argv[0], std::cout); - return false; - - case 'o': - xmlOutFileName.reset(new std::string(optarg)); - break; - - case 's': - xsltFileName.reset(new std::string(optarg)); - break; - - case 'v': - printVersion(std::cout); - return false; - - default: - printUsage(argv[0], std::cout); - return false; - } - } - - if (optind < argc) { - std::cerr << "error processing command line arguments" << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - if (!xmlOutFileName) { - std::cerr << "mandatory option output file name not specified" - << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; - if (xsltFileName) { - std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -static void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -static void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION]" - << std::endl - << " mandatory options:" << std::endl - << " -o, --output=file.name write test results into this XML file" - << std::endl - << " optional options:" << std::endl - << " -s, --stylesheet specify this XSLT for the output file" - << std::endl - << " this is either an absolute URI, or a" - << std::endl - << " relative path for the output document" - << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/modules/db/tmp/.keepme b/src/modules/db/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/db/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/widgets/bin/autogen.sh b/src/modules/widgets/bin/autogen.sh deleted file mode 100755 index 20187cd2c..000000000 --- a/src/modules/widgets/bin/autogen.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="Widgets" - -# assume we're in $basedir/bin -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -echo " aclocal $ACLOCAL_FLAGS" -cp -f ${configure_ac} ${tmpdir} -cp -f ${etcdir}/acinclude.m4 ${tmpdir} -aclocal $ACLOCAL_FLAGS - -echo " autoheader ${configure_ac}" -autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/modules/widgets/configure b/src/modules/widgets/configure deleted file mode 100755 index 26ccda218..000000000 --- a/src/modules/widgets/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen $*) -fi - -(cd $tmpdir && $configure $*) - diff --git a/src/modules/widgets/doc/.keepme b/src/modules/widgets/doc/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/widgets/doc/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/widgets/etc/Makefile.in b/src/modules/widgets/etc/Makefile.in deleted file mode 100644 index af6f4dfa5..000000000 --- a/src/modules/widgets/etc/Makefile.in +++ /dev/null @@ -1,225 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# @configure_input@ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -CP = cp -f - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -PACKAGE_NAME = @PACKAGE_NAME@ - -BASE_DIR = @builddir@ -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -ETC_DIR = ${BASE_DIR}/etc -INCLUDE_DIR = ${BASE_DIR}/include -LIB_DIR = ${BASE_DIR}/lib -SRC_DIR = ${BASE_DIR}/src -TMP_DIR = ${BASE_DIR}/tmp -VAR_DIR = ${BASE_DIR}/var - -prefix = @prefix@ - -USR_DIR = ${prefix} -USR_INCLUDE_DIR = ${USR_DIR}/include -USR_BIN_DIR = ${USR_DIR}/bin -USR_LIB_DIR = ${USR_DIR}/lib -USR_VAR_DIR = ${USR_DIR}/var - -MODULES_DIR = ${BASE_DIR}/.. - -CORE_DIR = ${MODULES_DIR}/core -CORE_INCLUDE_DIR = ${CORE_DIR}/include -CORE_LIB_DIR = ${CORE_DIR}/lib -CORE_LIB = livesupport_core -CORE_LIB_FILE = ${CORE_LIB_DIR}/lib${CORE_LIB}.a - -GENRB = @GENRB@ -TMP_LOCALIZATION_DIR = ${TMP_DIR}/localization -GENRBOPTS = --destdir ${TMP_LOCALIZATION_DIR} \ - --encoding utf-8 \ - --strict - -VPATH = ${SRC_DIR} - -BOOST_CFLAGS=@BOOST_CPPFLAGS@ -BOOST_LIBS=@BOOST_LDFLAGS@ -BOOST_DATE_TIME_LIB=@BOOST_DATE_TIME_LIB@ - -LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ -LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ - -ICU_CFLAGS=@ICU_CFLAGS@ -ICU_CXXFLAGS=@ICU_CXXFLAGS@ -ICU_LIBS=@ICU_LIBS@ - -GTKMM_CFLAGS=@GTKMM_CFLAGS@ -GTKMM_LIBS=@GTKMM_LIBS@ - -LIBGLADEMM_CFLAGS=@LIBGLADEMM_CFLAGS@ -LIBGLADEMM_LIBS=@LIBGLADEMM_LIBS@ - -TEST_RESULTS = ${DOC_DIR}/testResults.xml -# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR -TEST_XSLT = ../etc/testResultToHtml.xsl - -WIDGETS_LIB = livesupport_widgets -WIDGETS_LIB_FILE = ${LIB_DIR}/lib${WIDGETS_LIB}.a -TEST_EXE = ${TMP_DIR}/test -TEST_CFG = ${ETC_DIR}/widgetFactory.xml - -DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config - -export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} - - -#------------------------------------------------------------------------------- -# Configuration parameters -#------------------------------------------------------------------------------- -CPPFLAGS = @CPPFLAGS@ -CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ - -pedantic -Wall -Wno-long-long \ - ${BOOST_CFLAGS} \ - ${LIBXMLPP_CFLAGS} \ - ${ICU_CFLAGS} \ - ${GTKMM_CFLAGS} \ - ${LIBGLADEMM_CFLAGS} \ - -I${USR_INCLUDE_DIR} \ - -I${CORE_INCLUDE_DIR} \ - -I${INCLUDE_DIR} -I${TMP_DIR} -LDFLAGS = @LDFLAGS@ -pthread \ - ${BOOST_LIBS} \ - ${LIBXMLPP_LIBS} \ - ${ICU_LIBS} \ - ${GTKMM_LIBS} \ - ${LIBGLADEMM_LIBS} \ - -L${USR_LIB_DIR} \ - -L${CORE_LIB_DIR} \ - -L${LIB_DIR} - - -#------------------------------------------------------------------------------- -# Dependencies -#------------------------------------------------------------------------------- -WIDGETS_LIB_OBJS = ${TMP_DIR}/ComboBoxText.o \ - ${TMP_DIR}/MetadataComboBoxText.o \ - ${TMP_DIR}/OperatorComboBoxText.o \ - ${TMP_DIR}/WidgetFactory.o \ - ${TMP_DIR}/Colors.o \ - ${TMP_DIR}/ZebraTreeView.o \ - ${TMP_DIR}/ZebraCellRenderer.o - -TEST_EXE_OBJS = ${TMP_DIR}/TestWindow.o \ - ${TMP_DIR}/main.o - -TEST_RUNNER_RES = ${TMP_LOCALIZATION_DIR}/root.res \ - ${TMP_LOCALIZATION_DIR}/en.res \ - ${TMP_LOCALIZATION_DIR}/hu.res - -TEST_EXE_LIBS = -l${WIDGETS_LIB} -l${CORE_LIB} ${ICU_LIBS} \ - ${BOOST_DATE_TIME_LIB} -lxmlrpc++ -lssl - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -.PHONY: all dir_setup doc clean docclean depclean distclean check install - -all: dir_setup ${WIDGETS_LIB_FILE} - -dir_setup: ${TMP_DIR} ${TMP_LOCALIZATION_DIR} ${DOXYGEN_DIR} - -doc: - ${DOXYGEN} ${DOXYGEN_CONFIG} - -clean: - ${RM} ${WIDGETS_LIB_OBJS} ${WIDGETS_LIB_FILE} - ${RM} ${TEST_EXE_OBJS} ${TEST_EXE} - ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info - ${RMDIR} ${TMP_LOCALIZATION_DIR} - -docclean: - ${RMDIR} ${DOXYGEN_DIR}/html - ${RMDIR} ${COVERAGE_DIR}/* - ${RM} ${TEST_RESULTS} - -depclean: clean - -distclean: clean docclean - ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 - -run: all ${TEST_EXE} ${TEST_RUNNER_RES} - ${TEST_EXE} -c ${TEST_CFG} - -check: all - -install: all - ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/Widgets - ${CP} ${INCLUDE_DIR}/LiveSupport/Widgets/*.h \ - ${USR_INCLUDE_DIR}/LiveSupport/Widgets - ${CP} ${WIDGETS_LIB_FILE} ${USR_LIB_DIR} - ${MKDIR} ${USR_VAR_DIR}/Campcaster/Widgets/icons - ${CP} ${VAR_DIR}/icons/*.png \ - ${USR_VAR_DIR}/Campcaster/Widgets/icons - - -#------------------------------------------------------------------------------- -# Specific targets -#------------------------------------------------------------------------------- -${WIDGETS_LIB_FILE}: ${WIDGETS_LIB_OBJS} - ${AR} crus $@ $^ - -${TMP_DIR}: - ${MKDIR} ${TMP_DIR} - -${TMP_LOCALIZATION_DIR}: - ${MKDIR} ${TMP_LOCALIZATION_DIR} - -${DOXYGEN_DIR}: - ${MKDIR} ${DOXYGEN_DIR} - -${TEST_EXE}: ${CORE_LIB_FILE} ${TEST_EXE_OBJS} ${WIDGETS_LIB_FILE} - ${CXX} ${LDFLAGS} -o $@ ${TEST_EXE_OBJS} ${TEST_EXE_LIBS} \ - ${WIDGETS_LIB_FILE} - -${CORE_LIB_FILE}: - ${MAKE} -C ${CORE_DIR} - - -#------------------------------------------------------------------------------- -# Pattern rules -#------------------------------------------------------------------------------- -${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx - ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< - -${TMP_LOCALIZATION_DIR}/%.res : ${VAR_DIR}/%.txt - ${GENRB} ${GENRBOPTS} $^ - diff --git a/src/modules/widgets/etc/acinclude.m4 b/src/modules/widgets/etc/acinclude.m4 deleted file mode 100644 index 0c67c1126..000000000 --- a/src/modules/widgets/etc/acinclude.m4 +++ /dev/null @@ -1,463 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl Macro to check for available modules using pkg-conf -dnl -dnl usage: -dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) -dnl -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -dnl -dnl This function was taken from the glade-- project -dnl----------------------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for C++ namespaces -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html -dnl -dnl usage: -dnl If the compiler can prevent names clashes using namespaces, -dnl define HAVE_NAMESPACES. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CXX_NAMESPACES], -[AC_CACHE_CHECK(whether the compiler implements namespaces, -ac_cv_cxx_namespaces, -[AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], - [using namespace Outer::Inner; return i;], - ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) - AC_LANG_RESTORE -]) -if test "$ac_cv_cxx_namespaces" = yes; then - AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) -fi -]) - - -dnl----------------------------------------------------------------------------- -dnl Test for the Boost C++ libraries of a particular version (or newer). -dnl for more information on boost, see http://www.boost.org/ -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ax_boost_base.html -dnl -dnl usage: -dnl If no path to the installed boost library is given the macro searches -dnl under ${prefix}, /usr, /usr/local, and /opt, and evaluates the $BOOST_ROOT -dnl environment variable. Further documentation is available at -dnl http://randspringer.de/boost/index.html -dnl -dnl This macro calls: AC_SUBST(BOOST_CPPFLAGS) and AC_SUBST(BOOST_LDFLAGS) -dnl and sets: HAVE_BOOST -dnl -dnl Modified for Campcaster: -dnl * --with-boost default changed to Yes; -dnl * if the library is not found, it does not die, just prints "no", leaves -dnl HAVE_BOOST undefined, and sets the BOOST_CPPFLAGS and BOOST_LDFLAGS -dnl variables to ""; -dnl * ${prefix} is prepended to the search path. -dnl -dnl Author: Thomas Porschberg -dnl -dnl License: -dnl Copyright © 2006 Thomas Porschberg -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AX_BOOST_BASE], -[ -AC_ARG_WITH([boost], - AS_HELP_STRING([--with-boost@<:@=DIR@:>@], [use boost (default is Yes) - it is possible to specify the root directory for boost (optional)]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ac_boost_path="" - else - want_boost="yes" - ac_boost_path="$withval" - fi - ], - [want_boost="yes"]) - -if test "x$want_boost" = "xyes"; then - boost_lib_version_req=ifelse([$1], ,1.20.0,$1) - boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` - boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` - boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$boost_lib_version_req_sub_minor" = "x" ; then - boost_lib_version_req_sub_minor="0" - fi - WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` - AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) - succeeded=no - - dnl first we check the system location for boost libraries - dnl this location ist chosen if boost libraries are installed with the --layout=system option - dnl or if you install boost with RPM - if test "$ac_boost_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_path/lib" - BOOST_CPPFLAGS="-I$ac_boost_path/include" - else - for ac_boost_path_tmp in ${prefix} /usr /usr/local /opt ; do - if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then - BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib" - BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" - break; - fi - done - fi - - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - - - - dnl if we found no boost with system layout we search for boost libraries - dnl built and installed without the --layout=system option or for a staged(not installed) version - if test "x$succeeded" != "xyes"; then - _version=0 - if test "$ac_boost_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_path/lib" - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - fi - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" - done - fi - else - for ac_boost_path in /usr /usr/local /opt ; do - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - best_path=$ac_boost_path - fi - done - fi - done - - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - BOOST_LDFLAGS="-L$best_path/lib" - - if test "x$BOOST_ROOT" != "x"; then - if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/lib" && test -r "$BOOST_ROOT/stage/lib"; then - version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` - stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` - stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` - V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "$V_CHECK" = "1" ; then - AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) - BOOST_CPPFLAGS="-I$BOOST_ROOT" - BOOST_LDFLAGS="-L$BOOST_ROOT/stage/lib" - fi - fi - fi - fi - - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - fi - - if test "$succeeded" != "yes" ; then - BOOST_CPPFLAGS="" - BOOST_LDFLAGS="" - AC_MSG_RESULT(no) - else - AC_SUBST(BOOST_CPPFLAGS) - AC_SUBST(BOOST_LDFLAGS) - AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" -fi - -]) - - -dnl----------------------------------------------------------------------------- -dnl Test for Date_Time library from the Boost C++ libraries. -dnl for more information on boost, see http://www.boost.org/ -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ax_boost_date_time.html -dnl -dnl usage: -dnl The macro requires a preceding call to AX_BOOST_BASE. -dnl Further documentation is available at -dnl . -dnl -dnl This macro calls: AC_SUBST(BOOST_DATE_TIME_LIB) -dnl and sets: HAVE_BOOST_DATE_TIME -dnl -dnl Modified for Campcaster: -dnl * --with-boost-date-time default changed to Yes. -dnl * added some more recognized suffixes to the library's name, incl. "-st". -dnl -dnl Authors: -dnl Thomas Porschberg -dnl Michael Tindal -dnl -dnl License: -dnl Copyright © 2006 Thomas Porschberg -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AX_BOOST_DATE_TIME], -[ - AC_ARG_WITH([boost-date-time], - AS_HELP_STRING([--with-boost-date-time@<:@=special-lib@:>@], - [use the Date_Time library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-date-time=boost_date_time-gcc-mt-d-1_33_1 ]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ax_boost_user_date_time_lib="" - else - want_boost="yes" - ax_boost_user_date_time_lib="$withval" - fi - ], - [want_boost="yes"] - ) - - if test "x$want_boost" = "xyes"; then - AC_REQUIRE([AC_PROG_CC]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_CACHE_CHECK(whether the Boost::Date_Time library is available, - ax_cv_boost_date_time, - [AC_LANG_PUSH([C++]) - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[@%:@include ]], - [[using namespace boost::gregorian; date d(2002,Jan,10); - return 0; - ]]), - ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) - AC_LANG_POP([C++]) - ]) - if test "x$ax_cv_boost_date_time" = "xyes"; then - AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::Date_Time library is available]) - BN=boost_date_time - if test "x$ax_boost_user_date_time_lib" = "x"; then - for ax_lib in $BN $BN-st $BN-mt $BN-mt-s $BN-s \ - $BN-$CC $BN-$CC-st $BN-$CC-mt $BN-$CC-mt-s $BN-$CC-s \ - lib$BN lib$BN-st lib$BN-mt lib$BN-mt-s lib$BN-s \ - lib$BN-$CC lib$BN-$CC-st lib$BN-$CC-mt lib$BN-$CC-mt-s lib$BN-$CC-s \ - $BN-mgw $BN-mgw $BN-mgw-st $BN-mgw-mt $BN-mgw-mt-s $BN-mgw-s ; do - AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB="-l$ax_lib" AC_SUBST(BOOST_DATE_TIME_LIB) link_date_time="yes" break], - [link_date_time="no"]) - done - else - for ax_lib in $ax_boost_user_date_time_lib $BN-$ax_boost_user_date_time_lib; do - AC_CHECK_LIB($ax_lib, main, - [BOOST_DATE_TIME_LIB="-l$ax_lib" AC_SUBST(BOOST_DATE_TIME_LIB) link_date_time="yes" break], - [link_date_time="no"]) - done - - fi - if test "x$link_date_time" = "xno"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - fi - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - fi -]) - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for ICU of sufficient version by looking at icu-config -dnl -dnl usage: -dnl AC_CHECK_ICU(version, action-if, action-not) -dnl -dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_ICU], [ - succeeded=no - - if test -z "$ICU_CONFIG"; then - AC_PATH_PROG(ICU_CONFIG, icu-config, no) - fi - - if test "$ICU_CONFIG" = "no" ; then - echo "*** The icu-config script could not be found. Make sure it is" - echo "*** in your path, and that taglib is properly installed." - echo "*** Or see http://ibm.com/software/globalization/icu/" - else - ICU_VERSION=`$ICU_CONFIG --version` - AC_MSG_CHECKING(for ICU >= $1) - VERSION_CHECK=`expr $ICU_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(ICU_CFLAGS) - ICU_CFLAGS=`$ICU_CONFIG --cflags` - AC_MSG_RESULT($ICU_CFLAGS) - - AC_MSG_CHECKING(ICU_CXXFLAGS) - ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` - AC_MSG_RESULT($ICU_CXXFLAGS) - - AC_MSG_CHECKING(ICU_LIBS) - ICU_LIBS=`$ICU_CONFIG --ldflags` - AC_MSG_RESULT($ICU_LIBS) - else - ICU_CFLAGS="" - ICU_CXXFLAGS="" - ICU_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find ICU >= $1",) - fi - - AC_SUBST(ICU_CFLAGS) - AC_SUBST(ICU_CXXFLAGS) - AC_SUBST(ICU_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) - fi -]) - diff --git a/src/modules/widgets/etc/configure.ac b/src/modules/widgets/etc/configure.ac deleted file mode 100644 index c1aff0e22..000000000 --- a/src/modules/widgets/etc/configure.ac +++ /dev/null @@ -1,130 +0,0 @@ -bdnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(Widgets, 0.0, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../src/ComboBoxText.cxx) - -AC_CONFIG_HEADERS(configure.h) -AC_PROG_CXX() - -AC_CHECK_HEADERS(getopt.h) - - -dnl----------------------------------------------------------------------------- -dnl specify whether debug info should be compiled into the executable -dnl----------------------------------------------------------------------------- -AC_SUBST(CXXFLAGS) - -AC_ARG_ENABLE([debug], - AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), - [], - [enable_debug=no]) - -if test "x${enable_debug}" = "xyes"; then - CXXFLAGS="-g -O0" - AC_DEFINE( YDEBUG, 1, [Debug is on] ) -else - CXXFLAGS="-O3" -fi - - -AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the pkg-config path -dnl----------------------------------------------------------------------------- -AC_ARG_WITH([pkg-config-path], - AC_HELP_STRING([--with-pkg-config-path], - [use the pkg-config path (prefix/lib/pkgconfig)]), - [PKG_CONFIG_PATH=${withval}], - [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig:$PKG_CONFIG_PATH]) - -AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) - -export PKG_CONFIG_PATH - -export PATH=${prefix}/bin:${PATH} - - -AX_BOOST_BASE([1.33.1]) -if test "x${BOOST_CPPFLAGS}" != "x"; then - AX_BOOST_DATE_TIME - if test "x${BOOST_DATE_TIME_LIB}" = "x"; then - AC_MSG_ERROR([Boost date-time library not found]) - fi -else - AC_MSG_ERROR([Boost library >= 1.33.1 not found]) -fi - -AC_CHECK_ICU(3.0) -AC_SUBST(ICU_CFLAGS) -AC_SUBST(ICU_CXXFLAGS) -AC_SUBST(ICU_LIBS) - -AC_PATH_PROG(GENRB, genrb) -AC_SUBST(GENRB) - -PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) -AC_SUBST(LIBXMLPP_CFLAGS) -AC_SUBST(LIBXMLPP_LIBS) - -PKG_CHECK_MODULES(GTKMM,[gtkmm-2.4 >= 2.5.5]) -AC_SUBST(GTKMM_CFLAGS) -AC_SUBST(GTKMM_LIBS) - -PKG_CHECK_MODULES(LIBGLADEMM,[libglademm-2.4 >= 2.6.2]) -AC_SUBST(LIBGLADEMM_CFLAGS) -AC_SUBST(LIBGLADEMM_LIBS) - - -dnl----------------------------------------------------------------------------- -dnl enable compilaton for code coverage data -dnl----------------------------------------------------------------------------- -AC_SUBST(COVERAGE_CXXFLAGS) - -AC_ARG_ENABLE( coverage, -[ --enable-coverage enable code coverage data generaton (no) ], - ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) - -if test "x${ENABLE_COVERAGE}" == "xyes" ; then - COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" - AC_MSG_RESULT([compiling in code coverage mode]) -else - AC_MSG_RESULT([not compiling in code coverage mode]) -fi - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() diff --git a/src/modules/widgets/etc/doxygen.config b/src/modules/widgets/etc/doxygen.config deleted file mode 100644 index c8e2f7373..000000000 --- a/src/modules/widgets/etc/doxygen.config +++ /dev/null @@ -1,1139 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -# Doxyfile 1.3.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Campcaster - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/doxygen - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is used -# as the annotated text. Otherwise, the brief description is used as-is. If left -# blank, the following values are used ("$name" is automatically replaced with the -# name of the entity): "The $name class" "The $name widget" "The $name file" -# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = YES - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = include src - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - -INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = include - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superseded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/src/modules/widgets/etc/resourceBundle.xml b/src/modules/widgets/etc/resourceBundle.xml deleted file mode 100644 index 56cf817d4..000000000 --- a/src/modules/widgets/etc/resourceBundle.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - -]> - diff --git a/src/modules/widgets/etc/widgetFactory.xml b/src/modules/widgets/etc/widgetFactory.xml deleted file mode 100644 index f8bdc64c3..000000000 --- a/src/modules/widgets/etc/widgetFactory.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - -]> - - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/Colors.h b/src/modules/widgets/include/LiveSupport/Widgets/Colors.h deleted file mode 100644 index 238a34141..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/Colors.h +++ /dev/null @@ -1,111 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_Colors_h -#define LiveSupport_Widgets_Colors_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "gdkmm/color.h" -#include "gdkmm/colormap.h" - - -namespace LiveSupport { -namespace Widgets { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A helper class to hold all the standard colors used by the LiveSupport GUI. - * - * The definitions of the colors can be found in doc/gui/styleguide.pdf; - * the last two colors were taken from doc/gui/designs/livemode.gif. - */ -class Colors -{ - public: - /** - * The names of the colors. - */ - typedef enum { White, Black, - LightBlue, BrightBlue, Blue, DarkBlue, - Gray, SlateGray, MediumBlueGray, DarkGray, - Yellow, Orange, Red, - MasterPanelCenterBlue, LiveModeRowBlue, - WindowBackground = White } ColorName; - - private: - /** - * The vector holding the colors. - */ - static std::map colors; - - /** - * This loads the colors. - */ - static void - initialize(void) throw (); - - /** - * Whether we have been initialized yet. - */ - bool - static initialized; - - public: - /** - * Get a color by its name. - */ - static const Gdk::Color& - getColor(const ColorName&) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_Colors_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/ComboBoxText.h b/src/modules/widgets/include/LiveSupport/Widgets/ComboBoxText.h deleted file mode 100644 index 7719369fb..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/ComboBoxText.h +++ /dev/null @@ -1,88 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_ComboBoxText_h -#define LiveSupport_Widgets_ComboBoxText_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -namespace LiveSupport { -namespace Widgets { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A combo box holding text entries. - * This just adds another constructor to its parent class, so that it can - * be used with Libglade. - */ -class ComboBoxText : public Gtk::ComboBoxText -{ - public: - - /** - * Constructor to be used with Glade::Xml::get_widget_derived(). - * - * @param baseClass widget of the parent class, created by Glade. - * @param glade the Glade object. - */ - ComboBoxText(GtkComboBox * baseClass, - const Glib::RefPtr & glade) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~ComboBoxText(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_ComboBoxText_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h b/src/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h deleted file mode 100644 index 4e8a0a730..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h +++ /dev/null @@ -1,129 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_CornerBitmaps_h -#define LiveSupport_Widgets_CornerBitmaps_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "gdkmm/bitmap.h" - - -namespace LiveSupport { -namespace Widgets { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A helper class to hold a set of corner bitmaps. - */ -class CornerBitmaps -{ - public: - /** - * The top left image. - */ - Glib::RefPtr topLeftBitmap; - - /** - * The top right image. - */ - Glib::RefPtr topRightBitmap; - - /** - * The bottom left image. - */ - Glib::RefPtr bottomLeftBitmap; - - /** - * The bottom right image. - */ - Glib::RefPtr bottomRightBitmap; - - /** - * The default constructor. - */ - CornerBitmaps(void) throw () - { - } - - /** - * Constructor with image references. - * If any of the images is not available, the result is undefined. - * - * @param topLeftBitmap the top left bitmap of the border - * @param topRightBitmap the top right bitmap of the border - * @param bottomLeftBitmap the bottom left bitmap of the border - * @param bottomRightBitmap the bottom right bitmap of the border - */ - CornerBitmaps(Glib::RefPtr topLeftBitmap, - Glib::RefPtr topRightBitmap, - Glib::RefPtr bottomLeftBitmap, - Glib::RefPtr bottomRightBitmap) - throw () - { - this->topLeftBitmap = topLeftBitmap; - this->topRightBitmap = topRightBitmap; - this->bottomLeftBitmap = bottomLeftBitmap; - this->bottomRightBitmap = bottomRightBitmap; - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~CornerBitmaps(void) throw () - { - } - - -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_CornerBitmaps_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/MetadataComboBoxText.h b/src/modules/widgets/include/LiveSupport/Widgets/MetadataComboBoxText.h deleted file mode 100644 index 2d793d0f8..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/MetadataComboBoxText.h +++ /dev/null @@ -1,121 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_MetadataComboBoxText_h -#define LiveSupport_Widgets_MetadataComboBoxText_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/MetadataTypeContainer.h" -#include "LiveSupport/Widgets/ComboBoxText.h" - - -namespace LiveSupport { -namespace Widgets { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A combo box holding all possible metadata type entries. - */ -class MetadataComboBoxText : public ComboBoxText -{ - private: - - /** - * The list of metadata types. - */ - Ptr::Ref metadataTypes; - - - public: - - /** - * Constructor to be used with Glade::Xml::get_widget_derived(). - * - * @param baseClass widget of the parent class, created by Glade. - * @param glade the Glade object. - */ - MetadataComboBoxText( - GtkComboBox * baseClass, - const Glib::RefPtr & glade) - throw (); - /** - * A virtual destructor. - */ - virtual - ~MetadataComboBoxText(void) throw (); - - /** - * Set up the contents of the combo box. - * - * @param metadataTypes contains the metadata keys and values. - */ - void - setContents(Ptr::Ref metadataTypes) - throw (); - - /** - * Get the DC name for the currently selected metadata type. - * This is either a standard Dublin Core metadata type like - * "dc:title" or "dc:creator", or one of the Campcaster - * (née LiveSupport) extensions like "ls:year" or "ls:bpm". - * See the Studio config files for a list of all metadata types. - * - * @return the DC name for the current selection. - */ - Ptr::Ref - getActiveKey(void) - throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_MetadataComboBoxText_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/OperatorComboBoxText.h b/src/modules/widgets/include/LiveSupport/Widgets/OperatorComboBoxText.h deleted file mode 100644 index 21bacf533..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/OperatorComboBoxText.h +++ /dev/null @@ -1,109 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_OperatorComboBoxText_h -#define LiveSupport_Widgets_OperatorComboBoxText_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Widgets/ComboBoxText.h" - - -namespace LiveSupport { -namespace Widgets { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A combo box holding all possible search operator entries. - */ -class OperatorComboBoxText : public ComboBoxText, - public LocalizedObject -{ - public: - - /** - * Constructor to be used with Glade::Xml::get_widget_derived(). - * - * @param baseClass widget of the parent class, created by Glade. - * @param glade the Glade object. - */ - OperatorComboBoxText( - GtkComboBox * baseClass, - const Glib::RefPtr & glade) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~OperatorComboBoxText(void) throw (); - - /** - * Set up the contents of the combo box. - * - * @param bundle the resource bundle which holds the localized - * operator names. - */ - void - setContents(Ptr::Ref bundle) - throw (); - /** - * Get the currently selected operator. - * This is one of "partial", "prefix", "=", "<=" or ">=". - * - * @return the current selection. - */ - Ptr::Ref - getActiveKey(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_OperatorComboBoxText_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/PlayableTreeModelColumnRecord.h b/src/modules/widgets/include/LiveSupport/Widgets/PlayableTreeModelColumnRecord.h deleted file mode 100644 index 58725aa11..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/PlayableTreeModelColumnRecord.h +++ /dev/null @@ -1,88 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_PlayableTreeModelColumnRecord_h -#define LiveSupport_Widgets_PlayableTreeModelColumnRecord_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Playable.h" -#include - - -namespace LiveSupport { -namespace Widgets { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A basic column record class for tree models with colorable rows and a - * (usually invisible) column of type Ptr::Ref. - */ -class PlayableTreeModelColumnRecord : public ZebraTreeModelColumnRecord -{ - public: - /** - * The column for the playable object shown in the row. - */ - Gtk::TreeModelColumn::Ref> playableColumn; - - /** - * Constructor. - */ - PlayableTreeModelColumnRecord(void) throw () - { - add(playableColumn); - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_PlayableTreeModelColumnRecord_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/WidgetConstants.h b/src/modules/widgets/include/LiveSupport/Widgets/WidgetConstants.h deleted file mode 100644 index 8acda9296..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/WidgetConstants.h +++ /dev/null @@ -1,78 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author $ - Version : $Revision $ - Location : $URL $ - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_WidgetConstants_h -#define LiveSupport_Widgets_WidgetConstants_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -namespace LiveSupport { -namespace Widgets { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A collection of constants used by the widgets. - * - * @author $Author $ - * @version $Revision $ - */ -class WidgetConstants -{ - public: - - /** - * The list of available miscellaneous images. - */ - typedef enum { audioClipIconImage, - playlistIconImage } ImageType; -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_WidgetConstants_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h b/src/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h deleted file mode 100644 index 4b42a813a..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h +++ /dev/null @@ -1,184 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_WidgetFactory_h -#define LiveSupport_Widgets_WidgetFactory_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Widgets/WidgetConstants.h" - - -namespace LiveSupport { -namespace Widgets { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A factory to provide access to some Campcaster Widgets. - * As of Aug 2007, it is only used to retrieve the audio clip and playlist - * icon images. It may be extended later, or it may be removed. - * - * The singleton instance of this class has to be configured with an XML - * element, which looks like the following: - * - *

- *  <widgetFactory>   path = "path/to/widget/images/"
- *  </>
- *  
- * - * The DTD for the above XML structure is: - * - *

- *  
- *  
- *  
- */ -class WidgetFactory : public Configurable -{ - private: - - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The path to load the images from for the widgets. - */ - std::string path; - - /** - * A container holding the miscallenous image pixbuf references. - */ - std::map > - imageTypePixbufs; - - /** - * The default constructor. - */ - WidgetFactory(void) throw () - { - } - - /** - * Load an image relative the path, and signal error if not found. - * - * @param imageName the name of the image, relative to path - * @return the loaded image - * @exception std::invalid_argument if the image was not found - */ - Glib::RefPtr - loadImage(const std::string imageName) - throw (std::invalid_argument); - - - public: - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~WidgetFactory(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - /** - * Return a smart pointer to a Gdk::Pixbuf holding a named image. - * - * @return the image. - */ - Glib::RefPtr - getPixbuf(WidgetConstants::ImageType imageName) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_WidgetFactory_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/ZebraCellRenderer.h b/src/modules/widgets/include/LiveSupport/Widgets/ZebraCellRenderer.h deleted file mode 100644 index a3f7e6481..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/ZebraCellRenderer.h +++ /dev/null @@ -1,113 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_ZebraCellRenderer_h -#define LiveSupport_Widgets_ZebraCellRenderer_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "gtkmm/cellrenderertext.h" - - -namespace LiveSupport { -namespace Widgets { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A custom cell renderer for blue-gray striped TreeView's. - * This is not used anywhere at the moment, but it's left in here because - * we will probably need (something like) this later. - */ -class ZebraCellRenderer : public Gtk::CellRendererText -{ - public: - /** - * Default constructor. - */ - ZebraCellRenderer() throw (); - - /** - * A virtual destructor. - */ - virtual ~ZebraCellRenderer() throw (); - - protected: - /** - * Calculate the size of the cell. - */ - virtual void get_size_vfunc(Gtk::Widget& widget, - const Gdk::Rectangle* cell_area, - int* x_offset, int* y_offset, - int* width, int* height) const - throw (); - - /** - * Draw the cell. - */ - virtual void render_vfunc(const Glib::RefPtr& window, - Gtk::Widget& widget, - const Gdk::Rectangle& background_area, - const Gdk::Rectangle& cell_area, - const Gdk::Rectangle& expose_area, - Gtk::CellRendererState flags) - throw (); - - /** - * The user clicked on the cell. - */ - virtual bool activate_vfunc(GdkEvent* event, - Gtk::Widget& widget, - const Glib::ustring& path, - const Gdk::Rectangle& background_area, - const Gdk::Rectangle& cell_area, - Gtk::CellRendererState flags) - throw (); - -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_ZebraCellRenderer_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeModelColumnRecord.h b/src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeModelColumnRecord.h deleted file mode 100644 index 990df92c3..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeModelColumnRecord.h +++ /dev/null @@ -1,81 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_ZebraTreeModelColumnRecord_h -#define LiveSupport_Widgets_ZebraTreeModelColumnRecord_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -namespace LiveSupport { -namespace Widgets { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A basic column record class for tree models with colorable rows. - */ -class ZebraTreeModelColumnRecord : public Gtk::TreeModelColumnRecord -{ - public: - /** - * The column for the color of the row. - */ - Gtk::TreeModelColumn rowNumberColumn; - - /** - * Constructor. - */ - ZebraTreeModelColumnRecord(void) throw () - { - add(rowNumberColumn); - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_ZebraTreeModelColumnRecord_h - diff --git a/src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeView.h b/src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeView.h deleted file mode 100644 index 18275041c..000000000 --- a/src/modules/widgets/include/LiveSupport/Widgets/ZebraTreeView.h +++ /dev/null @@ -1,430 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveSupport_Widgets_ZebraTreeView_h -#define LiveSupport_Widgets_ZebraTreeView_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Widgets/WidgetConstants.h" - - -namespace LiveSupport { -namespace Widgets { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A table of items, in rows colored alternately gray and light blue. - * - * NOTE: the ZebraTreeView works only with models based on a - * ZebraTreeModelColumRecord column record, because cellDataFunction() - * and renumberRows() refer to the row number column of the model. - * AFAIK there is no way to syntactically enforce this, so you need to - * remember it. - * - * General comments about TreeViews: - * - * TreeViews contain TreeViewColumns; these contain a title (a text Label) - * and a table column body (a CellRenderer). The CellRenderer needs to be - * both 'added' to the TreeViewColumn, and 'connected' to a TreeModel - * column. - * - * A single TreeViewColumn may contain several CellRenderers, i.e., - * sub-columns. - * - * The standard CellRenderer types (CellRendererText etc) can not be - * instantiated by the user; they can only be created by the shortcut - * TreeViewColumn constructor or the append_column() or insert_column() - * functions in TreeView. These create the appropriate CellRenderer, - * add it the tree view column, and connect it with the tree model column. - * - * A derived CellRenderer sub-type needs to be 1) instantiated; - * 2) added to a TreeViewColumn using a constructor or pack_start() etc; - * 3) connected with a TreeModelColumn using TreeViewColumn::set_renderer(). - */ -class ZebraTreeView : public Gtk::TreeView -{ - private: - /** - * Default constructor. - */ - ZebraTreeView(void) throw () - { - } - - /** - * The callback function to set the colors of the rows. - * - * @param cell the cell renderer of the column. - * @param iter points to the current row in the model. - */ - void - cellDataFunction(Gtk::CellRenderer* cell, - const Gtk::TreeModel::iterator& iter) - throw (); - - /** - * The callback function for the line number columns. - * It reads the line number from the rowNumberColumn of the model. - * - * @param cell the cell renderer of the column. - * @param iter points to the current row in the model. - * @param offset the line number of the first row, set by the - * call to appendLineNumberColumn() - */ - void - lineNumberCellDataFunction( - Gtk::CellRenderer* cell, - const Gtk::TreeModel::iterator& iter, - int offset) - throw (); - - /** - * Emit the "cell has been edited" signal. - */ - void - emitSignalCellEdited(const Glib::ustring & path, - const Glib::ustring & newText, - int columnId) - throw () - { - signalCellEdited().emit(path, columnId, newText); - } - - /** - * Emit the "tree model has changed" signal. - */ - void - emitSignalTreeModelChanged(void) - throw () - { - signalTreeModelChanged().emit(); - } - - /** - * Renumber the rows after they have changed. - * - * This is called from the onRowInserted(), onRowDeleted() and - * onRowsReordered() signal handlers. - */ - void - renumberRows(void) throw (); - - /** - * Find the selected row. - * Returns the selected row (if the selection type is single), - * or the first selected row (if the selection type is multiple). - * May return 0 if no row is selected. - * - * @return an iterator pointing to the selected row; or 0. - */ - Gtk::TreeModel::iterator - getSelectedRow(void) throw (); - - - protected: - /** - * A signal object to notify people that a cell has been edited. - */ - sigc::signal signalCellEditedObject; - - /** - * A signal object to notify people that the tree model has changed. - */ - sigc::signal signalTreeModelChangedObject; - - /** - * Event handler for the row_inserted signal. - * - * @param path a path pointing to the inserted row. - * @param iter an iterator pointing to the inserted row. - */ - void - onRowInserted(const Gtk::TreeModel::Path & path, - const Gtk::TreeModel::iterator & iter) - throw (); - - /** - * Event handler for the row_deleted signal. - * - * @param path points to the previous location of the deleted row. - */ - void - onRowDeleted(const Gtk::TreeModel::Path & path) throw (); - - /** - * Event handler for the rows_reordered signal. - * - * @param path points to the tree node whose children have been - * reordered. - * @param iter points to the node whose children have been - * reordered, or 0 if the depth of path is 0. - * @param mapping an array of integers mapping the current position - * of each child to its old position before the - * re-ordering, i.e. mapping[newpos] = oldpos. - */ - void - onRowsReordered(const Gtk::TreeModel::Path & path, - const Gtk::TreeModel::iterator& iter, - int* mapping) - throw (); - - /** - * Event handler for the row_expanded signal. - * - * @param iter points to the expanded row. - * @param path points to the expanded row. - */ - void - onRowExpanded(const Gtk::TreeModel::iterator & iter, - const Gtk::TreeModel::Path & path) throw (); - - /** - * Event handler for the row_collapsed signal. - * - * @param iter points to the collapsed row. - * @param path points to the collapsed row. - */ - void - onRowCollapsed(const Gtk::TreeModel::iterator & iter, - const Gtk::TreeModel::Path & path) throw (); - - - public: - /** - * Constructor. - * - * @param treeModel the data the treeView will show. - */ - ZebraTreeView(Glib::RefPtr treeModel) - throw (); - - /** - * Constructor to be used with Glade::Xml::get_widget_derived(). - * - * @param baseClass widget of the parent class, created by Glade. - * @param glade the Glade object. - */ - ZebraTreeView(_GtkTreeView * baseClass, - const Glib::RefPtr & glade) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~ZebraTreeView(void) throw (); - - /** - * Add a text column to the TreeView. - * - * @param title the title of the column - * @param modelColumn the model column this view will display - * @param minimumWidth the minimum width of the column, in pixels - * (optional) - * @return the number of columns after adding this one - */ - int - appendColumn(const Glib::ustring& title, - const Gtk::TreeModelColumn& modelColumn, - int minimumWidth = 0) - throw (); - - /** - * Add an image column to the TreeView. - * - * @param title the title of the column - * @param modelColumn the model column this view will display - * @param minimumWidth the minimum width of the column, in pixels - * (optional) - * @return the number of columns after adding this one - */ - int - appendColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn > & - modelColumn, - int minimumWidth = 0) - throw (); - - /** - * Add a centered text column to the TreeView. - * - * @param title the title of the column - * @param modelColumn the model column this view will display - * @param minimumWidth the minimum width of the column, in pixels - * (optional) - * @return the number of columns after adding this one - */ - int - appendCenteredColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn& modelColumn, - int minimumWidth = 0) - throw (); - - /** - * Add a centered line number column to the TreeView. - * - * @param title the title of the column - * @param offset the line number of the first row - * @param minimumWidth the minimum width of the column, in pixels - * (optional) - * @return the number of columns after adding this one - */ - int - appendLineNumberColumn( - const Glib::ustring& title, - int offset = 0, - int minimumWidth = 0) - throw (); - - /** - * Add an editable text column to the TreeView. - * - * The signal_edited() signal of the cell renderer gets connected - * to the signalEdited() signal of the ZebraTreeView object; the - * columnId argument will get passed to the signal handler. - * - * This is used to display fade info (time durations), so the text is - * right aligned in the column. - * - * @param title the title of the column - * @param modelColumn the model column this view will display - * @param columnId the column ID passed to the signal handler - * @param minimumWidth the minimum width of the column, in pixels - * (optional) - * @return the number of columns after adding this one - */ - int - appendEditableColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn& modelColumn, - int columnId, - int minimumWidth = 0) - throw (); - - /** - * Signal handler for the "up" menu option selected from - * the context menu. - */ - void - onUpMenuOption(void) throw (); - - /** - * Signal handler for the "down" menu option selected from - * the context menu. - */ - void - onDownMenuOption(void) throw (); - - /** - * Signal handler for the "remove" menu option selected from - * the context menu. - */ - void - onRemoveMenuOption(void) throw (); - - /** - * Remove an item from the window. - * - * @param iter points to the row to be removed - */ - void - removeItem(const Gtk::TreeModel::iterator & iter) throw (); - - /** - * The signal raised when a cell has been edited. - * - * @return the signal object (a protected member of this class) - */ - sigc::signal - signalCellEdited(void) throw () - { - return signalCellEditedObject; - } - - /** - * The signal raised when the rows in the tree model have changed. - * This signal is emitted whenever the tree model emits a - * row_inserted, row_deleted or rows_reordered signal. - * - * @return the signal object (a protected member of this class) - */ - sigc::signal - signalTreeModelChanged(void) throw () - { - return signalTreeModelChangedObject; - } - - /** - * Manually connect the 'model has changed' signals to the tree view. - * This is useful if you want to use the same ZebraTreeView object - * to alternately display two (or more) different tree models. - * - * @param treeModel the tree model whose changes should trigger - * a redraw of the tree view object - */ - void - connectModelSignals(Glib::RefPtr treeModel) - throw (); - -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // LiveSupport_Widgets_ZebraTreeView_h - diff --git a/src/modules/widgets/lib/.keepme b/src/modules/widgets/lib/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/widgets/lib/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/widgets/src/Colors.cxx b/src/modules/widgets/src/Colors.cxx deleted file mode 100644 index a14d0e22a..000000000 --- a/src/modules/widgets/src/Colors.cxx +++ /dev/null @@ -1,132 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "gtkmm/widget.h" - -#include "LiveSupport/Widgets/Colors.h" - - -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * The vector holding the colors. - */ -std::map Colors :: colors; - -/** - * Clear the "initialized" flag. - */ -bool Colors :: initialized = false; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Load the colors. - *----------------------------------------------------------------------------*/ -void -Colors :: initialize(void) throw () -{ - Gdk::Color whiteColor ("#ffffff"); - Gdk::Color blackColor ("#000000"); - Gdk::Color lightBlueColor ("#cfdee7"); - Gdk::Color brightBlueColor ("#6fb0ff"); - Gdk::Color blueColor ("#9ebadb"); - Gdk::Color darkBlueColor ("#688597"); - Gdk::Color grayColor ("#eaeaea"); - Gdk::Color slateGrayColor ("#c7cdd3"); - Gdk::Color mediumBlueGrayColor ("#97bacf"); - Gdk::Color darkGrayColor ("#5a5a5a"); - Gdk::Color yellowColor ("#ffff99"); - Gdk::Color orangeColor ("#ff4b00"); - Gdk::Color redColor ("#ff4b4b"); - Gdk::Color masterPanelCenterBlueColor ("#99cdff"); - Gdk::Color liveModeRowBlueColor ("#cde0f1"); - - Glib::RefPtr colormap = Gtk::Widget::get_default_colormap(); - colormap->alloc_color(whiteColor); - colormap->alloc_color(blackColor); - colormap->alloc_color(lightBlueColor); - colormap->alloc_color(brightBlueColor); - colormap->alloc_color(blueColor); - colormap->alloc_color(darkBlueColor); - colormap->alloc_color(grayColor); - colormap->alloc_color(slateGrayColor); - colormap->alloc_color(mediumBlueGrayColor); - colormap->alloc_color(darkGrayColor); - colormap->alloc_color(yellowColor); - colormap->alloc_color(orangeColor); - colormap->alloc_color(redColor); - colormap->alloc_color(masterPanelCenterBlueColor); - colormap->alloc_color(liveModeRowBlueColor); - - colors[White] = whiteColor; - colors[Black] = blackColor; - colors[LightBlue] = lightBlueColor; - colors[BrightBlue] = brightBlueColor; - colors[Blue] = blueColor; - colors[DarkBlue] = darkBlueColor; - colors[Gray] = grayColor; - colors[SlateGray] = slateGrayColor; - colors[MediumBlueGray] = mediumBlueGrayColor; - colors[DarkGray] = darkGrayColor; - colors[Yellow] = yellowColor; - colors[Orange] = orangeColor; - colors[Red] = redColor; - colors[MasterPanelCenterBlue] - = masterPanelCenterBlueColor; - colors[LiveModeRowBlue] = liveModeRowBlueColor; - - initialized = true; -} - - -/*------------------------------------------------------------------------------ - * Get a color by its name. - *----------------------------------------------------------------------------*/ -const Gdk::Color& -Colors :: getColor(const ColorName& name) throw () -{ - if (!initialized) { - initialize(); - } - - return colors[name]; -} - diff --git a/src/modules/widgets/src/ComboBoxText.cxx b/src/modules/widgets/src/ComboBoxText.cxx deleted file mode 100644 index ef181d786..000000000 --- a/src/modules/widgets/src/ComboBoxText.cxx +++ /dev/null @@ -1,64 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Widgets/ComboBoxText.h" - - -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ComboBoxText :: ComboBoxText( - GtkComboBox * baseClass, - const Glib::RefPtr & glade) - throw () - : Gtk::ComboBoxText(baseClass) -{ -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -ComboBoxText :: ~ComboBoxText(void) throw () -{ -} - diff --git a/src/modules/widgets/src/MetadataComboBoxText.cxx b/src/modules/widgets/src/MetadataComboBoxText.cxx deleted file mode 100644 index 8d56be668..000000000 --- a/src/modules/widgets/src/MetadataComboBoxText.cxx +++ /dev/null @@ -1,97 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Widgets/MetadataComboBoxText.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -MetadataComboBoxText :: MetadataComboBoxText( - GtkComboBox * baseClass, - const Glib::RefPtr & glade) - throw () - : ComboBoxText(baseClass, glade) -{ -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -MetadataComboBoxText :: ~MetadataComboBoxText(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Set up the contents of the combo box. - *----------------------------------------------------------------------------*/ -void -MetadataComboBoxText :: setContents( - Ptr::Ref metadataTypes) - throw () -{ - this->metadataTypes = metadataTypes; - - MetadataTypeContainer::Vector::const_iterator it; - for (it = metadataTypes->begin(); it != metadataTypes->end(); ++it) { - Ptr::Ref metadata = *it; - append_text(*metadata->getLocalizedName()); - } - set_active(0); // select the first item -} - - -/*------------------------------------------------------------------------------ - * Set up the contents of the combo box. - *----------------------------------------------------------------------------*/ -Ptr::Ref -MetadataComboBoxText :: getActiveKey(void) - throw () -{ - Ptr::Ref metadata = metadataTypes->getByIndex( - get_active_row_number()); - return metadata->getDcName(); -} - diff --git a/src/modules/widgets/src/OperatorComboBoxText.cxx b/src/modules/widgets/src/OperatorComboBoxText.cxx deleted file mode 100644 index e110f3424..000000000 --- a/src/modules/widgets/src/OperatorComboBoxText.cxx +++ /dev/null @@ -1,122 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Widgets/OperatorComboBoxText.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -OperatorComboBoxText :: OperatorComboBoxText( - GtkComboBox * baseClass, - const Glib::RefPtr & glade) - throw () - : ComboBoxText(baseClass, glade) -{ -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -OperatorComboBoxText :: ~OperatorComboBoxText(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Set up the contents of the combo box. - *----------------------------------------------------------------------------*/ -void -OperatorComboBoxText :: setContents(Ptr::Ref bundle) - throw () -{ - setBundle(bundle); - append_text(*getResourceUstring("partialOperatorDisplay")); - append_text(*getResourceUstring("prefixOperatorDisplay")); - append_text(*getResourceUstring("=OperatorDisplay")); - append_text(*getResourceUstring("<=OperatorDisplay")); - append_text(*getResourceUstring(">=OperatorDisplay")); - set_active(0); -} - - -/*------------------------------------------------------------------------------ - * Set up the contents of the combo box. - *----------------------------------------------------------------------------*/ -Ptr::Ref -OperatorComboBoxText :: getActiveKey(void) throw () -{ - Ptr::Ref selectedOperator(new Glib::ustring); - int selectedRow = get_active_row_number(); - - switch (selectedRow) { - case 0: selectedOperator->assign("partial"); - break; - - case 1: selectedOperator->assign("prefix"); - break; - - case 2: selectedOperator->assign("="); - break; - - case 3: selectedOperator->assign("<="); - break; - - case 4: selectedOperator->assign(">="); - break; - - default: std::cerr << "impossible value '" - << selectedRow - << "' in OperatorComboBoxText::getActiveKey" - << std::endl; - std::exit(1); - break; - } - - return selectedOperator; -} - diff --git a/src/modules/widgets/src/TestWindow.cxx b/src/modules/widgets/src/TestWindow.cxx deleted file mode 100644 index 4383b5784..000000000 --- a/src/modules/widgets/src/TestWindow.cxx +++ /dev/null @@ -1,472 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Widgets/WidgetFactory.h" -#include "LiveSupport/Widgets/Colors.h" -#include "TestWindow.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the configuration file for the resource bundle. - *----------------------------------------------------------------------------*/ -const std::string bundleConfigFileName = "etc/resourceBundle.xml"; - -/*------------------------------------------------------------------------------ - * The name of the Glade file. - *----------------------------------------------------------------------------*/ -const std::string gladeFileName = "var/glade/TestWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -TestWindow :: TestWindow (void) throw () -{ - configureBundle(); - - Glib::RefPtr glade = Gnome::Glade::Xml::create( - gladeFileName); - - glade->get_widget("mainWindow1", mainWindow); - mainWindow->set_title(*getResourceUstring("windowTitle")); - mainWindow->signal_delete_event().connect(sigc::mem_fun(*this, - &TestWindow::onDeleteEvent)); - - glade->get_widget_derived("combobox1", comboBox); - comboBox->append_text(*getResourceUstring("firstOption")); - comboBox->append_text(*getResourceUstring("secondOption")); - comboBox->append_text(*getResourceUstring("thirdOption")); - comboBox->set_active(0); - comboBox->signal_changed().connect(sigc::mem_fun(*this, - &TestWindow::onComboBoxSelectionChanged)); - - treeModel[0] = Gtk::ListStore::create(modelColumns); - glade->get_widget_derived("treeview1", treeView[0]); - treeView[0]->set_model(treeModel[0]); - treeView[0]->connectModelSignals(treeModel[0]); - treeView[0]->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); - treeView[0]->appendColumn(*getResourceUstring("pixbufColumnTitle"), - modelColumns.pixbufColumn); - treeView[0]->appendColumn(*getResourceUstring("textColumnTitle"), - modelColumns.textColumn); - fillTreeModel(0); - - treeModel[1] = Gtk::ListStore::create(modelColumns); - glade->get_widget_derived("treeview2", treeView[1]); - treeView[1]->set_model(treeModel[1]); - treeView[1]->connectModelSignals(treeModel[1]); - treeView[1]->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); - treeView[1]->appendColumn(*getResourceUstring("pixbufColumnTitle"), - modelColumns.pixbufColumn); - treeView[1]->appendColumn(*getResourceUstring("textColumnTitle"), - modelColumns.textColumn); - fillTreeModel(1); - - glade->get_widget("label1", label); - label->set_label(*getResourceUstring("dropHereText")); - - setupDndCallbacks(); - - glade->connect_clicked("button1", sigc::mem_fun(*this, - &TestWindow::onOkButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Configure the resource bundle. - *----------------------------------------------------------------------------*/ -void -TestWindow :: configureBundle (void) throw () -{ - Ptr::Ref bundle; - - try { - Ptr::Ref parser( - new xmlpp::DomParser(bundleConfigFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - - bundle = LocalizedObject::getBundle(*root); - - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in bundle configuration file:\n" - << e.what() << std::endl; - exit(1); - } catch (std::exception &e) { - std::cerr << "XML error in bundle configuration file:\n" - << e.what() << std::endl; - exit(1); - } - - setBundle(bundle); -} - - -/*------------------------------------------------------------------------------ - * Fill the left tree model. - *----------------------------------------------------------------------------*/ -void -TestWindow :: fillTreeModel (int index) throw () -{ - Ptr::Ref wf = WidgetFactory::getInstance(); - Glib::RefPtr pixbuf = wf->getPixbuf( - WidgetConstants::audioClipIconImage); - Gtk::TreeModel::Row row; - - treeModel[index]->clear(); - - if (index == 0) { - Glib::ustring text; - - switch (comboBox->get_active_row_number()) { - case -1: break; - - case 0: text = *getResourceUstring("textOne"); - break; - - case 1: text = *getResourceUstring("textTwo"); - break; - - case 2: text = *getResourceUstring("textThree"); - break; - - default: break; - } - - row = *treeModel[index]->append(); - row[modelColumns.pixbufColumn] = pixbuf; - row[modelColumns.textColumn] = text; - } - - row = *treeModel[index]->append(); - row[modelColumns.pixbufColumn] = pixbuf; - row[modelColumns.textColumn] = (index == 0) ? "1111111111" - : "AAAAAAAAAA"; - - row = *treeModel[index]->append(); - row[modelColumns.pixbufColumn] = pixbuf; - row[modelColumns.textColumn] = (index == 0) ? "2222222222" - : "BBBBBBBBBB"; - - row = *treeModel[index]->append(); - row[modelColumns.pixbufColumn] = pixbuf; - row[modelColumns.textColumn] = (index == 0) ? "3333333333" - : "CCCCCCCCCC"; - - row = *treeModel[index]->append(); - row[modelColumns.pixbufColumn] = pixbuf; - row[modelColumns.textColumn] = (index == 0) ? "4444444444" - : "EEEEEEEEEE"; -} - - -/*------------------------------------------------------------------------------ - * Set up the D'n'D callbacks. - *----------------------------------------------------------------------------*/ -void -TestWindow :: setupDndCallbacks (void) throw () -{ - std::list targets; - targets.push_back(Gtk::TargetEntry("STRING", - Gtk::TARGET_SAME_APP)); - - // set up the left tree view - treeView[0]->enable_model_drag_source(targets); - treeView[0]->signal_drag_data_get().connect(sigc::bind( - sigc::mem_fun(*this, - &TestWindow::onTreeViewDragDataGet), - 0)); - treeView[0]->enable_model_drag_dest(targets); - treeView[0]->signal_drag_data_received().connect(sigc::bind( - sigc::mem_fun(*this, - &TestWindow::onTreeViewDragDataReceived), - 0)); - - // set up the right tree view - treeView[1]->enable_model_drag_source(targets); - treeView[1]->signal_drag_data_get().connect(sigc::bind( - sigc::mem_fun(*this, - &TestWindow::onTreeViewDragDataGet), - 1)); - treeView[1]->enable_model_drag_dest(targets); - treeView[1]->signal_drag_data_received().connect(sigc::bind( - sigc::mem_fun(*this, - &TestWindow::onTreeViewDragDataReceived), - 1)); - - // set up the label - label->drag_dest_set(targets); - label->signal_drag_data_received().connect(sigc::mem_fun(*this, - &TestWindow::onLabelDragDataReceived)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for selection change in the combo box. - *----------------------------------------------------------------------------*/ -void -TestWindow :: onComboBoxSelectionChanged (void) throw () -{ - fillTreeModel(0); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the OK button being clicked. - *----------------------------------------------------------------------------*/ -void -TestWindow :: onOkButtonClicked (void) throw () -{ - std::cerr << "TestWindow::onOkButtonClicked() called." << std::endl; - mainWindow->hide(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the window being hidden. - *----------------------------------------------------------------------------*/ -bool -TestWindow :: onDeleteEvent (GdkEventAny * event) throw () -{ - // We could add a confirmation dialog here. - std::cerr << "TestWindow::onDeleteEvent() called." << std::endl; - return false; -} - - -/*------------------------------------------------------------------------------ - * Run the window. - *----------------------------------------------------------------------------*/ -void -TestWindow :: run (void) throw () -{ - Gtk::Main::run(*mainWindow); -} - - -/*------------------------------------------------------------------------------ - * The callback for the start of the drag. - *----------------------------------------------------------------------------*/ -void -TestWindow :: onTreeViewDragDataGet( - const Glib::RefPtr & context, - Gtk::SelectionData & selectionData, - guint info, - guint time, - int index) - throw () -{ - Glib::RefPtr selection - = treeView[index]->get_selection(); - std::list rows = selection->get_selected_rows(); - Glib::ustring dropString = leftOrRight(index); - // we can assume there is only one row selected, due to bug - // http://bugzilla.gnome.org/show_bug.cgi?id=70479 - assert (rows.size() == 1); - - Gtk::TreeRow row = *treeModel[index]->get_iter(rows.front()); - dropString += " "; - dropString += row[modelColumns.textColumn]; - - selectionData.set(selectionData.get_target(), - 8 /* 8 bits format*/, - (const guchar *) dropString.c_str(), - dropString.bytes()); -} - - -/*------------------------------------------------------------------------------ - * The callback for the end of the drag. - *----------------------------------------------------------------------------*/ -void -TestWindow :: onTreeViewDragDataReceived( - const Glib::RefPtr & context, - int x, - int y, - const Gtk::SelectionData & selectionData, - guint info, - guint time, - int index) - throw () -{ - if (selectionData.get_length() < 0 || selectionData.get_format() != 8) { - std::cerr << "unknown type of data dropped on " - << leftOrRight(index) - << " tree view" - << std::endl; - context->drag_finish(false, false, time); - return; - } - - Glib::ustring data = selectionData.get_data_as_string(); - Glib::ustring stripped; - - int source = -1; - int destination = index; - - if (data.find("left") == 0) { - std::cerr << "left -> " - << leftOrRight(index) - << ": " - << data.substr(5) - << std::endl; - stripped = data.substr(5); - source = 0; - - } else if (data.find("right") == 0) { - std::cerr << "right -> " - << leftOrRight(index) - << ": " - << data.substr(6) - << std::endl; - stripped = data.substr(6); - source = 1; - - } else { - std::cerr << "unknown string dropped on " - << leftOrRight(index) - << " tree view: " - << data - << std::endl; - context->drag_finish(false, false, time); - return; - } - - if (source == destination) { - insertRow(destination, x, y, stripped, ROW_MOVE); - context->drag_finish(true, true, time); - - } else { - insertRow(destination, x, y, stripped, ROW_COPY); - context->drag_finish(true, false, time); - } -} - - -/*------------------------------------------------------------------------------ - * Insert a string row into a tree view. - *----------------------------------------------------------------------------*/ -void -TestWindow :: insertRow (int index, - int x, - int y, - Glib::ustring value, - RowOperation operation) throw () -{ - Gtk::TreePath destPath; - Gtk::TreeViewDropPosition destPos; - bool pathIsValid = treeView[index]->get_dest_row_at_pos( - x, y, destPath, destPos); - // get_drag_dest_row() does not work here, for some strange reason - Gtk::TreeRow newRow; - - if (pathIsValid) { - assert (!destPath.empty()); - Gtk::TreeIter destination = treeModel[index]->get_iter(destPath); - - if (destPos == Gtk::TREE_VIEW_DROP_BEFORE - || destPos == Gtk::TREE_VIEW_DROP_INTO_OR_BEFORE) { - newRow = *treeModel[index]->insert(destination); - - } else if (destPos == Gtk::TREE_VIEW_DROP_AFTER - || destPos == Gtk::TREE_VIEW_DROP_INTO_OR_AFTER) { - newRow = *treeModel[index]->insert_after(destination); - - } else { - assert (false); - return; - } - } else { - newRow = *treeModel[index]->append(); - } - - Ptr::Ref wf = WidgetFactory::getInstance(); - Glib::RefPtr pixbuf = wf->getPixbuf( - WidgetConstants::audioClipIconImage); - newRow[modelColumns.pixbufColumn] = pixbuf; - newRow[modelColumns.textColumn] = value; - - if (operation == ROW_MOVE) { - Glib::RefPtr - selection = treeView[index]->get_selection(); - std::list - rows = selection->get_selected_rows(); - assert (rows.size() == 1); - Gtk::TreeIter source = treeModel[index]->get_iter(rows.front()); - - treeModel[index]->erase(source); - } -} - - -/*------------------------------------------------------------------------------ - * The callback for the end of the drag. - *----------------------------------------------------------------------------*/ -void -TestWindow :: onLabelDragDataReceived( - const Glib::RefPtr & context, - int x, - int y, - const Gtk::SelectionData & selectionData, - guint info, - guint time) - throw () -{ - if (selectionData.get_length() >= 0 && selectionData.get_format() == 8) { - Glib::ustring data = selectionData.get_data_as_string(); - label->set_label(data); - context->drag_finish(true, true, time); - - } else { - std::cerr << "unknown type of data dropped on the label" - << std::endl; - label->set_label(*getResourceUstring("dropHereText")); - context->drag_finish(false, false, time); - } -} - diff --git a/src/modules/widgets/src/TestWindow.h b/src/modules/widgets/src/TestWindow.h deleted file mode 100644 index f6b107062..000000000 --- a/src/modules/widgets/src/TestWindow.h +++ /dev/null @@ -1,288 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef TestWindow_h -#define TestWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Core/Ptr.h" - -#include "LiveSupport/Widgets/ComboBoxText.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" - - -namespace LiveSupport { -namespace Widgets { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A window, enabling interactive testing of UI components. - */ -class TestWindow : public LocalizedObject -{ - public: - - /** - * The possible DnD operations. - */ - typedef enum { ROW_COPY, - ROW_MOVE } RowOperation; - - - private: - - /** - * Configure the resource bundle. - */ - void - configureBundle (void) throw (); - - /** - * Fill one of the tree models. - * - * @param index which tree model to fill. - */ - void - fillTreeModel (int index) throw (); - - /** - * Set up the D'n'D callbacks. - */ - void - setupDndCallbacks (void) throw (); - - /** - * Return either "left" or "right". - * - * @param index 0 for left, 1 for right. - */ - Glib::ustring - leftOrRight (int index) throw () - { - if (index == 0) { - return "left"; - } else { - return "right"; - } - } - - /** - * Insert a string row into a tree view. - * - * @param index which tree view to work on. - * @param x the x coordinate of the location of the new row. - * @param y the y coordinate of the location of the new row. - * @param value the string to put into the new row. - * @param operation whether to copy or move the row. - */ - void - insertRow (int index, - int x, - int y, - Glib::ustring value, - RowOperation operation) throw (); - - - protected: - - /** - * The window itself. - */ - Gtk::Window * mainWindow; - - /** - * The combo box. - */ - ComboBoxText * comboBox; - - /** - * The tree views. - */ - ZebraTreeView * treeView[2]; - - /** - * The drop target label. - */ - Gtk::Label * label; - - /** - * The OK button. - */ - Gtk::Button * okButton; - - /** - * The columns model needed by Gtk::TreeView. - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - - /** - * A column showing a Pixbuf. - */ - Gtk::TreeModelColumn > - pixbufColumn; - - /** - * A text column. - */ - Gtk::TreeModelColumn textColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(pixbufColumn); - add(textColumn); - } - }; - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * The tree models, as GTK references. - */ - Glib::RefPtr treeModel[2]; - - /** - * Event handler for selection change in the combo box. - */ - virtual void - onComboBoxSelectionChanged (void) throw (); - - /** - * Event handler for the OK button being clicked. - */ - virtual void - onOkButtonClicked (void) throw (); - - /** - * Event handler for the window being hidden. - */ - virtual bool - onDeleteEvent (GdkEventAny * event) throw (); - - /** - * The callback for the start of the drag. - * - * @param index which tree view to drag from. - */ - virtual void - onTreeViewDragDataGet( - const Glib::RefPtr & context, - Gtk::SelectionData & selectionData, - guint info, - guint time, - int index) - throw (); - - /** - * The callback for the end of the drag. - * - * @param index which tree view to drop to. - */ - virtual void - onTreeViewDragDataReceived( - const Glib::RefPtr & context, - int x, - int y, - const Gtk::SelectionData & selectionData, - guint info, - guint time, - int index) - throw (); - - /** - * The callback for the end of the drag. - */ - virtual void - onLabelDragDataReceived( - const Glib::RefPtr & context, - int x, - int y, - const Gtk::SelectionData & selectionData, - guint info, - guint time) - throw (); - - - public: - - /** - * Constructor. - */ - TestWindow (void) throw (); - - /** - * Virtual destructor. - */ - virtual - ~TestWindow (void) throw () - { - } - - /** - * Run the window. - */ - void - run (void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Widgets -} // namespace LiveSupport - -#endif // TestWindow_h - diff --git a/src/modules/widgets/src/WidgetFactory.cxx b/src/modules/widgets/src/WidgetFactory.cxx deleted file mode 100644 index 88d092db6..000000000 --- a/src/modules/widgets/src/WidgetFactory.cxx +++ /dev/null @@ -1,156 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Widgets/WidgetFactory.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string WidgetFactory::configElementNameStr = "widgetFactory"; - -/*------------------------------------------------------------------------------ - * The singleton instance of WidgetFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref WidgetFactory::singleton; - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the attribute to get the path for the widget images. - *----------------------------------------------------------------------------*/ -const std::string pathAttrName = "path"; - -/*------------------------------------------------------------------------------ - * The relative path for the standard button images. - *----------------------------------------------------------------------------*/ -const std::string buttonPath = "button/"; - -/*------------------------------------------------------------------------------ - * The name of the image for the audio clip icon. - *----------------------------------------------------------------------------*/ -const std::string audioClipIconImageName = "icons/audioClipIcon.png"; - -/*------------------------------------------------------------------------------ - * The name of the image for the playlist icon. - *----------------------------------------------------------------------------*/ -const std::string playlistIconImageName = "icons/playlistIcon.png"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance to WidgetFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref -WidgetFactory :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new WidgetFactory()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the widget factory. - *----------------------------------------------------------------------------*/ -void -WidgetFactory :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - const xmlpp::Attribute * attribute = 0; - - if (!(attribute = element.get_attribute(pathAttrName))) { - throw std::invalid_argument("Missing path attribute"); - } - path = attribute->get_value(); - - imageTypePixbufs[WidgetConstants::audioClipIconImage] - = loadImage(audioClipIconImageName); - imageTypePixbufs[WidgetConstants::playlistIconImage] - = loadImage(playlistIconImageName); -} - - -/*------------------------------------------------------------------------------ - * Load an image - *----------------------------------------------------------------------------*/ -Glib::RefPtr -WidgetFactory :: loadImage(const std::string imageName) - throw (std::invalid_argument) -{ - Glib::RefPtr image; - - bool success = true; - try { - image = Gdk::Pixbuf::create_from_file(path + imageName); - } catch (Glib::FileError &e) { - success = false; - } catch (Gdk::PixbufError &e) { - success = false; - } - - if (!success || !image) { - throw std::invalid_argument("Missing " + imageName); - } - - return image; -} - - -/*------------------------------------------------------------------------------ - * Return a Gdk::Pixbuf reference to a named image - *----------------------------------------------------------------------------*/ -Glib::RefPtr -WidgetFactory :: getPixbuf(WidgetConstants::ImageType imageName) throw () -{ - return imageTypePixbufs[imageName]; -} - diff --git a/src/modules/widgets/src/ZebraCellRenderer.cxx b/src/modules/widgets/src/ZebraCellRenderer.cxx deleted file mode 100644 index 629bcb5fe..000000000 --- a/src/modules/widgets/src/ZebraCellRenderer.cxx +++ /dev/null @@ -1,252 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Widgets/ZebraCellRenderer.h" - - -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ZebraCellRenderer::ZebraCellRenderer() throw () -: - Glib::ObjectBase (typeid(ZebraCellRenderer)), - Gtk::CellRendererText () -{ -// std::cerr << "### constructor\n"; -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -ZebraCellRenderer::~ZebraCellRenderer() throw () -{ -// std::cerr << "### destructor\n"; -} - - -/*------------------------------------------------------------------------------ - * Calculate the size of the cell. - *----------------------------------------------------------------------------*/ -void -ZebraCellRenderer::get_size_vfunc(Gtk::Widget& widget, - const Gdk::Rectangle* cell_area, - int* x_offset, int* y_offset, - int* width, int* height) const - throw () -{ -/* - std::cerr << "### get_size_vfunc():" - << (cell_area ? cell_area->get_x() : -1) << ", " - << (cell_area ? cell_area->get_y() : -1) << "; " - << (cell_area ? cell_area->get_width() : -1) << ", " - << (cell_area ? cell_area->get_height() : -1) << "; " - << (x_offset ? *x_offset : -1) << ", " - << (y_offset ? *y_offset : -1) << " --- " - << (width ? *width : -1) << ", " - << (height ? *height : -1) << "\n"; -*/ - // call the parent method - Gtk::CellRendererText::get_size_vfunc(widget, cell_area, - x_offset, y_offset, - width, height); -/* - std::cerr << "... done: " - << (cell_area ? cell_area->get_x() : -1) << ", " - << (cell_area ? cell_area->get_y() : -1) << "; " - << (cell_area ? cell_area->get_width() : -1) << ", " - << (cell_area ? cell_area->get_height() : -1) << "; " - << (x_offset ? *x_offset : -1) << ", " - << (y_offset ? *y_offset : -1) << " --- " - << (width ? *width : -1) << ", " - << (height ? *height : -1) << "\n"; -*/ -/* - enum { TOGGLE_WIDTH = 12 }; - - const int calc_width = property_xpad() * 2 + TOGGLE_WIDTH; - const int calc_height = property_ypad() * 2 + TOGGLE_WIDTH; - - if(width) - *width = calc_width; - - if(height) - *height = calc_height; - - if(cell_area) - { - if(x_offset) - { - *x_offset = int(property_xalign() * (cell_area->get_width() - calc_width)); - *x_offset = std::max(0, *x_offset); - } - - if(y_offset) - { - *y_offset = int(property_yalign() * (cell_area->get_height() - calc_height)); - *y_offset = std::max(0, *y_offset); - } - } -*/ -} - - -/*------------------------------------------------------------------------------ - * Draw the cell. - *----------------------------------------------------------------------------*/ -void -ZebraCellRenderer::render_vfunc(const Glib::RefPtr& window, - Gtk::Widget& widget, - const Gdk::Rectangle& background_area, - const Gdk::Rectangle& cell_area, - const Gdk::Rectangle& expose_area, - Gtk::CellRendererState flags) - throw () -{ -/* - std::cerr << "### render_vfunc(): " - << widget.get_name() << " --- " - << background_area.get_x() << ", " - << background_area.get_y() << "; " - << background_area.get_width() << ", " - << background_area.get_height() << " -- " - << cell_area.get_x() << ", " - << cell_area.get_y() << "; " - << cell_area.get_width() << ", " - << cell_area.get_height() << "; " - << expose_area.get_x() << " -- " - << expose_area.get_y() << "; " - << expose_area.get_width() << ", " - << expose_area.get_height() << " -- " - << flags << "\n"; -*/ - // call the parent function - Gtk::CellRendererText::render_vfunc(window, widget, background_area, - cell_area, expose_area, flags); -/* - const unsigned int cell_xpad = property_xpad(); - const unsigned int cell_ypad = property_ypad(); - - int x_offset = 0, y_offset = 0, width = 0, height = 0; - get_size(widget, cell_area, x_offset, y_offset, width, height); - - width -= cell_xpad * 2; - height -= cell_ypad * 2; - - if(width <= 0 || height <= 0) - return; - - Gtk::StateType state = Gtk::STATE_INSENSITIVE; - - if(property_activatable_) - state = Gtk::STATE_NORMAL; - - if((flags & Gtk::CELL_RENDERER_SELECTED) != 0) - state = (widget.has_focus()) ? Gtk::STATE_SELECTED : Gtk::STATE_ACTIVE; - - const Gtk::ShadowType shadow = (property_active_) ? Gtk::SHADOW_IN : Gtk::SHADOW_OUT; - - //Cast the drawable to a Window. TODO: Maybe paint_option() should take a Drawable? murrayc. - Glib::RefPtr window_casted = Glib::RefPtr::cast_dynamic<>(window); - if(window_casted) - { - if(property_radio_) - { - widget.get_style()->paint_option( - window_casted, state, shadow, - cell_area, widget, "cellradio", - cell_area.get_x() + x_offset + cell_xpad, - cell_area.get_y() + y_offset + cell_ypad, - width - 1, height - 1); - } - else - { - widget.get_style()->paint_check( - window_casted, state, shadow, - cell_area, widget, "cellcheck", - cell_area.get_x() + x_offset + cell_xpad, - cell_area.get_y() + y_offset + cell_ypad, - width - 1, height - 1); - } - } -*/ -} - - -/*------------------------------------------------------------------------------ - * The user clicked on the cell. - *----------------------------------------------------------------------------*/ -bool -ZebraCellRenderer::activate_vfunc(GdkEvent* event, - Gtk::Widget& widget, - const Glib::ustring& path, - const Gdk::Rectangle& background_area, - const Gdk::Rectangle& cell_area, - Gtk::CellRendererState flags) - throw () -{ -/* - std::cerr << "### activate_vfunc(): " - << widget.get_name() << ", " - << path << ", " -// << background_area << ", " -// << cell_area << ", " - << flags << "\n"; -*/ - // call the parent function - return Gtk::CellRendererText::activate_vfunc(event, widget, path, - background_area, cell_area, flags); -/* - std::cerr << "... done.\n"; -*/ -/* - if(property_activatable_) - { - signal_toggled_(path); - return true; - } - - return false; -*/ -} diff --git a/src/modules/widgets/src/ZebraTreeView.cxx b/src/modules/widgets/src/ZebraTreeView.cxx deleted file mode 100644 index 18cc4357b..000000000 --- a/src/modules/widgets/src/ZebraTreeView.cxx +++ /dev/null @@ -1,572 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Widgets/WidgetFactory.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/Colors.h" - -#include "LiveSupport/Widgets/ZebraTreeView.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ZebraTreeView :: ZebraTreeView(Glib::RefPtr treeModel) - throw () - : Gtk::TreeView(treeModel) -{ - connectModelSignals(treeModel); - this->signal_row_expanded().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowExpanded)); - this->signal_row_collapsed().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowCollapsed)); -} - - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ZebraTreeView :: ZebraTreeView( - _GtkTreeView * baseClass, - const Glib::RefPtr & glade) - throw () - : Gtk::TreeView(baseClass) -{ - this->signal_row_expanded().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowExpanded)); - this->signal_row_collapsed().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowCollapsed)); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -ZebraTreeView :: ~ZebraTreeView(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Add a text column to the TreeView. - *----------------------------------------------------------------------------*/ -int -ZebraTreeView :: appendColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn& modelColumn, - int minimumWidth) - throw () -{ - // a standard cell renderer; can be replaced with a ZebraCellRenderer - Gtk::CellRendererText* renderer = Gtk::manage(new Gtk::CellRendererText); - - // the constructor packs the renderer into the TreeViewColumn - Gtk::TreeViewColumn* viewColumn = Gtk::manage( - new Gtk::TreeViewColumn(title, *renderer) ); - - // and then we associate this renderer with the model column - viewColumn->add_attribute(renderer->property_markup(), modelColumn); - - // this cell data function will do the blue-gray zebra stripes - viewColumn->set_cell_data_func( - *renderer, - sigc::mem_fun(*this, &ZebraTreeView::cellDataFunction) ); - - // set the minimum width of the column - if (minimumWidth) { - viewColumn->set_min_width(minimumWidth); - } - - return append_column(*viewColumn); -} - - -/*------------------------------------------------------------------------------ - * Add an image column to the TreeView. - *----------------------------------------------------------------------------*/ -int -ZebraTreeView :: appendColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn > & - modelColumn, - int minimumWidth) - throw () -{ - // a standard cell renderer; can be replaced with a ZebraCellRenderer - Gtk::CellRendererPixbuf* renderer = Gtk::manage( - new Gtk::CellRendererPixbuf ); - - // the constructor packs the renderer into the TreeViewColumn - Gtk::TreeViewColumn* viewColumn = Gtk::manage( - new Gtk::TreeViewColumn(title, *renderer) ); - - // and then we associate this renderer with the model column - viewColumn->add_attribute(renderer->property_pixbuf(), modelColumn); - - // this cell data function will do the blue-gray zebra stripes - viewColumn->set_cell_data_func( - *renderer, - sigc::mem_fun(*this, &ZebraTreeView::cellDataFunction) ); - - // set the minimum width of the column - if (minimumWidth) { - viewColumn->set_min_width(minimumWidth); - } - - return append_column(*viewColumn); -} - - -/*------------------------------------------------------------------------------ - * The callback function. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: cellDataFunction(Gtk::CellRenderer* cell, - const Gtk::TreeModel::iterator& iter) - throw () -{ - ZebraTreeModelColumnRecord model; - Colors::ColorName colorName = (*iter)[model.rowNumberColumn] % 2 - ? Colors::Gray - : Colors::LightBlue; - cell->property_cell_background_gdk() = Colors::getColor(colorName); -} - - -/*------------------------------------------------------------------------------ - * Add a centered text column to the TreeView. - *----------------------------------------------------------------------------*/ -int -ZebraTreeView :: appendCenteredColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn& modelColumn, - int minimumWidth) - throw () -{ - // a standard cell renderer; can be replaced with a ZebraCellRenderer - Gtk::CellRendererText* renderer = Gtk::manage(new Gtk::CellRendererText); - - // center the text in the column - renderer->property_xalign() = 0.5; - - // the constructor packs the renderer into the TreeViewColumn - Gtk::TreeViewColumn* viewColumn = Gtk::manage( - new Gtk::TreeViewColumn(title, *renderer) ); - - // and then we associate this renderer with the model column - viewColumn->add_attribute(renderer->property_markup(), modelColumn); - - // this cell data function will do the blue-gray zebra stripes - viewColumn->set_cell_data_func( - *renderer, - sigc::mem_fun(*this, &ZebraTreeView::cellDataFunction) ); - - // set the minimum width of the column - if (minimumWidth) { - viewColumn->set_min_width(minimumWidth); - } - - return append_column(*viewColumn); -} - - -/*------------------------------------------------------------------------------ - * Add a centered line number column to the TreeView. - *----------------------------------------------------------------------------*/ -int -ZebraTreeView :: appendLineNumberColumn( - const Glib::ustring& title, - int offset, - int minimumWidth) - throw () -{ - // a standard cell renderer; can be replaced with a ZebraCellRenderer - Gtk::CellRendererText* renderer = Gtk::manage(new Gtk::CellRendererText); - - // center the text in the column - renderer->property_xalign() = 0.5; - - // the constructor packs the renderer into the TreeViewColumn - Gtk::TreeViewColumn* viewColumn = Gtk::manage( - new Gtk::TreeViewColumn(title, *renderer) ); - - // this cell data function will do the blue-gray zebra stripes - // and fill in the line number from the model.rowNumberColumn - viewColumn->set_cell_data_func( - *renderer, - sigc::bind( - sigc::mem_fun(*this, &ZebraTreeView::lineNumberCellDataFunction), - offset )); - - // set the minimum width of the column - if (minimumWidth) { - viewColumn->set_min_width(minimumWidth); - } - - return append_column(*viewColumn); -} - - -/*------------------------------------------------------------------------------ - * The callback function for the line number column(s). - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: lineNumberCellDataFunction( - Gtk::CellRenderer* cell, - const Gtk::TreeModel::iterator& iter, - int offset) - throw () -{ - ZebraTreeModelColumnRecord model; - int rowNumber = (*iter)[model.rowNumberColumn]; - - Colors::ColorName colorName = rowNumber % 2 ? Colors::Gray - : Colors::LightBlue; - cell->property_cell_background_gdk() = Colors::getColor(colorName); - cell->property_cell_background_gdk() = Colors::getColor(colorName); - - Glib::ustring numberString; - numberString.append(""); - std::stringstream numberStr; - numberStr << (rowNumber + offset); - numberString.append(numberStr.str()); - numberString.append(""); - Gtk::CellRendererText * textCell - = dynamic_cast(cell); - textCell->property_markup() = numberString; -} - - -/*------------------------------------------------------------------------------ - * Add an editable centered text column to the TreeView. - *----------------------------------------------------------------------------*/ -int -ZebraTreeView :: appendEditableColumn( - const Glib::ustring& title, - const Gtk::TreeModelColumn& modelColumn, - int columnId, - int minimumWidth) - throw () -{ - // a standard cell renderer; can be replaced with a ZebraCellRenderer - Gtk::CellRendererText* renderer = Gtk::manage(new Gtk::CellRendererText); - - // right align the text in the column - renderer->property_xalign() = 1; - - // set the cells to be editable, and connect the signal to our own - renderer->property_editable() = true; - renderer->signal_edited().connect(sigc::bind( - sigc::mem_fun(*this, &ZebraTreeView::emitSignalCellEdited), - columnId )); - - // the constructor packs the renderer into the TreeViewColumn - Gtk::TreeViewColumn* viewColumn = Gtk::manage( - new Gtk::TreeViewColumn(title, *renderer) ); - - // and then we associate this renderer with the model column - viewColumn->add_attribute(renderer->property_markup(), modelColumn); - - // this cell data function will do the blue-gray zebra stripes - viewColumn->set_cell_data_func( - *renderer, - sigc::mem_fun(*this, &ZebraTreeView::cellDataFunction) ); - - // set the minimum width of the column - if (minimumWidth) { - viewColumn->set_min_width(minimumWidth); - } - - return append_column(*viewColumn); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Up menu item selected from the entry conext menu - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onUpMenuOption(void) throw () -{ - Gtk::TreeModel::iterator iter = getSelectedRow(); - - Glib::RefPtr treeModel - = Glib::RefPtr::cast_dynamic(get_model()); - ZebraTreeModelColumnRecord modelColumns; - - if (iter && iter != treeModel->children().begin()) { - Gtk::TreeModel::iterator previous = iter; - --previous; - - int rowNumber = (*previous)[modelColumns.rowNumberColumn]; - (*iter) [modelColumns.rowNumberColumn] = rowNumber; - (*previous)[modelColumns.rowNumberColumn] = ++rowNumber; - - treeModel->iter_swap(previous, iter); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Down menu item selected from the entry conext menu - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onDownMenuOption(void) throw () -{ - Gtk::TreeModel::iterator iter = getSelectedRow(); - - Glib::RefPtr treeModel - = Glib::RefPtr::cast_dynamic(get_model()); - ZebraTreeModelColumnRecord modelColumns; - - if (iter) { - Gtk::TreeModel::iterator next = iter; - ++next; - if (next != treeModel->children().end()) { - - int rowNumber = (*iter)[modelColumns.rowNumberColumn]; - (*next)[modelColumns.rowNumberColumn] = rowNumber; - (*iter)[modelColumns.rowNumberColumn] = ++rowNumber; - - treeModel->iter_swap(iter, next); - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Remove menu item selected from the entry conext menu - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onRemoveMenuOption(void) throw () -{ - Glib::RefPtr selection = get_selection(); - Gtk::TreeModel::iterator newSelection; - - if (selection->get_mode() == Gtk::SELECTION_SINGLE) { - Gtk::TreeModel::iterator it = selection->get_selected(); - if (it) { - newSelection = it; - ++newSelection; - removeItem(it); - } - - } else { - std::vector selectedPaths - = selection->get_selected_rows(); - - std::vector selectedIters; - std::vector::iterator pathIt = selectedPaths.begin(); - for ( ; pathIt != selectedPaths.end(); ++pathIt) { - selectedIters.push_back(get_model()->get_iter(*pathIt)); - } - - std::vector::iterator - iterIt = selectedIters.begin(); - for ( ; iterIt != selectedIters.end(); ++iterIt) { - newSelection = *iterIt; - ++newSelection; - removeItem(*iterIt); - } - - } - - if (newSelection) { - selection->select(newSelection); - } -} - - -/*------------------------------------------------------------------------------ - * Remove an item from the window. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: removeItem(const Gtk::TreeModel::iterator & iter) - throw () -{ - Glib::RefPtr treeModel - = Glib::RefPtr::cast_dynamic(get_model()); - treeModel->erase(iter); -} - - -/*------------------------------------------------------------------------------ - * Find the selected row. - *----------------------------------------------------------------------------*/ -Gtk::TreeModel::iterator -ZebraTreeView :: getSelectedRow(void) throw () -{ - Glib::RefPtr selection = get_selection(); - std::vector selectedRows; - Gtk::TreeModel::iterator it; - - switch (selection->get_mode()) { - case Gtk::SELECTION_SINGLE: - it = selection->get_selected(); - break; - - case Gtk::SELECTION_MULTIPLE: - selectedRows = selection->get_selected_rows(); - if (selectedRows.size() > 0) { - it = get_model()->get_iter(selectedRows.front()); - } - break; - - default: - break; - } - - return it; -} - - -/*------------------------------------------------------------------------------ - * Event handler for the row_inserted signal. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onRowInserted(const Gtk::TreeModel::Path & path, - const Gtk::TreeModel::iterator & iter) - throw () -{ - renumberRows(); - columns_autosize(); - emitSignalTreeModelChanged(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the row_deleted signal. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onRowDeleted(const Gtk::TreeModel::Path & path) - throw () -{ - renumberRows(); - columns_autosize(); - emitSignalTreeModelChanged(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the rows_reordered signal. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onRowsReordered(const Gtk::TreeModel::Path & path, - const Gtk::TreeModel::iterator & iter, - int* mapping) - throw () -{ - renumberRows(); - emitSignalTreeModelChanged(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the row_expanded signal. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onRowExpanded(const Gtk::TreeModel::iterator & iter, - const Gtk::TreeModel::Path & path) - throw () -{ - renumberRows(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the row_collapsed signal. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: onRowCollapsed(const Gtk::TreeModel::iterator & iter, - const Gtk::TreeModel::Path & path) - throw () -{ - renumberRows(); -} - - -/*------------------------------------------------------------------------------ - * Renumber the rows after they have changed. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: renumberRows(void) throw () -{ - Glib::RefPtr treeModel = get_model(); - ZebraTreeModelColumnRecord modelColumns; - int rowNumber = 0; - Gtk::TreeModel::iterator iter; - Gtk::TreeModel::iterator it; - - for (iter = treeModel->children().begin(); - iter != treeModel->children().end(); ++iter) { - Gtk::TreeRow row = *iter; - row[modelColumns.rowNumberColumn] = rowNumber++; - - if (row_expanded(treeModel->get_path(row))) { - for (it = row.children().begin(); it != row.children().end(); - ++it) { - Gtk::TreeRow childRow = *it; - childRow[modelColumns.rowNumberColumn] = rowNumber++; - } - } - } -} - - -/*------------------------------------------------------------------------------ - * Manually connect the 'model has changed' signals to the tree view. - *----------------------------------------------------------------------------*/ -void -ZebraTreeView :: connectModelSignals(Glib::RefPtr treeModel) - throw () -{ - treeModel->signal_row_inserted().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowInserted)); - treeModel->signal_row_deleted().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowDeleted)); - treeModel->signal_rows_reordered().connect(sigc::mem_fun(*this, - &ZebraTreeView::onRowsReordered)); -} - diff --git a/src/modules/widgets/src/main.cxx b/src/modules/widgets/src/main.cxx deleted file mode 100644 index 407704c7e..000000000 --- a/src/modules/widgets/src/main.cxx +++ /dev/null @@ -1,203 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/** @file - * This file is the main entry point for the TestWindow in the Widgets module. - */ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Widgets/WidgetFactory.h" -#include "TestWindow.h" - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * Our copyright notice, should be at most 80 columns - */ -static const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -static const char options[] = "c:hv"; - -/** - * Structure describing the long options - */ -static const struct option longOptions[] = { - { "config", required_argument, 0, 'c' }, - { "help", no_argument, 0, 'h' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } -}; - - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -static void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -static void -printUsage ( const char invocation[], - std::ostream & os ); - - -/* ============================================================= module code */ - -/** - * Program entry point. - * - * @param argc the number of command line arguments passed by the user. - * @param argv the command line arguments passed by the user. - * @return 0 on success, non-0 on failure. - */ -int main ( int argc, - char * argv[] ) -{ - // initialize the Gtk library, with the Gtk options first - Gtk::Main kit(argc, argv); - - // take a look at our options - int i; - std::string configFileName; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'c': - configFileName = optarg; - break; - - case 'h': - printUsage(argv[0], std::cout); - exit(EXIT_SUCCESS); - - case 'v': - printVersion(std::cout); - exit(EXIT_SUCCESS); - - default: - printUsage(argv[0], std::cout); - exit(EXIT_FAILURE); - } - } - - if (optind != argc) { - printUsage(argv[0], std::cout); - exit(EXIT_FAILURE); - } - - std::cerr << "using config file '" << configFileName << '\'' << std::endl; - - Ptr::Ref widgetFactory = WidgetFactory::getInstance(); - - try { - std::auto_ptr - parser(new xmlpp::DomParser(configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - widgetFactory->configure(*(document->get_root_node())); - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in configuration file" << std::endl - << e.what() << std::endl; - exit(EXIT_FAILURE); - } catch (xmlpp::exception &e) { - std::cerr << "error parsing configuration file" << std::endl - << e.what() << std::endl; - exit(EXIT_FAILURE); - } - - { - TestWindow testWindow; - testWindow.run(); - } - - exit(EXIT_SUCCESS); -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -static void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -static void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION]" - << std::endl - << " mandatory options:" << std::endl - << " -c, --config=file.name scheduler configuration file" << std::endl - << " optional options:" << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/modules/widgets/tmp/.keepme b/src/modules/widgets/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/modules/widgets/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/modules/widgets/var/en.txt b/src/modules/widgets/var/en.txt deleted file mode 100644 index d59f768a0..000000000 --- a/src/modules/widgets/var/en.txt +++ /dev/null @@ -1,3 +0,0 @@ -en:table -{ -} diff --git a/src/modules/widgets/var/glade/TestWindow.glade b/src/modules/widgets/var/glade/TestWindow.glade deleted file mode 100644 index a40916e9f..000000000 --- a/src/modules/widgets/var/glade/TestWindow.glade +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - 500 - 300 - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - False - False - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GDK_EXTENSION_EVENTS_CURSOR - True - True - True - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - True - True - - - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - drag target - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-ok - True - -5 - - - - - False - False - 2 - - - - - - diff --git a/src/modules/widgets/var/hu.txt b/src/modules/widgets/var/hu.txt deleted file mode 100644 index 066dc5ff3..000000000 --- a/src/modules/widgets/var/hu.txt +++ /dev/null @@ -1,18 +0,0 @@ -hu:table -{ - windowTitle:string { "Próbaablak" } - - pixbufColumnTitle:string { "Kép" } - textColumnTitle:string { "Szöveg" } - - firstOption:string { "Első lehetőség" } - secondOption:string { "Második lehetőség" } - thirdOption:string { "Harmadik lehetőség" } - - textOne:string { "Egy - megérett a meggy." } - textTwo:string { "Kettő - csipkebokor vessző." } - textThree:string { "Három - te leszel a párom. " } - - dropHereText:string { "Ide lehet húzni dolgokat." } -} - diff --git a/src/modules/widgets/var/icons/audioClipIcon.png b/src/modules/widgets/var/icons/audioClipIcon.png deleted file mode 100644 index f7adf90a85b7633f72fc58a21e9b9e9a029c311e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^{2H9D zV+hA}-?KOQS`>I3E-G<_37&dnwD`pT|4WTKb!x3WtGPe)rE%W+xnPoWYS3eo!r(to zPpwndmo_rGA^I}M`}g~dY5MGn|0*Xl&&v6%?Rfq4tbN;~zqmi!80cc-T=u-McgvL0 ow;UHYKPs?%|Lnq(n?aBHJ;GQOGZ$W13ACTV)78&qol`;+03L3S5&!@I diff --git a/src/modules/widgets/var/icons/playlistIcon.png b/src/modules/widgets/var/icons/playlistIcon.png deleted file mode 100644 index 2f41a4678eb3244bf52bf2211ff94aa0268a1693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^{2JLg@h_i0KYIN5QeR3fOC9_|D z`ub==`TsdF|5p{?IDPo@t0#?3O;2;=fB*mg_vg3kIT~*&^b%G6+5_!kED7=pW^j0R zBMrn!@^*J&=wOxg0CG4BJR*x37`TN&n2}-D90{Nxdx@v7EBjS;Nq#n&2*LQXK%ps~ zE{-7_*G>B(g$^t5I7j*@=CrA$EI#^ue`=z~*Qe%_bdAlPUjIBZF3UscX{iy9?#g8% zYRZqoR&n%-9oxe6eyfpWZO&5pN6K|UjJn|mCBED4@6+qbM5=I%#NJAf9G!*qYclsEjjKhpM17W*DpD@Fl26O&&R&tx%Cn& WIipS#Jah-TkHOQ`&t;ucLK6UyzNPa3 diff --git a/src/modules/widgets/var/root.txt b/src/modules/widgets/var/root.txt deleted file mode 100644 index f0e429c85..000000000 --- a/src/modules/widgets/var/root.txt +++ /dev/null @@ -1,18 +0,0 @@ -root:table -{ - windowTitle:string { "Test Window" } - - pixbufColumnTitle:string { "Pixbuf" } - textColumnTitle:string { "Text" } - - firstOption:string { "First option" } - secondOption:string { "Second option" } - thirdOption:string { "Third option" } - - textOne:string { "When I was One, I had just begun." } - textTwo:string { "When I was Two, I was nearly new." } - textThree:string { "When I was Three, I was hardly me." } - - dropHereText:string { "You can drop things here." } -} - diff --git a/src/products/gLiveSupport/bin/autogen.sh b/src/products/gLiveSupport/bin/autogen.sh deleted file mode 100755 index 8360c7525..000000000 --- a/src/products/gLiveSupport/bin/autogen.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="campcaster-studio" - -# assume we're in $basedir/bin -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -echo " aclocal $ACLOCAL_FLAGS" -cp -f ${configure_ac} ${tmpdir} -cp -f ${etcdir}/acinclude.m4 ${tmpdir} -aclocal $ACLOCAL_FLAGS - -echo " autoheader ${configure_ac}" -autoheader ${configure_ac} - -echo " autoconf -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/products/gLiveSupport/bin/campcaster-studio.sh b/src/products/gLiveSupport/bin/campcaster-studio.sh deleted file mode 100755 index 06083a6d6..000000000 --- a/src/products/gLiveSupport/bin/campcaster-studio.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Invoke script for Campcaster Studio. -#------------------------------------------------------------------------------- - - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -libdir=$basedir/lib -tmpdir=$basedir/tmp - - -#------------------------------------------------------------------------------- -# Set up the environment -#------------------------------------------------------------------------------- -export LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH -export GST_REGISTRY=$etcdir/gst-registry.xml -studio_exe=$bindir/campcaster-studio - -if [ -f ~/.campcaster/campcaster-studio.xml ]; then - config_file=~/.campcaster/campcaster-studio.xml -elif [ -f $etcdir/campcaster-studio.xml ]; then - config_file=$etcdir/campcaster-studio.xml -else - echo "Can't find configuration file."; -fi - -$studio_exe --version - -echo "using configuration file: $config_file"; - -$studio_exe -c $config_file diff --git a/src/products/gLiveSupport/bin/campcaster-studio_devenv.sh b/src/products/gLiveSupport/bin/campcaster-studio_devenv.sh deleted file mode 100755 index 68266ced1..000000000 --- a/src/products/gLiveSupport/bin/campcaster-studio_devenv.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Invoke script for Campcaster Studio. -# This script is only used in the Campcaster development environment. -#------------------------------------------------------------------------------- - - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -libdir=$basedir/lib -tmpdir=$basedir/tmp - -usrdir=`cd $basedir/../../../usr; pwd;` - - -#------------------------------------------------------------------------------- -# Set up the environment -#------------------------------------------------------------------------------- -export LD_LIBRARY_PATH=$usrdir/lib:$LD_LIBRARY_PATH - -if [ -x $tmpdir/campcaster-studio ]; then - studio_exe=$tmpdir/campcaster-studio -else - echo "Can't find scheduler executable."; -fi - -if [ -f ~/.campcaster/campcaster-studio.xml ]; then - config_file=~/.campcaster/campcaster-studio.xml -elif [ -f $etcdir/campcaster-studio.xml ]; then - config_file=$etcdir/campcaster-studio.xml -else - echo "Can't find configuration file."; -fi - -$studio_exe --version - -echo "using configuration file: $config_file"; - -$studio_exe -c $config_file diff --git a/src/products/gLiveSupport/bin/gen_coverage_data.sh b/src/products/gLiveSupport/bin/gen_coverage_data.sh deleted file mode 100755 index 159150a44..000000000 --- a/src/products/gLiveSupport/bin/gen_coverage_data.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script generates code coverage data for the module -#------------------------------------------------------------------------------- -module="Campcaster Studio" - -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -docdir=$basedir/doc -tmpdir=$basedir/tmp - -usrdir=`cd $basedir/../../../usr; pwd;` - -coverage_report_dir=$docdir/coverage - -raw_coverage_file=$tmpdir/raw_coverage.info -coverage_file=$tmpdir/coverage.info - -lcov=$usrdir/bin/lcov -genhtml=$usrdir/bin/genhtml - - -cd $basedir - -#------------------------------------------------------------------------------- -# Re-configure with covarege collection enabled, compile and run the tests -#------------------------------------------------------------------------------- -$bindir/autogen.sh --enable-coverage -make clean -make check - -#------------------------------------------------------------------------------- -# Generate some symlinks so that the sources are visible from tmpdir -#------------------------------------------------------------------------------- -ln -s $basedir/include $tmpdir/include -ln -s $basedir/src $tmpdir/src - - -#------------------------------------------------------------------------------- -# Use lcov to generate an HTML report on the coverage data -#------------------------------------------------------------------------------- -$lcov -d $tmpdir -c > $raw_coverage_file -$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file -rm -rf $coverage_report_dir -mkdir -p $coverage_report_dir -$genhtml -t "$module" -o $coverage_report_dir $coverage_file - - -#------------------------------------------------------------------------------- -# Clean up -#------------------------------------------------------------------------------- -rm -f $tmpdir/include -rm -f $tmpdir/src diff --git a/src/products/gLiveSupport/configure b/src/products/gLiveSupport/configure deleted file mode 100755 index 26ccda218..000000000 --- a/src/products/gLiveSupport/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen $*) -fi - -(cd $tmpdir && $configure $*) - diff --git a/src/products/gLiveSupport/doc/.keepme b/src/products/gLiveSupport/doc/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/products/gLiveSupport/doc/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/products/gLiveSupport/etc/Makefile.in b/src/products/gLiveSupport/etc/Makefile.in deleted file mode 100644 index 680855aa8..000000000 --- a/src/products/gLiveSupport/etc/Makefile.in +++ /dev/null @@ -1,468 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# @configure_input@ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -CP = cp -f -SED = sed -ECHO = echo -CAT = cat - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -PACKAGE_NAME = @PACKAGE_NAME@ - -BASE_DIR = @builddir@ -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -BIN_DIR = ${BASE_DIR}/bin -ETC_DIR = ${BASE_DIR}/etc -SRC_DIR = ${BASE_DIR}/src -TMP_DIR = ${BASE_DIR}/tmp -VAR_DIR = ${BASE_DIR}/var - -REAL_BASE_DIR=$(shell cd ${BASE_DIR}; pwd) - - -prefix = @prefix@ - -USR_DIR = ${prefix} -USR_BIN_DIR = ${USR_DIR}/bin -USR_ETC_DIR = ${USR_DIR}/etc -USR_INCLUDE_DIR = ${USR_DIR}/include -USR_LIB_DIR = ${USR_DIR}/lib -USR_VAR_DIR = ${USR_DIR}/var -STORAGE_TMP_DIR = "/tmp" - -HOSTNAME = @HOSTNAME@ -WWW_PORT = @WWW_PORT@ -SCHEDULER_PORT = @SCHEDULER_PORT@ -DB_SERVER = @DB_SERVER@ -DATABASE = @DATABASE@ -DB_USER = @DB_USER@ -DB_PASSWORD = @DB_PASSWORD@ -AUDIO_OUT = "@AUDIO_OUT@" -AUDIO_CUE = "@AUDIO_CUE@" - -PHP_URL_PREFIX=campcaster -ALIB_XML_RPC_PREFIX=xmlrpc/xrLocStor.php -SCHEDULER_XML_RPC_PREFIX=RC2 -SCHEDULER_DAEMON_COMMAND="sudo ${USR_BIN_DIR}/campcaster-scheduler.sh" - -USR_VAR_DIR_S=$(shell ${ECHO} ${USR_VAR_DIR} | ${SED} -e "s/\//\\\\\\\\\//g") -PHP_URL_PREFIX_S=$(shell ${ECHO} ${PHP_URL_PREFIX} | \ - ${SED} -e "s/\//\\\\\\\\\//g") -ALIB_XML_RPC_PREFIX_S=$(shell ${ECHO} ${ALIB_XML_RPC_PREFIX} | \ - ${SED} -e "s/\//\\\\\\\\\//g") -STORAGE_TMP_DIR_S=$(shell ${ECHO} ${STORAGE_TMP_DIR} | \ - ${SED} -e "s/\//\\\\\\\\\//g") -AUDIO_OUT_S=$(shell ${ECHO} ${AUDIO_OUT} | ${SED} -e "s/\//\\\\\\\\\//g") -AUDIO_CUE_S=$(shell ${ECHO} ${AUDIO_CUE} | ${SED} -e "s/\//\\\\\\\\\//g") -SCHEDULER_DAEMON_COMMAND_S=$(shell ${ECHO} ${SCHEDULER_DAEMON_COMMAND} | \ - ${SED} -e "s/\//\\\\\\\\\//g") - -REPLACE_SED_STRING="s/ls_var_dir/${USR_VAR_DIR_S}/; \ - s/ls_dbuser/${DB_USER}/; \ - s/ls_dbpassword/${DB_PASSWORD}/; \ - s/ls_dbserver/${DB_SERVER}/; \ - s/ls_database/${DATABASE}/; \ - s/ls_php_urlPrefix/${PHP_URL_PREFIX_S}/; \ - s/ls_php_host/${HOSTNAME}/; \ - s/ls_php_port/${WWW_PORT}/; \ - s/ls_alib_xmlRpcPrefix/${ALIB_XML_RPC_PREFIX_S}/; \ - s/ls_tmp_dir/${STORAGE_TMP_DIR_S}/; \ - s/ls_audio_output_device/${AUDIO_OUT_S}/; \ - s/ls_audio_cue_device/${AUDIO_CUE_S}/; \ - s/ls_scheduler_host/${HOSTNAME}/; \ - s/ls_scheduler_port/${SCHEDULER_PORT}/; \ - s/ls_scheduler_xmlRpcPrefix/${SCHEDULER_XML_RPC_PREFIX}/; \ - s/ls_scheduler_daemon_command/${SCHEDULER_DAEMON_COMMAND_S}/;" - -GENRB = @GENRB@ -TMP_STUDIO-LOCALIZATION_DIR = ${TMP_DIR}/studio-localization -GENRBOPTS = --destdir ${TMP_STUDIO-LOCALIZATION_DIR} \ - --encoding utf-8 \ - --strict - -VPATH = ${SRC_DIR} - -MODULES_DIR = ${BASE_DIR}/../../modules -PRODUCTS_DIR = ${BASE_DIR}/../../products - -STORAGE_SERVER_DIR = ${MODULES_DIR}/storageServer - -SCHEDULER_DIR = ${PRODUCTS_DIR}/scheduler -SCHEDULER_EXE = ${SCHEDULER_DIR}/tmp/campcaster-scheduler - -CORE_DIR = ${MODULES_DIR}/core -CORE_INCLUDE_DIR = ${CORE_DIR}/include -CORE_LIB_DIR = ${CORE_DIR}/lib -CORE_LIB = livesupport_core -CORE_LIB_FILE = ${CORE_LIB_DIR}/lib${CORE_LIB}.a - -AUTHENTICATION_DIR = ${MODULES_DIR}/authentication -AUTHENTICATION_INCLUDE_DIR = ${AUTHENTICATION_DIR}/include -AUTHENTICATION_LIB_DIR = ${AUTHENTICATION_DIR}/lib -AUTHENTICATION_LIB = livesupport_authentication -AUTHENTICATION_LIB_FILE = ${AUTHENTICATION_LIB_DIR}/lib${AUTHENTICATION_LIB}.a - -STORAGE_CLIENT_DIR = ${MODULES_DIR}/storageClient -STORAGE_CLIENT_INCLUDE_DIR = ${STORAGE_CLIENT_DIR}/include -STORAGE_CLIENT_LIB_DIR = ${STORAGE_CLIENT_DIR}/lib -STORAGE_CLIENT_LIB = livesupport_storage_client -STORAGE_CLIENT_LIB_FILE = ${STORAGE_CLIENT_LIB_DIR}/lib${STORAGE_CLIENT_LIB}.a - -SCHEDULER_CLIENT_DIR = ${MODULES_DIR}/schedulerClient -SCHEDULER_CLIENT_INCLUDE_DIR = ${SCHEDULER_CLIENT_DIR}/include -SCHEDULER_CLIENT_LIB_DIR = ${SCHEDULER_CLIENT_DIR}/lib -SCHEDULER_CLIENT_LIB = livesupport_scheduler_client -SCHEDULER_CLIENT_LIB_FILE = ${SCHEDULER_CLIENT_LIB_DIR}/lib${SCHEDULER_CLIENT_LIB}.a - -PLAYLIST_EXECUTOR_DIR = ${MODULES_DIR}/playlistExecutor -PLAYLIST_EXECUTOR_INCLUDE_DIR = ${PLAYLIST_EXECUTOR_DIR}/include -PLAYLIST_EXECUTOR_LIB_DIR = ${PLAYLIST_EXECUTOR_DIR}/lib -PLAYLIST_EXECUTOR_LIB = livesupport_playlist_executor -PLAYLIST_EXECUTOR_LIB_FILE = ${PLAYLIST_EXECUTOR_LIB_DIR}/lib${PLAYLIST_EXECUTOR_LIB}.a - -WIDGETS_DIR = ${MODULES_DIR}/widgets -WIDGETS_INCLUDE_DIR = ${WIDGETS_DIR}/include -WIDGETS_LIB_DIR = ${WIDGETS_DIR}/lib -WIDGETS_LIB = livesupport_widgets -WIDGETS_LIB_FILE = ${WIDGETS_LIB_DIR}/lib${WIDGETS_LIB}.a - -BOOST_CFLAGS=@BOOST_CPPFLAGS@ -BOOST_LIBS=@BOOST_LDFLAGS@ -BOOST_DATE_TIME_LIB=@BOOST_DATE_TIME_LIB@ - -LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ -LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ - -CURL_CFLAGS=@CURL_CFLAGS@ -CURL_LIBS=@CURL_LIBS@ - -GTKMM_CFLAGS=@GTKMM_CFLAGS@ -GTKMM_LIBS=@GTKMM_LIBS@ - -LIBGLADEMM_CFLAGS=@LIBGLADEMM_CFLAGS@ -LIBGLADEMM_LIBS=@LIBGLADEMM_LIBS@ - -GSTREAMER_CFLAGS=@GSTREAMER_CFLAGS@ -GSTREAMER_LIBS=@GSTREAMER_LIBS@ - -GSTCONTROLLER_CFLAGS=@GSTCONTROLLER_CFLAGS@ -GSTCONTROLLER_LIBS=@GSTCONTROLLER_LIBS@ - -LIBSERIAL_CFLAGS=@LIBSERIAL_CFLAGS@ -LIBSERIAL_LIBS=@LIBSERIAL_LIBS@ - -ICU_CFLAGS=@ICU_CFLAGS@ -ICU_CXXFLAGS=@ICU_CXXFLAGS@ -ICU_LIBS=@ICU_LIBS@ - -TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ -TAGLIB_LIBS=@TAGLIB_LIBS@ - -TEST_RESULTS = ${DOC_DIR}/testResults.xml -# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR -TEST_XSLT = ../etc/testResultToHtml.xsl - -G_LIVESUPPORT_EXE = ${TMP_DIR}/campcaster-studio -G_LIVESUPPORT_SH = ${BIN_DIR}/campcaster-studio_devenv.sh -G_LIVESUPPORT_CFG = ${ETC_DIR}/campcaster-studio.xml -TEST_RUNNER = ${TMP_DIR}/testRunner - -DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config - -export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} - - -#------------------------------------------------------------------------------- -# Configuration parameters -#------------------------------------------------------------------------------- -CPPFLAGS = @CPPFLAGS@ -CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ - -pedantic -Wall -Wno-long-long \ - ${BOOST_CFLAGS} \ - ${TAGLIB_CFLAGS} \ - ${LIBXMLPP_CFLAGS} \ - ${GTKMM_CFLAGS} \ - ${LIBGLADEMM_CFLAGS} \ - ${GSTREAMER_CFLAGS} \ - ${GSTCONTROLLER_CFLAGS} \ - ${LIBSERIAL_CFLAGS} \ - -I${USR_INCLUDE_DIR} \ - -I${CORE_INCLUDE_DIR} \ - -I${AUTHENTICATION_INCLUDE_DIR} \ - -I${STORAGE_CLIENT_INCLUDE_DIR} \ - -I${WIDGETS_INCLUDE_DIR} \ - -I${SCHEDULER_CLIENT_INCLUDE_DIR} \ - -I${PLAYLIST_EXECUTOR_INCLUDE_DIR} \ - -I${TMP_DIR} -LDFLAGS = @LDFLAGS@ -pthread \ - ${BOOST_LIBS} \ - ${ICU_LIBS} \ - ${LIBXMLPP_LIBS} \ - ${CURL_LIBS} \ - ${GTKMM_LIBS} \ - ${LIBGLADEMM_LIBS} \ - ${GSTREAMER_LIBS} \ - ${GSTCONTROLLER_LIBS} \ - ${LIBSERIAL_LIBS} \ - ${TAGLIB_LIBS} \ - -L${USR_LIB_DIR} \ - -L${CORE_LIB_DIR} \ - -L${AUTHENTICATION_LIB_DIR} \ - -L${STORAGE_CLIENT_LIB_DIR} \ - -L${WIDGETS_LIB_DIR} \ - -L${SCHEDULER_CLIENT_LIB_DIR} \ - -L${PLAYLIST_EXECUTOR_LIB_DIR} - - -#------------------------------------------------------------------------------- -# Dependencies -#------------------------------------------------------------------------------- -G_LIVESUPPORT_OBJS = ${TMP_DIR}/GLiveSupport.o \ - ${TMP_DIR}/MasterPanelWindow.o \ - ${TMP_DIR}/NowPlaying.o \ - ${TMP_DIR}/GuiObject.o \ - ${TMP_DIR}/GuiWindow.o \ - ${TMP_DIR}/GuiComponent.o \ - ${TMP_DIR}/LoginWindow.o \ - ${TMP_DIR}/UploadFileWindow.o \ - ${TMP_DIR}/ScratchpadWindow.o \ - ${TMP_DIR}/PlaylistWindow.o \ - ${TMP_DIR}/SchedulerWindow.o \ - ${TMP_DIR}/SchedulePlaylistWindow.o \ - ${TMP_DIR}/SearchWindow.o \ - ${TMP_DIR}/AdvancedSearchEntry.o \ - ${TMP_DIR}/AdvancedSearchItem.o \ - ${TMP_DIR}/BrowseEntry.o \ - ${TMP_DIR}/BrowseItem.o \ - ${TMP_DIR}/LiveModeWindow.o \ - ${TMP_DIR}/CuePlayer.o \ - ${TMP_DIR}/KeyboardShortcut.o \ - ${TMP_DIR}/KeyboardShortcutContainer.o \ - ${TMP_DIR}/KeyboardShortcutList.o \ - ${TMP_DIR}/OptionsWindow.o \ - ${TMP_DIR}/DateTimeChooserWindow.o \ - ${TMP_DIR}/BackupList.o \ - ${TMP_DIR}/BackupView.o \ - ${TMP_DIR}/ExportPlaylistWindow.o \ - ${TMP_DIR}/ExportFormatRadioButtons.o \ - ${TMP_DIR}/TransportList.o \ - ${TMP_DIR}/RestoreBackupWindow.o \ - ${TMP_DIR}/TaskbarIcons.o \ - ${TMP_DIR}/RdsView.o \ - ${TMP_DIR}/RdsEntry.o \ - ${TMP_DIR}/DndMethods.o - -G_LIVESUPPORT_RES = ${TMP_STUDIO-LOCALIZATION_DIR}/root.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/en.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/es.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/fr.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/hu.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/nl.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/pl.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/sr_CS.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/sr_CS_CYRILLIC.res \ - ${TMP_STUDIO-LOCALIZATION_DIR}/sv.res - -G_LIVESUPPORT_EXE_OBJS = ${TMP_DIR}/main.o - -FSDF = ${G_LIVESUPPORT_OBJS} \ - ${TMP_DIR}/main.o -G_LIVESUPPORT_EXE_LIBS = -l${PLAYLIST_EXECUTOR_LIB} \ - -l${AUTHENTICATION_LIB} \ - -l${STORAGE_CLIENT_LIB} \ - -l${WIDGETS_LIB} \ - -l${SCHEDULER_CLIENT_LIB} \ - -l${CORE_LIB} \ - ${BOOST_DATE_TIME_LIB} \ - -lxmlrpc++ -lssl -ltar - -TEST_RUNNER_OBJS = ${G_LIVESUPPORT_OBJS} \ - ${TMP_DIR}/TestRunner.o \ - ${TMP_DIR}/AudioPlayerTest.o \ - ${TMP_DIR}/GLiveSupportTest.o \ - ${TMP_DIR}/KeyboardShortcutTest.o - -TEST_RUNNER_LIBS = ${G_LIVESUPPORT_EXE_LIBS} -lcppunit -ldl - - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -.PHONY: all dir_setup doc clean docclean depclean distclean check install -.PHONY: init start run_tests stop deinit - -all: dir_setup ${G_LIVESUPPORT_EXE} ${G_LIVESUPPORT_RES} - -dir_setup: ${TMP_DIR} ${TMP_STUDIO-LOCALIZATION_DIR} ${DOXYGEN_DIR} - -doc: - ${DOXYGEN} ${DOXYGEN_CONFIG} - -clean: - ${RM} ${G_LIVESUPPORT_EXE_OBJS} ${G_LIVESUPPORT_RES} ${G_LIVESUPPORT_EXE} - ${RMDIR} ${TMP_STUDIO-LOCALIZATION_DIR} - ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER} - ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info - -docclean: - ${RMDIR} ${DOXYGEN_DIR}/html - ${RMDIR} ${COVERAGE_DIR}/* - ${RM} ${TEST_RESULTS} - -depclean: clean - ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} clean - ${MAKE} -C ${SCHEDULER_CLIENT_DIR} clean - ${MAKE} -C ${WIDGETS_DIR} clean - ${MAKE} -C ${STORAGE_CLIENT_DIR} clean - ${MAKE} -C ${AUTHENTICATION_DIR} clean - ${MAKE} -C ${CORE_DIR} clean - -distclean: clean docclean - ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 - -check: all ${TEST_RUNNER} storage_server_init run_tests - -install: all - ${MAKE} -C ${CORE_DIR} install - ${MAKE} -C ${AUTHENTICATION_DIR} install - ${MAKE} -C ${STORAGE_CLIENT_DIR} install - ${MAKE} -C ${WIDGETS_DIR} install - ${MAKE} -C ${SCHEDULER_CLIENT_DIR} install - ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} install - ${MKDIR} ${USR_BIN_DIR} - ${CP} ${BIN_DIR}/campcaster-studio.sh ${USR_BIN_DIR} - ${CP} ${G_LIVESUPPORT_EXE} ${USR_BIN_DIR} - ${MKDIR} ${USR_ETC_DIR} - ${CP} ${ETC_DIR}/campcaster-studio.xml.template ${USR_ETC_DIR} - ${CAT} ${ETC_DIR}/campcaster-studio.xml.template | \ - ${SED} -e ${REPLACE_SED_STRING} \ - > ${USR_ETC_DIR}/campcaster-studio.xml - ${MKDIR} ${USR_VAR_DIR}/Campcaster - ${CP} ${VAR_DIR}/campcaster.png \ - ${VAR_DIR}/stationLogo.png \ - ${VAR_DIR}/icon*.png \ - ${VAR_DIR}/testAudio.ogg \ - ${USR_VAR_DIR}/Campcaster - ${MKDIR} ${USR_VAR_DIR}/Campcaster/studio-localization - ${CP} ${TMP_DIR}/studio-localization/*.res \ - ${USR_VAR_DIR}/Campcaster/studio-localization/ - ${MKDIR} ${USR_VAR_DIR}/Campcaster/glade - ${CP} ${VAR_DIR}/glade/*.glade \ - ${USR_VAR_DIR}/Campcaster/glade/ - -run_tests: ${TEST_RUNNER} - ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} - -run: all - ${G_LIVESUPPORT_SH} - -init: ${SCHEDULER_EXE} - -${MAKE} -C ${STORAGE_SERVER_DIR} db_init - -${MAKE} -C ${SCHEDULER_DIR} init - -start: ${SCHEDULER_EXE} - ${MAKE} -C ${SCHEDULER_DIR} start - -stop: ${SCHEDULER_EXE} - ${MAKE} -C ${SCHEDULER_DIR} stop - -status: ${SCHEDULER_EXE} - ${MAKE} -C ${SCHEDULER_DIR} status - -deinit: ${SCHEDULER_EXE} - -${MAKE} -C ${SCHEDULER_DIR} deinit - -${MAKE} -C ${STORAGE_SERVER_DIR} db_clean - -storage_server_init: - ${MAKE} -C ${STORAGE_SERVER_DIR} - - -#------------------------------------------------------------------------------- -# Specific targets -#------------------------------------------------------------------------------- -${G_LIVESUPPORT_EXE}: ${CORE_LIB_FILE} \ - ${AUTHENTICATION_LIB_FILE} \ - ${STORAGE_CLIENT_LIB_FILE} \ - ${WIDGETS_LIB_FILE} \ - ${SCHEDULER_CLIENT_LIB_FILE} \ - ${PLAYLIST_EXECUTOR_LIB_FILE} \ - ${G_LIVESUPPORT_OBJS} ${G_LIVESUPPORT_EXE_OBJS} - ${CXX} ${LDFLAGS} -o $@ $^ ${G_LIVESUPPORT_EXE_LIBS} - -${TMP_DIR}: - ${MKDIR} ${TMP_DIR} - -${TMP_STUDIO-LOCALIZATION_DIR}: - ${MKDIR} ${TMP_STUDIO-LOCALIZATION_DIR} - -${DOXYGEN_DIR}: - ${MKDIR} ${DOXYGEN_DIR} - -${TEST_RUNNER}: ${CORE_LIB_FILE} \ - ${AUTHENTICATION_LIB_FILE} \ - ${STORAGE_CLIENT_LIB_FILE} \ - ${WIDGETS_LIB_FILE} \ - ${SCHEDULER_CLIENT_LIB_FILE} \ - ${TEST_RUNNER_OBJS} - ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} - -${CORE_LIB_FILE}: - ${MAKE} -C ${CORE_DIR} - -${AUTHENTICATION_LIB_FILE}: - ${MAKE} -C ${AUTHENTICATION_DIR} - -${STORAGE_CLIENT_LIB_FILE}: - ${MAKE} -C ${STORAGE_CLIENT_DIR} - -${WIDGETS_LIB_FILE}: - ${MAKE} -C ${WIDGETS_DIR} - -${SCHEDULER_CLIENT_LIB_FILE}: - ${MAKE} -C ${SCHEDULER_CLIENT_DIR} - -${PLAYLIST_EXECUTOR_LIB_FILE}: - ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} - - -#------------------------------------------------------------------------------- -# Pattern rules -#------------------------------------------------------------------------------- -${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx - ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< - -${TMP_STUDIO-LOCALIZATION_DIR}/%.res : ${VAR_DIR}/%.txt - ${GENRB} ${GENRBOPTS} $^ - diff --git a/src/products/gLiveSupport/etc/acinclude.m4 b/src/products/gLiveSupport/etc/acinclude.m4 deleted file mode 100644 index 20cd235ab..000000000 --- a/src/products/gLiveSupport/etc/acinclude.m4 +++ /dev/null @@ -1,575 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl Macro to check for available modules using pkg-conf -dnl -dnl usage: -dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) -dnl -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -dnl -dnl This function was taken from the glade-- project -dnl----------------------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for taglib of sufficient version by looking at taglib-config -dnl -dnl usage: -dnl AC_CHECK_TAGLIB(version, action-if, action-not) -dnl -dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_TAGLIB], [ - succeeded=no - - if test -z "$TAGLIB_CONFIG"; then - AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) - fi - - if test "$TAGLIB_CONFIG" = "no" ; then - echo "*** The taglib-config script could not be found. Make sure it is" - echo "*** in your path, and that taglib is properly installed." - echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" - else - TAGLIB_VERSION=`$TAGLIB_CONFIG --version` - AC_MSG_CHECKING(for taglib >= $1) - VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(TAGLIB_CFLAGS) - TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` - AC_MSG_RESULT($TAGLIB_CFLAGS) - - AC_MSG_CHECKING(TAGLIB_LIBS) - TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` - AC_MSG_RESULT($TAGLIB_LIBS) - else - TAGLIB_CFLAGS="" - TAGLIB_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find taglib >= $1",) - fi - - AC_SUBST(TAGLIB_CFLAGS) - AC_SUBST(TAGLIB_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for ICU of sufficient version by looking at icu-config -dnl -dnl usage: -dnl AC_CHECK_ICU(version, action-if, action-not) -dnl -dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_ICU], [ - succeeded=no - - if test -z "$ICU_CONFIG"; then - AC_PATH_PROG(ICU_CONFIG, icu-config, no) - fi - - if test "$ICU_CONFIG" = "no" ; then - echo "*** The icu-config script could not be found. Make sure it is" - echo "*** in your path, and that taglib is properly installed." - echo "*** Or see http://ibm.com/software/globalization/icu/" - else - ICU_VERSION=`$ICU_CONFIG --version` - AC_MSG_CHECKING(for ICU >= $1) - VERSION_CHECK=`expr $ICU_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(ICU_CFLAGS) - ICU_CFLAGS=`$ICU_CONFIG --cflags` - AC_MSG_RESULT($ICU_CFLAGS) - - AC_MSG_CHECKING(ICU_CXXFLAGS) - ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` - AC_MSG_RESULT($ICU_CXXFLAGS) - - AC_MSG_CHECKING(ICU_LIBS) - ICU_LIBS=`$ICU_CONFIG --ldflags` - AC_MSG_RESULT($ICU_LIBS) - else - ICU_CFLAGS="" - ICU_CXXFLAGS="" - ICU_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find ICU >= $1",) - fi - - AC_SUBST(ICU_CFLAGS) - AC_SUBST(ICU_CXXFLAGS) - AC_SUBST(ICU_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for curl of sufficient version by looking at curl-config -dnl -dnl usage: -dnl AC_CHECK_CURL(version, action-if, action-not) -dnl -dnl defines CURL_LIBS, CURL_CFLAGS, see curl-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_CURL], [ - succeeded=no - - if test -z "$CURL_CONFIG"; then - AC_PATH_PROG(CURL_CONFIG, curl-config, no) - fi - - if test "$CURL_CONFIG" = "no" ; then - echo "*** The curl-config script could not be found. Make sure it is" - echo "*** in your path, and that curl is properly installed." - echo "*** Or see http://curl.haxx.se/" - else - dnl curl-config --version returns "libcurl ", thus cut the number - CURL_VERSION=`$CURL_CONFIG --version | cut -d" " -f2` - AC_MSG_CHECKING(for curl >= $1) - VERSION_CHECK=`expr $CURL_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(CURL_CFLAGS) - CURL_CFLAGS=`$CURL_CONFIG --cflags` - AC_MSG_RESULT($CURL_CFLAGS) - - AC_MSG_CHECKING(CURL_LIBS) - CURL_LIBS=`$CURL_CONFIG --libs` - AC_MSG_RESULT($CURL_LIBS) - else - CURL_CFLAGS="" - CURL_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find curl >= $1",) - fi - - AC_SUBST(CURL_CFLAGS) - AC_SUBST(CURL_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (curl) not met.]), [$3]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for C++ namespaces -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html -dnl -dnl usage: -dnl If the compiler can prevent names clashes using namespaces, -dnl define HAVE_NAMESPACES. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CXX_NAMESPACES], -[AC_CACHE_CHECK(whether the compiler implements namespaces, -ac_cv_cxx_namespaces, -[AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], - [using namespace Outer::Inner; return i;], - ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) - AC_LANG_RESTORE -]) -if test "$ac_cv_cxx_namespaces" = yes; then - AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) -fi -]) - - -dnl----------------------------------------------------------------------------- -dnl Test for the Boost C++ libraries of a particular version (or newer). -dnl for more information on boost, see http://www.boost.org/ -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ax_boost_base.html -dnl -dnl usage: -dnl If no path to the installed boost library is given the macro searches -dnl under ${prefix}, /usr, /usr/local, and /opt, and evaluates the $BOOST_ROOT -dnl environment variable. Further documentation is available at -dnl http://randspringer.de/boost/index.html -dnl -dnl This macro calls: AC_SUBST(BOOST_CPPFLAGS) and AC_SUBST(BOOST_LDFLAGS) -dnl and sets: HAVE_BOOST -dnl -dnl Modified for Campcaster: -dnl * --with-boost default changed to Yes; -dnl * if the library is not found, it does not die, just prints "no", leaves -dnl HAVE_BOOST undefined, and sets the BOOST_CPPFLAGS and BOOST_LDFLAGS -dnl variables to ""; -dnl * ${prefix} is prepended to the search path. -dnl -dnl Author: Thomas Porschberg -dnl -dnl License: -dnl Copyright © 2006 Thomas Porschberg -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AX_BOOST_BASE], -[ -AC_ARG_WITH([boost], - AS_HELP_STRING([--with-boost@<:@=DIR@:>@], [use boost (default is Yes) - it is possible to specify the root directory for boost (optional)]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ac_boost_path="" - else - want_boost="yes" - ac_boost_path="$withval" - fi - ], - [want_boost="yes"]) - -if test "x$want_boost" = "xyes"; then - boost_lib_version_req=ifelse([$1], ,1.20.0,$1) - boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` - boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` - boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$boost_lib_version_req_sub_minor" = "x" ; then - boost_lib_version_req_sub_minor="0" - fi - WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` - AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) - succeeded=no - - dnl first we check the system location for boost libraries - dnl this location ist chosen if boost libraries are installed with the --layout=system option - dnl or if you install boost with RPM - if test "$ac_boost_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_path/lib" - BOOST_CPPFLAGS="-I$ac_boost_path/include" - else - for ac_boost_path_tmp in ${prefix} /usr /usr/local /opt ; do - if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then - BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib" - BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" - break; - fi - done - fi - - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - - - - dnl if we found no boost with system layout we search for boost libraries - dnl built and installed without the --layout=system option or for a staged(not installed) version - if test "x$succeeded" != "xyes"; then - _version=0 - if test "$ac_boost_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_path/lib" - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - fi - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" - done - fi - else - for ac_boost_path in /usr /usr/local /opt ; do - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - best_path=$ac_boost_path - fi - done - fi - done - - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - BOOST_LDFLAGS="-L$best_path/lib" - - if test "x$BOOST_ROOT" != "x"; then - if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/lib" && test -r "$BOOST_ROOT/stage/lib"; then - version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` - stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` - stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` - V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "$V_CHECK" = "1" ; then - AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) - BOOST_CPPFLAGS="-I$BOOST_ROOT" - BOOST_LDFLAGS="-L$BOOST_ROOT/stage/lib" - fi - fi - fi - fi - - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - fi - - if test "$succeeded" != "yes" ; then - BOOST_CPPFLAGS="" - BOOST_LDFLAGS="" - AC_MSG_RESULT(no) - else - AC_SUBST(BOOST_CPPFLAGS) - AC_SUBST(BOOST_LDFLAGS) - AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" -fi - -]) - - -dnl----------------------------------------------------------------------------- -dnl Test for Date_Time library from the Boost C++ libraries. -dnl for more information on boost, see http://www.boost.org/ -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ax_boost_date_time.html -dnl -dnl usage: -dnl The macro requires a preceding call to AX_BOOST_BASE. -dnl Further documentation is available at -dnl . -dnl -dnl This macro calls: AC_SUBST(BOOST_DATE_TIME_LIB) -dnl and sets: HAVE_BOOST_DATE_TIME -dnl -dnl Modified for Campcaster: -dnl * --with-boost-date-time default changed to Yes. -dnl * added some more recognized suffixes to the library's name, incl. "-st". -dnl -dnl Authors: -dnl Thomas Porschberg -dnl Michael Tindal -dnl -dnl License: -dnl Copyright © 2006 Thomas Porschberg -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AX_BOOST_DATE_TIME], -[ - AC_ARG_WITH([boost-date-time], - AS_HELP_STRING([--with-boost-date-time@<:@=special-lib@:>@], - [use the Date_Time library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-date-time=boost_date_time-gcc-mt-d-1_33_1 ]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ax_boost_user_date_time_lib="" - else - want_boost="yes" - ax_boost_user_date_time_lib="$withval" - fi - ], - [want_boost="yes"] - ) - - if test "x$want_boost" = "xyes"; then - AC_REQUIRE([AC_PROG_CC]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_CACHE_CHECK(whether the Boost::Date_Time library is available, - ax_cv_boost_date_time, - [AC_LANG_PUSH([C++]) - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[@%:@include ]], - [[using namespace boost::gregorian; date d(2002,Jan,10); - return 0; - ]]), - ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) - AC_LANG_POP([C++]) - ]) - if test "x$ax_cv_boost_date_time" = "xyes"; then - AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::Date_Time library is available]) - BN=boost_date_time - if test "x$ax_boost_user_date_time_lib" = "x"; then - for ax_lib in $BN $BN-st $BN-mt $BN-mt-s $BN-s \ - $BN-$CC $BN-$CC-st $BN-$CC-mt $BN-$CC-mt-s $BN-$CC-s \ - lib$BN lib$BN-st lib$BN-mt lib$BN-mt-s lib$BN-s \ - lib$BN-$CC lib$BN-$CC-st lib$BN-$CC-mt lib$BN-$CC-mt-s lib$BN-$CC-s \ - $BN-mgw $BN-mgw $BN-mgw-st $BN-mgw-mt $BN-mgw-mt-s $BN-mgw-s ; do - AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB="-l$ax_lib" AC_SUBST(BOOST_DATE_TIME_LIB) link_date_time="yes" break], - [link_date_time="no"]) - done - else - for ax_lib in $ax_boost_user_date_time_lib $BN-$ax_boost_user_date_time_lib; do - AC_CHECK_LIB($ax_lib, main, - [BOOST_DATE_TIME_LIB="-l$ax_lib" AC_SUBST(BOOST_DATE_TIME_LIB) link_date_time="yes" break], - [link_date_time="no"]) - done - - fi - if test "x$link_date_time" = "xno"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - fi - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - fi -]) - diff --git a/src/products/gLiveSupport/etc/audioPlayer.xml b/src/products/gLiveSupport/etc/audioPlayer.xml deleted file mode 100644 index 71a8b33ca..000000000 --- a/src/products/gLiveSupport/etc/audioPlayer.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - -]> - - - diff --git a/src/products/gLiveSupport/etc/authenticationClient.xml b/src/products/gLiveSupport/etc/authenticationClient.xml deleted file mode 100644 index a63a04718..000000000 --- a/src/products/gLiveSupport/etc/authenticationClient.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - -]> - - - - - diff --git a/src/products/gLiveSupport/etc/authenticationClient.xml.user-template b/src/products/gLiveSupport/etc/authenticationClient.xml.user-template deleted file mode 100644 index 1c453d095..000000000 --- a/src/products/gLiveSupport/etc/authenticationClient.xml.user-template +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - -]> - - - - - diff --git a/src/products/gLiveSupport/etc/campcaster-studio.xml b/src/products/gLiveSupport/etc/campcaster-studio.xml deleted file mode 100644 index 70b651d3d..000000000 --- a/src/products/gLiveSupport/etc/campcaster-studio.xml +++ /dev/null @@ -1,451 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 3000 - - - - - - - mp3 - mpeg - ogg - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/products/gLiveSupport/etc/campcaster-studio.xml.template b/src/products/gLiveSupport/etc/campcaster-studio.xml.template deleted file mode 100644 index 0b0bf483f..000000000 --- a/src/products/gLiveSupport/etc/campcaster-studio.xml.template +++ /dev/null @@ -1,450 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 3000 - - - - - - - mp3 - mpeg - ogg - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/products/gLiveSupport/etc/campcaster-studio.xml.user-template b/src/products/gLiveSupport/etc/campcaster-studio.xml.user-template deleted file mode 100644 index 4a062cc5d..000000000 --- a/src/products/gLiveSupport/etc/campcaster-studio.xml.user-template +++ /dev/null @@ -1,450 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 3000 - - - - - - - mp3 - mpeg - ogg - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/products/gLiveSupport/etc/configure.ac b/src/products/gLiveSupport/etc/configure.ac deleted file mode 100644 index 618638cfa..000000000 --- a/src/products/gLiveSupport/etc/configure.ac +++ /dev/null @@ -1,289 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(Campcaster-Studio, 0.0, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../src/main.cxx) - -AC_CONFIG_HEADERS(configure.h) -AC_PROG_CXX() - -AC_CHECK_HEADERS(sys/types.h unistd.h getopt.h signal.h sys/stat.h time.h) -AC_CHECK_HEADERS(stdio.h fcntl.h sys/time.h pwd.h) - - -dnl----------------------------------------------------------------------------- -dnl specify whether debug info should be compiled into the executable -dnl----------------------------------------------------------------------------- -AC_SUBST(CXXFLAGS) - -AC_ARG_ENABLE([debug], - AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), - [], - [enable_debug=no]) - -if test "x${enable_debug}" = "xyes"; then - CXXFLAGS="-g -O0" - AC_DEFINE( YDEBUG, 1, [Debug is on] ) -else - CXXFLAGS="-O3" -fi - - -AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the pkg-config path -dnl----------------------------------------------------------------------------- -AC_ARG_WITH([pkg-config-path], - AC_HELP_STRING([--with-pkg-config-path], - [use the pkg-config path (prefix/lib/pkgconfig)]), - [PKG_CONFIG_PATH=${withval}], - [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig:$PKG_CONFIG_PATH]) - -AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) - -export PKG_CONFIG_PATH - -export PATH=${prefix}/bin:${PATH} - - -AX_BOOST_BASE([1.33.1]) -if test "x${BOOST_CPPFLAGS}" != "x"; then - AX_BOOST_DATE_TIME - if test "x${BOOST_DATE_TIME_LIB}" = "x"; then - AC_MSG_ERROR([Boost date-time library not found]) - fi -else - AC_MSG_ERROR([Boost library >= 1.33.1 not found]) -fi - -PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) -AC_SUBST(LIBXMLPP_CFLAGS) -AC_SUBST(LIBXMLPP_LIBS) - -PKG_CHECK_MODULES(GTKMM,[gtkmm-2.4 >= 2.5.5]) -AC_SUBST(GTKMM_CFLAGS) -AC_SUBST(GTKMM_LIBS) - -PKG_CHECK_MODULES(LIBGLADEMM,[libglademm-2.4 >= 2.6.2]) -AC_SUBST(LIBGLADEMM_CFLAGS) -AC_SUBST(LIBGLADEMM_LIBS) - -PKG_CHECK_MODULES(GSTREAMER,[gstreamer-0.10 >= 0.10]) -AC_SUBST(GSTREAMER_CFLAGS) -AC_SUBST(GSTREAMER_LIBS) - -PKG_CHECK_MODULES(GSTCONTROLLER,[gstreamer-controller-0.10 >= 0.10]) -AC_SUBST(GSTCONTROLLER_CFLAGS) -AC_SUBST(GSTCONTROLLER_LIBS) - -PKG_CHECK_MODULES(LIBSERIAL,[libserial >= 0.5.2]) -AC_SUBST(LIBSERIAL_CFLAGS) -AC_SUBST(LIBSERIAL_LIBS) - -AC_CHECK_CURL(7.12.3) -AC_SUBST(CURL_CFLAGS) -AC_SUBST(CURL_LIBS) - -AC_CHECK_TAGLIB(1.3.1) -AC_SUBST(TAGLIB_CFLAGS) -AC_SUBST(TAGLIB_LIBS) - -AC_CHECK_ICU(3.0) -AC_SUBST(ICU_CFLAGS) -AC_SUBST(ICU_CXXFLAGS) -AC_SUBST(ICU_LIBS) - -AC_PATH_PROG(GENRB, genrb) -AC_SUBST(GENRB) - - -dnl----------------------------------------------------------------------------- -dnl enable compilaton for code coverage data -dnl----------------------------------------------------------------------------- -AC_SUBST(COVERAGE_CXXFLAGS) - -AC_ARG_ENABLE( coverage, -[ --enable-coverage enable code coverage data generaton (no) ], - ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) - -if test "x${ENABLE_COVERAGE}" == "xyes" ; then - COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" - AC_MSG_RESULT([compiling in code coverage mode]) -else - AC_MSG_RESULT([not compiling in code coverage mode]) -fi - - -dnl----------------------------------------------------------------------------- -dnl specify the FQDN -dnl----------------------------------------------------------------------------- -AC_SUBST(HOSTNAME) - -AC_ARG_WITH([hostname], - AC_HELP_STRING([--with-hostname], - [use the specified hostname (guess)]), - [HOSTNAME=${withval}], [HOSTNAME=`hostname -f`]) - -AC_MSG_RESULT([using hostname: ${HOSTNAME}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the web server port -dnl----------------------------------------------------------------------------- -AC_SUBST(WWW_PORT) - -AC_ARG_WITH([www-port], - AC_HELP_STRING([--with-www-port], - [use the specified www port (80)]), - [WWW_PORT=${withval}], [WWW_PORT=80]) - -AC_MSG_RESULT([using www port: ${WWW_PORT}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the scheduler server port -dnl----------------------------------------------------------------------------- -AC_SUBST(SCHEDULER_PORT) - -AC_ARG_WITH([scheduler-port], - AC_HELP_STRING([--with-scheduler-port], - [use the specified scheduler port (3344)]), - [SCHEDULER_PORT=${withval}], [SCHEDULER_PORT=3344]) - -AC_MSG_RESULT([using scheduler port: ${SCHEDULER_PORT}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the database server name -dnl----------------------------------------------------------------------------- -AC_SUBST(DB_SERVER) - -AC_ARG_WITH([database-server], - AC_HELP_STRING([--with-database-server], - [use the specified database server (localhost)]), - [DB_SERVER=${withval}], [DB_SERVER=localhost]) - -AC_MSG_RESULT([using database server: ${DB_SERVER}]) - - -dnl----------------------------------------------------------------------------- -dnl get the name of the Campcaster database -dnl----------------------------------------------------------------------------- -AC_SUBST(DATABASE) - -AC_ARG_WITH([database], - AC_HELP_STRING([--with-database], - [the name of the postgresql database to use (Campcaster)]), - [DATABASE=${withval}], [DATABASE=Campcaster]) - -AC_MSG_RESULT([using database: ${DATABASE}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the database server user -dnl----------------------------------------------------------------------------- -AC_SUBST(DB_USER) - -AC_ARG_WITH([database-user], - AC_HELP_STRING([--with-database-user], - [use the specified database server user (campcaster)]), - [DB_USER=${withval}], [DB_USER=campcaster]) - -AC_MSG_RESULT([using database server user: ${DB_USER}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the database server user password -dnl----------------------------------------------------------------------------- -AC_SUBST(DB_PASSWORD) - -AC_ARG_WITH([database-password], - AC_HELP_STRING([--with-database-password], - [use the specified database server user password (campcaster)]), - [DB_PASSWORD=${withval}], [DB_PASSWORD=campcaster]) - -AC_MSG_RESULT([using database server user password: ${DB_PASSWORD}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the audio output device -dnl----------------------------------------------------------------------------- -AC_SUBST(AUDIO_OUT) - -AC_ARG_WITH([audio-out], - AC_HELP_STRING([--with-audio-out], - [use the specified audio output device, either ALSA or OSS - (default)]), - [AUDIO_OUT=${withval}], [AUDIO_OUT=default]) - -AC_MSG_RESULT([using audio output device: ${AUDIO_OUT}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the audio cue device -dnl----------------------------------------------------------------------------- -AC_SUBST(AUDIO_CUE) - -AC_ARG_WITH([audio-cue], - AC_HELP_STRING([--with-audio-cue], - [use the specified audio cue device, either ALSA or OSS - (default)]), - [AUDIO_CUE=${withval}], [AUDIO_CUE=default]) - -AC_MSG_RESULT([using audio cue device: ${AUDIO_CUE}]) - - -dnl display status info on what libraries will get compiled - -AC_MSG_NOTICE( -[using the following configuration settings: - - hostname: ${HOSTNAME} - www port: ${WWW_PORT} - scheduler port: ${SCHEDULER_PORT} - database server: ${DB_SERVER} - database name: ${DATABASE} - database user: ${DB_USER} - database user password: ${DB_PASSWORD} - audio output device: ${AUDIO_OUT} - audio cue device: ${AUDIO_CUE} - -]) - - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() diff --git a/src/products/gLiveSupport/etc/doxygen.config b/src/products/gLiveSupport/etc/doxygen.config deleted file mode 100644 index 9c076c81e..000000000 --- a/src/products/gLiveSupport/etc/doxygen.config +++ /dev/null @@ -1,1140 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -# Doxyfile 1.3.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Campcaster - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/doxygen - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is used -# as the annotated text. Otherwise, the brief description is used as-is. If left -# blank, the following values are used ("$name" is automatically replaced with the -# name of the entity): "The $name class" "The $name widget" "The $name file" -# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = YES - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = src - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - -INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = \ -../../doc/doxygen/xmlrpc++.tag=../../../../../usr/share/doc/xmlrpc++ - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = YES - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superseded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/src/products/gLiveSupport/etc/keyboardShortcut.xml b/src/products/gLiveSupport/etc/keyboardShortcut.xml deleted file mode 100644 index c00d346ee..000000000 --- a/src/products/gLiveSupport/etc/keyboardShortcut.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - -]> - - - - - - diff --git a/src/products/gLiveSupport/etc/storageClient.xml b/src/products/gLiveSupport/etc/storageClient.xml deleted file mode 100644 index 46534a9e4..000000000 --- a/src/products/gLiveSupport/etc/storageClient.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - -]> - - - - - diff --git a/src/products/gLiveSupport/etc/storageClient.xml.user-template b/src/products/gLiveSupport/etc/storageClient.xml.user-template deleted file mode 100644 index aeef10013..000000000 --- a/src/products/gLiveSupport/etc/storageClient.xml.user-template +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - -]> - - - - - diff --git a/src/products/gLiveSupport/etc/testResultToHtml.xsl b/src/products/gLiveSupport/etc/testResultToHtml.xsl deleted file mode 100644 index f9e893521..000000000 --- a/src/products/gLiveSupport/etc/testResultToHtml.xsl +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - Campcaster unit test results - - -

Preface

-This document is part of the -Campcaster -project, Copyright © 2004 Media -Development Loan Fund, under the GNU -GPL. -
-This is an automatically generated document. -

Scope

-This document contains the generated unit test results for the -Campcaster project. -

Summary

- - - - - - - - - - - - - - - - - - -
Total number of tests:
Tests passed:
Tests failed:
Test errors:
-
-

Tests

- - - - - - - - - - - - - -
test nametest status
failedpassed
- - -
- -
- diff --git a/src/products/gLiveSupport/lib/.keepme b/src/products/gLiveSupport/lib/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/products/gLiveSupport/lib/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/products/gLiveSupport/src/AdvancedSearchEntry.cxx b/src/products/gLiveSupport/src/AdvancedSearchEntry.cxx deleted file mode 100644 index 7b3e91b8a..000000000 --- a/src/products/gLiveSupport/src/AdvancedSearchEntry.cxx +++ /dev/null @@ -1,162 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "AdvancedSearchEntry.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "advancedSearchEntry"; - -/*------------------------------------------------------------------------------ - * The maximum number of AdvancedSearchItem children. - *----------------------------------------------------------------------------*/ -const int maxChildren = 5; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -AdvancedSearchEntry :: AdvancedSearchEntry(GuiObject * parent) - throw () - : GuiComponent(parent, - bundleName) -{ - metadataTypes = gLiveSupport->getMetadataTypeContainer(); - - Gtk::Label * fileTypeLabel; - glade->get_widget("advancedFileTypeLabel1", fileTypeLabel); - fileTypeLabel->set_label(*getResourceUstring("fileTypeTextLabel")); - - glade->get_widget_derived("advancedFileTypeEntry1", fileTypeEntry); - fileTypeEntry->append_text(*getResourceUstring("allFileType")); - fileTypeEntry->append_text(*getResourceUstring("audioClipFileType")); - fileTypeEntry->append_text(*getResourceUstring("playlistFileType")); - fileTypeEntry->set_active(0); - - for (int i = 0; i < maxChildren; ++i) { - Ptr::Ref searchItem(new AdvancedSearchItem( - this, - i, - metadataTypes)); - children.push_back(searchItem); - } - - children.at(0)->signalAddNew().connect(sigc::mem_fun(*this, - &AdvancedSearchEntry::onAddNewCondition )); -} - - -/*------------------------------------------------------------------------------ - * Add a new search condition entrys item. - *----------------------------------------------------------------------------*/ -void -AdvancedSearchEntry :: onAddNewCondition(void) throw () -{ - bool foundAvailableChild = false; - Ptr::Ref child; - - for (int i = 1; i < maxChildren; ++i) { - child = children.at(i); - if (!child->is_visible()) { - foundAvailableChild = true; - break; - } - } - - if (foundAvailableChild) { - child->show(); - } -} - - -/*------------------------------------------------------------------------------ - * Return the current state of the search fields. - *----------------------------------------------------------------------------*/ -Ptr::Ref -AdvancedSearchEntry :: getSearchCriteria(void) throw () -{ - Glib::ustring fileType; - switch (fileTypeEntry->get_active_row_number()) { - case 0: fileType = "all"; - break; - case 1: fileType = "audioClip"; - break; - case 2: fileType = "playlist"; - break; - default: std::cerr << "impossible value in AdvancedSearchEntry::" - << "getSearchCriteria()" << std::endl; - break; - } - - Ptr::Ref criteria(new SearchCriteria(fileType)); - - for (int i = 0; i < maxChildren; ++i) { - Ptr::Ref child = children.at(i); - if (child->is_visible()) { - criteria->addCondition(child->getSearchCondition()); - } - } - - return criteria; -} - - -/*------------------------------------------------------------------------------ - * Connect a callback to the "enter key pressed" event. - *----------------------------------------------------------------------------*/ -void -AdvancedSearchEntry :: connectCallback(const sigc::slot & callback) - throw () -{ - for (int i = 0; i < maxChildren; ++i) { - Ptr::Ref child = children.at(i); - child->signal_activate().connect(callback); - } -} - diff --git a/src/products/gLiveSupport/src/AdvancedSearchEntry.h b/src/products/gLiveSupport/src/AdvancedSearchEntry.h deleted file mode 100644 index 5b77d5621..000000000 --- a/src/products/gLiveSupport/src/AdvancedSearchEntry.h +++ /dev/null @@ -1,139 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef AdvancedSearchEntry_h -#define AdvancedSearchEntry_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/MetadataTypeContainer.h" -#include "LiveSupport/Core/SearchCriteria.h" -#include "LiveSupport/Widgets/ComboBoxText.h" -#include "AdvancedSearchItem.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A sub-window with one or more search input fields in it. - */ -class AdvancedSearchEntry : public GuiComponent -{ - private: - - /** - * A container holding all known metadata types. - */ - Ptr::Ref metadataTypes; - - /** - * The combo box for selecting the file types to search for. - */ - ComboBoxText * fileTypeEntry; - - /** - * The AdvancedSearchItem children of the widget. - */ - std::vector::Ref> children; - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - */ - AdvancedSearchEntry(GuiObject * parent) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~AdvancedSearchEntry(void) throw () - { - } - - /** - * Add a new search condition entry item. - */ - void - onAddNewCondition(void) throw (); - - /** - * Return the current state of the search fields. - * - * @return a new LiveSupport::StorageClient::SearchCriteria instance, - * which contains the data entered by the user - */ - Ptr::Ref - getSearchCriteria(void) throw (); - - /** - * Connect a callback to the "enter key pressed" event. - * - * @param callback the function to execute when enter is pressed. - */ - void - connectCallback(const sigc::slot & callback) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // AdvancedSearchEntry_h - diff --git a/src/products/gLiveSupport/src/AdvancedSearchItem.cxx b/src/products/gLiveSupport/src/AdvancedSearchItem.cxx deleted file mode 100644 index c4f59e8fa..000000000 --- a/src/products/gLiveSupport/src/AdvancedSearchItem.cxx +++ /dev/null @@ -1,106 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "AdvancedSearchItem.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -AdvancedSearchItem :: AdvancedSearchItem( - GuiObject * parent, - int index, - Ptr::Ref metadataTypes) - throw () - : GuiComponent(parent) -{ - glade->get_widget(addIndex("advancedSearchItem", index), enclosingBox); - - Gtk::Label * searchByLabel; - glade->get_widget(addIndex("advancedSearchByLabel", index), searchByLabel); - searchByLabel->set_label(*getResourceUstring("searchByTextLabel")); - - glade->get_widget_derived(addIndex("advancedMetadataEntry", index), - metadataEntry); - metadataEntry->setContents(metadataTypes); - - glade->get_widget_derived(addIndex("advancedOperatorEntry", index), - operatorEntry); - operatorEntry->setContents(getBundle()); - - glade->get_widget(addIndex("advancedValueEntry", index), valueEntry); - - if (index == 0) { - glade->get_widget(addIndex("advancedPlusMinusButton", index), - plusButton); - plusButton->signal_clicked().connect(sigc::mem_fun(*this, - &AdvancedSearchItem::onPlusButtonClicked)); - } else { - glade->get_widget(addIndex("advancedPlusMinusButton", index), - closeButton); - closeButton->signal_clicked().connect(sigc::mem_fun(*this, - &AdvancedSearchItem::onCloseButtonClicked)); - } -} - - -/*------------------------------------------------------------------------------ - * Return the current state of the search fields. - *----------------------------------------------------------------------------*/ -Ptr::Ref -AdvancedSearchItem :: getSearchCondition(void) throw () -{ - Ptr::Ref metadataKey = metadataEntry->getActiveKey(); - Ptr::Ref operatorKey = operatorEntry->getActiveKey(); - std::string value = valueEntry->get_text(); - - Ptr::Ref - condition(new SearchCriteria::SearchConditionType(*metadataKey, - *operatorKey, - value)); - - return condition; -} - diff --git a/src/products/gLiveSupport/src/AdvancedSearchItem.h b/src/products/gLiveSupport/src/AdvancedSearchItem.h deleted file mode 100644 index d0a74bc10..000000000 --- a/src/products/gLiveSupport/src/AdvancedSearchItem.h +++ /dev/null @@ -1,225 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef AdvancedSearchItem_h -#define AdvancedSearchItem_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/NumericTools.h" -#include "LiveSupport/Core/MetadataTypeContainer.h" -#include "LiveSupport/Core/SearchCriteria.h" -#include "LiveSupport/Widgets/MetadataComboBoxText.h" -#include "LiveSupport/Widgets/OperatorComboBoxText.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A single search input field. - */ -class AdvancedSearchItem : public GuiComponent, - private NumericTools -{ - private: - - /** - * The enclosing box. - */ - Gtk::Box * enclosingBox; - - /** - * The metadata field. - */ - MetadataComboBoxText * metadataEntry; - - /** - * The operator field. - */ - OperatorComboBoxText * operatorEntry; - - /** - * The "search for this value" field. - */ - Gtk::Entry * valueEntry; - - /** - * The "add new search item" button. - */ - Gtk::Button * plusButton; - - /** - * The "remove this item" button. - */ - Gtk::Button * closeButton; - - /** - * A signal object emitted when the plus button is pressed. - */ - sigc::signal signalAddNewObject; - - /** - * Event handler for the Plus button getting clicked. - */ - void - onPlusButtonClicked() throw () - { - signalAddNew().emit(); - } - - /** - * Event handler for the Close button getting clicked. - */ - void - onCloseButtonClicked() throw () - { - hide(); - } - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - * @param index the position of this item in the list of - * advanced search items. - * @param metadataTypes container holding all known metadata types - */ - AdvancedSearchItem(GuiObject * parent, - int index, - Ptr::Ref metadataTypes) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~AdvancedSearchItem(void) throw () - { - } - - /** - * Return the current state of the search fields. - * - * @return a new LiveSupport::StorageClient::SearchCriteria instance, - * which contains the data entered by the user - */ - Ptr::Ref - getSearchCondition(void) throw (); - - /** - * The signal proxy for pressing enter in the entry field. - * - * @return the signal_activate() proxy of the EntryBin. - */ - Glib::SignalProxy0 - signal_activate(void) throw () - { - return valueEntry->signal_activate(); - } - - /** - * The signal proxy for pressing the add new condition button. - * - * @return a signal emitted when the Plus button is clicked. - */ - sigc::signal - signalAddNew(void) throw () - { - return signalAddNewObject; - } - - /** - * Is the widget visible? - * - * return true if visible, false if not. - */ - bool - is_visible(void) throw () - { - return enclosingBox->is_visible(); - } - - /** - * Show the widget. - */ - void - show(void) throw () - { - if (!enclosingBox->is_visible()) { - enclosingBox->show(); - } - } - - /** - * Hide the widget. - */ - void - hide(void) throw () - { - if (enclosingBox->is_visible()) { - enclosingBox->hide(); - } - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // AdvancedSearchItem_h - diff --git a/src/products/gLiveSupport/src/AudioPlayerTest.cxx b/src/products/gLiveSupport/src/AudioPlayerTest.cxx deleted file mode 100644 index a4434bc1f..000000000 --- a/src/products/gLiveSupport/src/AudioPlayerTest.cxx +++ /dev/null @@ -1,300 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/Core/AudioClip.h" -#include "LiveSupport/Core/Playlist.h" - -#include "AudioPlayerTest.h" - - -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::gLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(AudioPlayerTest); - -namespace { - -/** - * The name of the configuration file for the audio player. - */ -const std::string audioPlayerConfigFileName - = "etc/audioPlayer.xml"; - -/** - * The name of the configuration file for the local storage. - */ -const std::string storageClientConfigFileName - = "storageClient.xml"; - -/** - * The name of the configuration file for the authentication client. - */ -const std::string authenticationClientConfigFileName - = "authenticationClient.xml"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -AudioPlayerTest :: setUp(void) throw () -{ - try { - Ptr::Ref parser( - new xmlpp::DomParser(audioPlayerConfigFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - - Ptr::Ref audioPlayerFactory; - - audioPlayerFactory = AudioPlayerFactory::getInstance(); - audioPlayerFactory->configure(*root); - - // initialize the audio player configured by the factory - Ptr::Ref audioPlayer; - audioPlayer = audioPlayerFactory->getAudioPlayer(); - audioPlayer->initialize(); - - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in audio player configuration file: " - << e.what() << std::endl; - } catch (xmlpp::exception &e) { - std::cerr << "syntax error in audio player configuration file: " - << e.what() << std::endl; - } - - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - storageClientConfigFileName); - const xmlpp::Element * root = document->get_root_node(); - - Ptr::Ref storageClientFactory; - - storageClientFactory = StorageClientFactory::getInstance(); - storageClientFactory->configure(*root); - - // initialize the storage client configured by the factory - Ptr::Ref storage; - storage = storageClientFactory->getStorageClient(); - storage->reset(); - - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in storage client configuration file: " - << e.what() << std::endl; - } catch (xmlpp::exception &e) { - std::cerr << "syntax error in storage client configuration file: " - << e.what() << std::endl; - } - - try { - xmlpp::DomParser parser; - const xmlpp::Document * document = getConfigDocument(parser, - authenticationClientConfigFileName); - const xmlpp::Element * root = document->get_root_node(); - - Ptr::Ref authentClientFactory; - - authentClientFactory = AuthenticationClientFactory::getInstance(); - authentClientFactory->configure(*root); - - // log in using the authentication client - Ptr::Ref authent; - authent = authentClientFactory->getAuthenticationClient(); - sessionId = authent->login("root", "q"); - - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in authentication client " - "configuration file: " - << e.what() << std::endl; - } catch (xmlpp::exception &e) { - std::cerr << "syntax error in authentication client " - "configuration file: " - << e.what() << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -AudioPlayerTest :: tearDown(void) throw () -{ - // de-initialize the audio player configured by the factory - Ptr::Ref audioPlayerFactory; - audioPlayerFactory = AudioPlayerFactory::getInstance(); - Ptr::Ref audioPlayer; - audioPlayer = audioPlayerFactory->getAudioPlayer(); - audioPlayer->deInitialize(); - - // log out using the authentication client - Ptr::Ref authentClientFactory; - authentClientFactory = AuthenticationClientFactory::getInstance(); - Ptr::Ref authent; - authent = authentClientFactory->getAuthenticationClient(); - CPPUNIT_ASSERT_NO_THROW(authent->logout(sessionId)); -} - - -/*------------------------------------------------------------------------------ - * Test to see if the audio player engine can be started and stopped - *----------------------------------------------------------------------------*/ -void -AudioPlayerTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref audioPlayerFactory; - - audioPlayerFactory = AudioPlayerFactory::getInstance(); - CPPUNIT_ASSERT(audioPlayerFactory.get()); - - Ptr::Ref audioPlayer; - - audioPlayer = audioPlayerFactory->getAudioPlayer(); - CPPUNIT_ASSERT(audioPlayer.get()); - CPPUNIT_ASSERT(!audioPlayer->isPlaying()); -} - - -/*------------------------------------------------------------------------------ - * Play an audio clip from storage. - *----------------------------------------------------------------------------*/ -void -AudioPlayerTest :: playAudioClipTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref - audioPlayerFactory = AudioPlayerFactory::getInstance(); - Ptr::Ref - audioPlayer = audioPlayerFactory->getAudioPlayer(); - - Ptr::Ref - storageClientFactory = StorageClientFactory::getInstance(); - Ptr::Ref - storage = storageClientFactory->getStorageClient(); - - Ptr::Ref audioClipId(new UniqueId(0x10001)); - Ptr::Ref audioClip; - CPPUNIT_ASSERT_NO_THROW( - audioClip = storage->acquireAudioClip(sessionId, audioClipId) - ); - - CPPUNIT_ASSERT_NO_THROW( - audioPlayer->open(*audioClip->getUri()) - ); - - CPPUNIT_ASSERT(!audioPlayer->isPlaying()); - CPPUNIT_ASSERT_NO_THROW(audioPlayer->start()); - CPPUNIT_ASSERT(audioPlayer->isPlaying()); - - Ptr::Ref sleepT(new time_duration(microseconds(10))); - while (audioPlayer->isPlaying()) { - TimeConversion::sleep(sleepT); - } - CPPUNIT_ASSERT(!audioPlayer->isPlaying()); - - CPPUNIT_ASSERT_NO_THROW( - storage->releaseAudioClip(audioClip) - ); - audioPlayer->close(); -} - - -/*------------------------------------------------------------------------------ - * Play a playlist from storage. - *----------------------------------------------------------------------------*/ -void -AudioPlayerTest :: playPlaylistTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref - audioPlayerFactory = AudioPlayerFactory::getInstance(); - Ptr::Ref - audioPlayer = audioPlayerFactory->getAudioPlayer(); - - Ptr::Ref - storageClientFactory = StorageClientFactory::getInstance(); - Ptr::Ref - storage = storageClientFactory->getStorageClient(); - - Ptr::Ref audioClipId(new UniqueId(2)); - Ptr::Ref playlist; - CPPUNIT_ASSERT_NO_THROW( - playlist = storage->acquirePlaylist(sessionId, audioClipId) - ); - - CPPUNIT_ASSERT_NO_THROW( - audioPlayer->open(*playlist->getUri()) - ); - - CPPUNIT_ASSERT(!audioPlayer->isPlaying()); - CPPUNIT_ASSERT_NO_THROW(audioPlayer->start()); - CPPUNIT_ASSERT(audioPlayer->isPlaying()); - - Ptr::Ref sleepT(new time_duration(microseconds(10))); - while (audioPlayer->isPlaying()) { - TimeConversion::sleep(sleepT); - } - CPPUNIT_ASSERT(!audioPlayer->isPlaying()); - - CPPUNIT_ASSERT_NO_THROW( - storage->releasePlaylist(playlist) - ); - audioPlayer->close(); -} - diff --git a/src/products/gLiveSupport/src/AudioPlayerTest.h b/src/products/gLiveSupport/src/AudioPlayerTest.h deleted file mode 100644 index 9c35599a9..000000000 --- a/src/products/gLiveSupport/src/AudioPlayerTest.h +++ /dev/null @@ -1,129 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef AudioPlayerTest_h -#define AudioPlayerTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Core/BaseTestMethod.h" - - -namespace LiveSupport { -namespace gLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Testing audio playback from the storage. - * - * @see AudioPlayerFactory - */ -class AudioPlayerTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(AudioPlayerTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(playAudioClipTest); - CPPUNIT_TEST(playPlaylistTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The session ID returned by the authentication client login. - */ - Ptr::Ref sessionId; - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Play an audio clip from storage. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - playAudioClipTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Play a playlist from storage. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - playPlaylistTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace gLiveSupport -} // namespace LiveSupport - -#endif // AudioPlayerTest_h - diff --git a/src/products/gLiveSupport/src/BackupList.cxx b/src/products/gLiveSupport/src/BackupList.cxx deleted file mode 100644 index 01e636139..000000000 --- a/src/products/gLiveSupport/src/BackupList.cxx +++ /dev/null @@ -1,392 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/TimeConversion.h" -#include "BackupList.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The localization key for the 'working' status. - *----------------------------------------------------------------------------*/ -const Glib::ustring workingStatusKey = "workingStatus"; - -/*------------------------------------------------------------------------------ - * The localization key for the 'success' status. - *----------------------------------------------------------------------------*/ -const Glib::ustring successStatusKey = "successStatus"; - -/*------------------------------------------------------------------------------ - * The localization key for the 'fault' status. - *----------------------------------------------------------------------------*/ -const Glib::ustring faultStatusKey = "faultStatus"; - -/*------------------------------------------------------------------------------ - * The name of the user preference for storing the list of backups - *----------------------------------------------------------------------------*/ -const Glib::ustring userPreferencesKeyName = "activeBackups"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -BackupList :: BackupList (GuiObject * parent) - throw () - : GuiComponent(parent) -{ - // create the tree view - treeModel = Gtk::ListStore::create(modelColumns); - glade->get_widget_derived("backupListTreeView1", treeView); - treeView->set_model(treeModel); - treeView->connectModelSignals(treeModel); - - // Add the TreeView's view columns: - treeView->appendColumn(*getResourceUstring("titleColumnLabel"), - modelColumns.titleColumn, 300); - treeView->appendColumn(*getResourceUstring("dateColumnLabel"), - modelColumns.dateColumn, 180); - treeView->appendColumn(*getResourceUstring("statusColumnLabel"), - modelColumns.statusDisplayColumn, 50); - - userPreferencesKey.reset(new const Glib::ustring(userPreferencesKeyName)); -} - - -/*------------------------------------------------------------------------------ - * Add a new item to the list. - *----------------------------------------------------------------------------*/ -void -BackupList :: add(Ptr::Ref title, - Ptr::Ref criteria) - throw (XmlRpcException) -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr::Ref token = storage->createBackupOpen(sessionId, - criteria); - - Gtk::TreeRow row = *treeModel->append(); - row[modelColumns.titleColumn] = *title; - row[modelColumns.dateColumn] = *TimeConversion::nowString(); - row[modelColumns.statusColumn] = workingStatusKey; - row[modelColumns.statusDisplayColumn] - = *getResourceUstring(workingStatusKey); - row[modelColumns.tokenColumn] = *token; -} - - -/*------------------------------------------------------------------------------ - * Add an item with an already existing token to the list. - *----------------------------------------------------------------------------*/ -void -BackupList :: add(const Glib::ustring & title, - const Glib::ustring & date, - const Glib::ustring & token) - throw (XmlRpcException) -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr::Ref url; - Ptr::Ref path; - Ptr::Ref errorMessage; - - AsyncState status = storage->createBackupCheck(token, - url, - path, - errorMessage); - - Gtk::TreeRow row = *treeModel->append(); - row[modelColumns.titleColumn] = title; - row[modelColumns.dateColumn] = date; - row[modelColumns.tokenColumn] = token; - setStatus(row, status, url, errorMessage); -} - - -/*------------------------------------------------------------------------------ - * Remove the currently selected item from the list. - *----------------------------------------------------------------------------*/ -void -BackupList :: removeSelected(void) throw (XmlRpcException) -{ - Glib::RefPtr selection = treeView->get_selection(); - Gtk::TreeIter iter = selection->get_selected(); - if (!iter) { - return; - } - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - storage->createBackupClose(iter->get_value(modelColumns.tokenColumn)); - - treeModel->erase(iter); -} - - -/*------------------------------------------------------------------------------ - * Get the title of the currently selected item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -BackupList :: getSelectedTitle(void) throw () -{ - Ptr::Ref title; - - Glib::RefPtr selection = treeView->get_selection(); - Gtk::TreeIter iter = selection->get_selected(); - if (iter) { - Gtk::TreeRow row = *iter; - title.reset(new Glib::ustring(row[modelColumns.titleColumn])); - } - - return title; -} - - -/*------------------------------------------------------------------------------ - * Get the URL of the currently selected item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -BackupList :: getSelectedUrl(void) throw (XmlRpcException) -{ - Ptr::Ref url; - - Glib::RefPtr selection = treeView->get_selection(); - Gtk::TreeIter iter = selection->get_selected(); - if (!iter) { - return url; - } - - if (iter->get_value(modelColumns.statusColumn) == workingStatusKey) { - update(iter); - } - - if (iter->get_value(modelColumns.statusColumn) == successStatusKey) { - url.reset(new Glib::ustring(iter->get_value(modelColumns.urlColumn))); - } - - return url; -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending backup. - *----------------------------------------------------------------------------*/ -bool -BackupList :: updateSelected(void) throw (XmlRpcException) -{ - Glib::RefPtr selection = treeView->get_selection(); - Gtk::TreeIter iter = selection->get_selected(); - if (!iter) { - return false; - } else { - return update(iter); - } -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending backup. - *----------------------------------------------------------------------------*/ -bool -BackupList :: update(void) throw (XmlRpcException) -{ - bool didSomething = false; - - for (Gtk::TreeIter it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - didSomething |= update(it); - } - - return didSomething; -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending backup. - *----------------------------------------------------------------------------*/ -bool -BackupList :: updateSilently(void) throw () -{ - bool didSomething = false; - - for (Gtk::TreeIter it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - try { - didSomething |= update(it); - } catch (XmlRpcException &e) { - } - } - - return didSomething; -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending backup. - *----------------------------------------------------------------------------*/ -bool -BackupList :: update(Gtk::TreeIter iter) throw (XmlRpcException) -{ - if (iter->get_value(modelColumns.statusColumn) != workingStatusKey) { - return false; - } - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - - Ptr::Ref url; - Ptr::Ref path; - Ptr::Ref errorMessage; - - AsyncState status = storage->createBackupCheck( - iter->get_value(modelColumns.tokenColumn), - url, - path, - errorMessage); - - return setStatus(iter, status, url, errorMessage); -} - - -/*------------------------------------------------------------------------------ - * Set the status of the row pointed to by an iterator. - *----------------------------------------------------------------------------*/ -bool -BackupList :: setStatus(Gtk::TreeIter iter, - AsyncState status, - Ptr::Ref url, - Ptr::Ref errorMessage) - throw () -{ - if (status == AsyncState::pendingState) { - return false; - - } else if (status == AsyncState::finishedState) { - iter->set_value(modelColumns.statusColumn, - successStatusKey); - iter->set_value(modelColumns.statusDisplayColumn, - *getResourceUstring(successStatusKey)); - iter->set_value(modelColumns.urlColumn, - *url); - return true; - - } else if (status == AsyncState::failedState) { - iter->set_value(modelColumns.statusColumn, - faultStatusKey); - iter->set_value(modelColumns.statusDisplayColumn, - *formatMessage(faultStatusKey, *errorMessage)); - return false; - - } else { - std::cerr << "Impossible status: '" << status - << "' in BackupList::setStatus()." << std::endl; - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Return the contents of the backup list. - *----------------------------------------------------------------------------*/ -Ptr::Ref -BackupList :: getContents(void) throw () -{ - std::ostringstream contentsStream; - Gtk::TreeModel::const_iterator it; - - for (it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - Gtk::TreeRow row = *it; - contentsStream << row[modelColumns.titleColumn] << '\n'; - contentsStream << row[modelColumns.dateColumn] << '\n'; - contentsStream << row[modelColumns.tokenColumn] << '\n'; - } - - Ptr::Ref contents(new Glib::ustring( - contentsStream.str() )); - return contents; -} - - -/*------------------------------------------------------------------------------ - * Restore the contents of the backup list. - *----------------------------------------------------------------------------*/ -void -BackupList :: setContents(Ptr::Ref contents) - throw () -{ - std::istringstream contentsStream(contents->raw()); - - treeModel->clear(); - while (!contentsStream.eof()) { - std::string title; - std::string date; - std::string token; - - std::getline(contentsStream, title); - if (contentsStream.fail()) { - break; - } - std::getline(contentsStream, date); - if (contentsStream.fail()) { - break; - } - std::getline(contentsStream, token); - if (contentsStream.fail()) { - break; - } - - try { - add(title, date, token); - - } catch (XmlRpcException &e) { - } - } -} - diff --git a/src/products/gLiveSupport/src/BackupList.h b/src/products/gLiveSupport/src/BackupList.h deleted file mode 100644 index cf4f44f64..000000000 --- a/src/products/gLiveSupport/src/BackupList.h +++ /dev/null @@ -1,348 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BackupList_h -#define BackupList_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The list of pending backups. - * - * This is a Gtk::VBox containing a TreeView with the following columns: - *
    - *
  • shown: - *
      - *
    • backup title
    • - *
    • backup date
    • - *
    • backup status (localized; contains the fault string, if any)
    • - *
  • - *
  • hidden: - *
      - *
    • token
    • - *
    • backup status (not localized: "working" / "success" / "fault")
    • - *
    • URL (if the status is "success")
    • - *
  • - *
- * - * The BackupList is contained in the BackupView. - * - */ -class BackupList : public GuiComponent, - public ContentsStorable -{ - private: - - /** - * The user preferences key. - */ - Ptr::Ref userPreferencesKey; - - /** - * Set the status of the row pointed to by an iterator. - * - * @param iter points to the row we want to set the status of. - * @param status the new status ("working", "success" or "fault"). - * @param url must be non-0 if the status is "success". - * @param errorMessage must be non-0 if the status is "fault". - * @return true if the status is "success", false otherwise. - */ - bool - setStatus(Gtk::TreeIter iter, - AsyncState status, - Ptr::Ref url, - Ptr::Ref errorMessage) - throw (); - - /** - * Add an item with an already existing token to the list. - * - * @param title the title of the backup. - * @param date the date of the backup. - * @param token the token for this backup. - * @exception XmlRpcException thrown by the storage client. - */ - void - add(const Glib::ustring & title, - const Glib::ustring & date, - const Glib::ustring & token) - throw (XmlRpcException); - - /** - * Query the storage server about the status of the given row. - * If its status is 'working', call createBackupCheck - * on it, and change its displayed status, if needed. - * - * @param iter points to the row to be updated. - * @return true if createBackupCheck was called, and it returned - * 'success'; false in all other cases. - * @exception XmlRpcException thrown by the storage client. - */ - bool - update(Gtk::TreeIter iter) throw (XmlRpcException); - - - protected: - - /** - * The columns model needed by ZebraTreeView. - * - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - /** - * The column for the title of the backup. - */ - Gtk::TreeModelColumn titleColumn; - - /** - * The column for the date of the backup. - */ - Gtk::TreeModelColumn dateColumn; - - /** - * The column for the status of the backup (not localized). - */ - Gtk::TreeModelColumn statusColumn; - - /** - * The column for the status of the backup (localized). - */ - Gtk::TreeModelColumn statusDisplayColumn; - - /** - * The column for the token corresponding to the backup. - */ - Gtk::TreeModelColumn tokenColumn; - - /** - * The column for the URL of the backup. - */ - Gtk::TreeModelColumn urlColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(titleColumn); - add(dateColumn); - add(statusColumn); - add(statusDisplayColumn); - add(tokenColumn); - add(urlColumn); - } - }; - - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * The tree model, as a GTK reference. - */ - Glib::RefPtr treeModel; - - /** - * The tree view. - */ - ZebraTreeView * treeView; - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - */ - BackupList(GuiObject * parent) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~BackupList(void) throw () - { - } - - /** - * Add a new item to the list. - * - * @param title the title of the backup. - * @param criteria the search criteria for the backup. - * @exception XmlRpcException thrown by the storage client. - */ - void - add(Ptr::Ref title, - Ptr::Ref criteria) - throw (XmlRpcException); - - /** - * Remove the currently selected item from the list. - * The createBackupClose storage function is called on the backup task, - * and it is removed from the tree model. - * - * @exception XmlRpcException thrown by the storage client. - */ - void - removeSelected(void) throw (XmlRpcException); - - /** - * Get the title of the currently selected item. - * If no item is selected, then a 0 pointer is returned. - */ - Ptr::Ref - getSelectedTitle(void) throw (); - - /** - * Get the URL of the currently selected item. - * If the status of the item is 'working', then an update() is - * done first. - * If no item is selected, or the URL for the backup is not available - * yet, then a 0 pointer is returned. - * - * @exception XmlRpcException can be thrown by update(). - */ - Ptr::Ref - getSelectedUrl(void) throw (XmlRpcException); - - /** - * Query the storage server about the status of the selected row. - * If its status is 'working', call createBackupCheck - * on it, and change its displayed status, if needed. - * - * @return true if createBackupCheck was called, and it returned - * 'success'; false in all other cases. - * @exception XmlRpcException thrown by the storage client. - */ - bool - updateSelected(void) throw (XmlRpcException); - - /** - * Query the storage server about the status of the pending backup. - * If there is a backup with status 'working', call createBackupCheck - * on it, and change its displayed status, if needed. - * - * @return true if createBackupCheck was called, and it returned - * 'success'; false in all other cases. - * @exception XmlRpcException thrown by the storage client. - */ - bool - update(void) throw (XmlRpcException); - - /** - * Query the storage server about the status of the pending backup. - * If there is a backup with status 'working', call createBackupCheck - * on it, and change its displayed status, if needed. - * This is the same as update(), except it does not throw any - * exceptions (just ignores them). - * - * @return true if createBackupCheck was called, and it returned - * 'success'; false in all other cases. - */ - bool - updateSilently(void) throw (); - - /** - * Return the contents of the backup list. - * The format is a space-separated list of backup titles, dates - * and tokens. E.g.: "title1 date1 token1 title2 date2 token2". - * - * @return the contents of the backup list as a string. - */ - Ptr::Ref - getContents(void) throw (); - - /** - * Restore the contents of the backup list. - * The current contents are discarded, and replaced with the items - * listed in the 'contents' parameter. - * The format is a space-separated list of backup titles, dates - * and tokens. E.g.: "title1 date1 token1 title2 date2 token2". - * - * @param contents the new contents of the backup list as a string. - */ - void - setContents(Ptr::Ref contents) throw (); - - /** - * Return the user preferences key. - * The contents of the window will be stored in the user preferences - * under this key. - * - * @return the user preference key. - */ - Ptr::Ref - getUserPreferencesKey(void) throw () - { - return userPreferencesKey; - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // BackupList_h - diff --git a/src/products/gLiveSupport/src/BackupView.cxx b/src/products/gLiveSupport/src/BackupView.cxx deleted file mode 100644 index 36aaeafcf..000000000 --- a/src/products/gLiveSupport/src/BackupView.cxx +++ /dev/null @@ -1,291 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_PWD_H -#include -#else -#error need pwd.h -#endif - -#include "LiveSupport/Core/FileTools.h" - -#include "BackupView.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; -using namespace boost::posix_time; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "backupView"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -BackupView :: BackupView (GuiObject * parent) - throw () - : GuiComponent(parent, - bundleName) -{ - Gtk::Label * backupTitleLabel; - Gtk::Label * mtimeLabel; - Gtk::Button * chooseTimeButton; - Gtk::Button * resetTimeButton; - glade->get_widget("backupTitleLabel1", backupTitleLabel); - glade->get_widget("backupMtimeLabel1", mtimeLabel); - glade->get_widget("backupMtimeChooseButton1", chooseTimeButton); - glade->get_widget("backupMtimeResetButton1", resetTimeButton); - backupTitleLabel->set_label(*getResourceUstring("backupTitleLabel")); - mtimeLabel->set_label(*getResourceUstring("mtimeTextLabel")); - chooseTimeButton->set_label(*getResourceUstring("chooseTimeButtonLabel")); - resetTimeButton->set_label(*getResourceUstring("resetTimeButtonLabel")); - - chooseTimeButton->signal_clicked().connect(sigc::mem_fun(*this, - &BackupView::onChooseTimeButtonClicked)); - resetTimeButton->signal_clicked().connect(sigc::mem_fun(*this, - &BackupView::onResetTimeButtonClicked)); - - glade->get_widget("backupTitleEntry1", backupTitleEntry); - glade->get_widget("backupMtimeEntry1", mtimeEntry); - - writeMtimeEntry(); - - constructCriteriaView(); - constructBackupListView(); - - dateTimeChooserWindow.reset(new DateTimeChooserWindow()); -} - - -/*------------------------------------------------------------------------------ - * Construct the box for entering the backup criteria. - *----------------------------------------------------------------------------*/ -void -BackupView :: constructCriteriaView(void) throw () -{ - criteriaEntry.reset(new AdvancedSearchEntry(this)); - criteriaEntry->connectCallback(sigc::mem_fun(*this, - &BackupView::onCreateBackup)); - - Gtk::Button * backupButton; - glade->get_widget("backupButton1", backupButton); - backupButton->set_label(*getResourceUstring("backupButtonLabel")); - backupButton->signal_clicked().connect(sigc::mem_fun(*this, - &BackupView::onCreateBackup)); -} - - -/*------------------------------------------------------------------------------ - * Construct the box for listing the pending backups. - *----------------------------------------------------------------------------*/ -void -BackupView :: constructBackupListView(void) throw () -{ - backupList.reset(new BackupList(this)); - - glade->connect_clicked("backupDeleteButton1", sigc::mem_fun(*this, - &BackupView::onDeleteButtonClicked)); - glade->connect_clicked("backupSaveButton1", sigc::mem_fun(*this, - &BackupView::onSaveButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the time chooser button being clicked. - *----------------------------------------------------------------------------*/ -void -BackupView :: onChooseTimeButtonClicked(void) throw () -{ - Ptr::Ref userMtime = dateTimeChooserWindow->run(); - - if (userMtime && *userMtime != not_a_date_time) { - mtime = userMtime; - writeMtimeEntry(); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the "reset time" button being clicked. - *----------------------------------------------------------------------------*/ -void -BackupView :: onResetTimeButtonClicked(void) throw () -{ - mtime.reset(); - writeMtimeEntry(); -} - - -/*------------------------------------------------------------------------------ - * Initiate the creation of a new backup. - *----------------------------------------------------------------------------*/ -void -BackupView :: onCreateBackup(void) throw () -{ - Ptr::Ref title = readTitle(); - Ptr::Ref criteria = criteriaEntry->getSearchCriteria(); - - if (mtime) { - criteria->addMtimeCondition(">=", mtime); - } - - try { - backupList->add(title, criteria); - - } catch (XmlRpcException &e) { - Ptr::Ref errorMsg - = getResourceUstring("backupErrorMsg"); - errorMsg->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Delete button being clicked. - *----------------------------------------------------------------------------*/ -void -BackupView :: onDeleteButtonClicked(void) throw () -{ - try { - backupList->removeSelected(); - - } catch (XmlRpcException &e) { - Ptr::Ref errorMsg - = getResourceUstring("backupErrorMsg"); - errorMsg->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Save button being clicked. - *----------------------------------------------------------------------------*/ -void -BackupView :: onSaveButtonClicked(void) throw () -{ - Ptr::Ref url; - try { - url = backupList->getSelectedUrl(); - - } catch (XmlRpcException &e) { - Ptr::Ref errorMsg - = getResourceUstring("backupErrorMsg"); - errorMsg->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMsg); - } - - if (!url) { - return; - } - - Ptr::Ref dialog; - try { - dialog.reset(new Gtk::FileChooserDialog( - *getResourceUstring("fileChooserDialogTitle"), - Gtk::FILE_CHOOSER_ACTION_SAVE)); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - std::exit(1); - } - - struct passwd * pwd = getpwuid(getuid()); - if (pwd) { - dialog->set_current_folder(pwd->pw_dir); - } - - Ptr::Ref fileName = backupList->getSelectedTitle(); - fileName->append(".tar"); - dialog->set_current_name(*fileName); - - dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - dialog->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); - - int result = dialog->run(); - - if (result != Gtk::RESPONSE_OK) { - return; - } - - fileName->assign(dialog->get_filename()); - try { - FileTools::copyUrlToFile(*url, *fileName); - - } catch (std::runtime_error &e) { - // TODO: handle error - } -} - - -/*------------------------------------------------------------------------------ - * Read the title of the backup from the entry field. - *----------------------------------------------------------------------------*/ -Ptr::Ref -BackupView :: readTitle(void) throw () -{ - Ptr::Ref title(new Glib::ustring( - backupTitleEntry->get_text() )); - if (*title == "") { - title = getResourceUstring("defaultBackupTitle"); - } - - return title; -} - - -/*------------------------------------------------------------------------------ - * Format and write the contents of mtime into the mtimeEntry. - *----------------------------------------------------------------------------*/ -void -BackupView :: writeMtimeEntry(void) throw () -{ - if (mtime) { - mtimeEntry->set_text(to_simple_string(*mtime)); - } else { - mtimeEntry->set_text("-"); - } -} - diff --git a/src/products/gLiveSupport/src/BackupView.h b/src/products/gLiveSupport/src/BackupView.h deleted file mode 100644 index fc24d4b38..000000000 --- a/src/products/gLiveSupport/src/BackupView.h +++ /dev/null @@ -1,220 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BackupView_h -#define BackupView_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/TimeConversion.h" -#include "DateTimeChooserWindow.h" -#include "AdvancedSearchEntry.h" -#include "BackupList.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; -using namespace boost::posix_time; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The backup view, a subclass of Gtk::VBox. - * This will be contained in another window, most likely - * as the contents of a notebook tab. - * - * The layout of the view is roughly the following: - *

- *  +--- backup view -------------------+
- *  | +-- criteria selector pane -----+ |
- *  | +-- [[ AdvancedSearchEntry ]] --+ |
- *  | +-------------------(Backup)----+ |
- *  | +===============================+ |
- *  | +-- pending backups pane -------+ |
- *  | +-- [[ BackupList ]] -----------+ |
- *  | +---------------(Delete)-(Save)-+ |
- *  +-------------------------(Close)---+
- *  
- * - */ -class BackupView : public GuiComponent -{ - private: - - /** - * The text entry field for entering the title of the backup. - */ - Gtk::Entry * backupTitleEntry; - - /** - * The "modified since" time for the backup. - */ - Ptr::Ref mtime; - - /** - * The entry field holding the "modified since" time for the backup. - */ - Gtk::Entry * mtimeEntry; - - /** - * The window for entering the "modified since" time. - */ - Ptr::Ref dateTimeChooserWindow; - - /** - * The object for entering the backup criteria. - */ - Ptr::Ref criteriaEntry; - - /** - * The list of pending backups. - */ - Ptr::Ref backupList; - - /** - * Construct the box for entering the backup criteria. - * - * @return the constructed box, already Gtk::manage()'ed. - */ - void - constructCriteriaView(void) throw (); - - /** - * Construct the box for listing the pending backups. - * - * @return the constructed box, already Gtk::manage()'ed. - */ - void - constructBackupListView(void) throw (); - - /** - * Read the title of the backup from the entry field. - * If the entry is blank, a default title is used. - * - * @return the title. - */ - Ptr::Ref - readTitle(void) throw (); - - /** - * Format and write the contents of mtime into the mtimeEntry. - */ - void - writeMtimeEntry(void) throw (); - - - protected: - - /** - * Event handler for the time chooser button being clicked. - */ - void - onChooseTimeButtonClicked(void) throw (); - - /** - * Event handler for the "reset time" button being clicked. - */ - void - onResetTimeButtonClicked(void) throw (); - - /** - * Initiate the creation of a new backup. - */ - void - onCreateBackup(void) throw (); - - /** - * Event handler for the Delete button being clicked. - */ - void - onDeleteButtonClicked(void) throw (); - - /** - * Event handler for the Save button being clicked. - */ - void - onSaveButtonClicked(void) throw (); - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - */ - BackupView(GuiObject * parent) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~BackupView(void) throw () - { - } - - /** - * Return the BackupList object shown by the widget. - */ - Ptr::Ref - getBackupList(void) throw () - { - return backupList; - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // BackupView_h - diff --git a/src/products/gLiveSupport/src/BrowseEntry.cxx b/src/products/gLiveSupport/src/BrowseEntry.cxx deleted file mode 100644 index 3a532879d..000000000 --- a/src/products/gLiveSupport/src/BrowseEntry.cxx +++ /dev/null @@ -1,76 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "BrowseEntry.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -BrowseEntry :: BrowseEntry(GuiObject * parent) - throw () - : GuiComponent(parent) -{ - browseItemOne.reset(new BrowseItem(this, - 0, - 4 /* Genre */)); - browseItemTwo.reset(new BrowseItem(this, - 1, - 1 /* Creator */)); - browseItemThree.reset(new BrowseItem(this, - 2, - 2 /* Album */)); - // TODO: change hard-coded indices to stuff read from config - - browseItemOne->signalChanged().connect( - sigc::bind::Ref>( - sigc::mem_fun(*browseItemTwo, &BrowseItem::onParentChangedShow), - browseItemOne )); - browseItemTwo->signalChanged().connect( - sigc::bind::Ref>( - sigc::mem_fun(*browseItemThree, &BrowseItem::onParentChangedShow), - browseItemTwo )); -} - diff --git a/src/products/gLiveSupport/src/BrowseEntry.h b/src/products/gLiveSupport/src/BrowseEntry.h deleted file mode 100644 index 4aac66b53..000000000 --- a/src/products/gLiveSupport/src/BrowseEntry.h +++ /dev/null @@ -1,142 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BrowseEntry_h -#define BrowseEntry_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SearchCriteria.h" -#include "BrowseItem.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A Gtk::HBox with one or more search input fields in it. - * - */ -class BrowseEntry : public GuiComponent -{ - private: - - /** - * Default constructor. - */ - BrowseEntry(void) throw (); - - /** - * The first BrowseItem entry field. - */ - Ptr::Ref browseItemOne; - - /** - * The second BrowseItem entry field. - */ - Ptr::Ref browseItemTwo; - - /** - * The third BrowseItem entry field. - */ - Ptr::Ref browseItemThree; - - - public: - - /** - * Constructor with localization parameter. - * - * @param parent the GuiObject which contains this one. - */ - BrowseEntry(GuiObject * parent) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~BrowseEntry(void) throw () - { - } - - /** - * Return the current state of the search fields. - * - * @return a new LiveSupport::StorageClient::SearchCriteria instance, - * which contains the data entered by the user - */ - Ptr::Ref - getSearchCriteria(void) throw () - { - return browseItemThree->getSearchCriteria(); - } - - - /** - * The signal raised when either the combo box or the tree view - * selection has changed. - * - * @return the signalChanged() of the last browse item - */ - sigc::signal - signalChanged(void) throw () - { - return browseItemThree->signalChanged(); - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // BrowseEntry_h - diff --git a/src/products/gLiveSupport/src/BrowseItem.cxx b/src/products/gLiveSupport/src/BrowseItem.cxx deleted file mode 100644 index 0024039d6..000000000 --- a/src/products/gLiveSupport/src/BrowseItem.cxx +++ /dev/null @@ -1,157 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "BrowseItem.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -BrowseItem :: BrowseItem(GuiObject * parent, - int index, - int defaultIndex) - throw () - : GuiComponent(parent) -{ - parentCriteria.reset(new SearchCriteria); - - glade->get_widget_derived(addIndex("browseMetadataEntry", index), - metadataEntry); - metadataEntry->setContents(gLiveSupport->getMetadataTypeContainer()); - metadataEntry->set_active(defaultIndex); - metadataEntry->signal_changed().connect(sigc::mem_fun(*this, - &BrowseItem::onShow )); - - treeModel = Gtk::ListStore::create(modelColumns); - - glade->get_widget_derived(addIndex("browseMetadataValues", index), - metadataValues); - metadataValues->set_model(treeModel); - metadataValues->connectModelSignals(treeModel); - metadataValues->appendColumn("", modelColumns.displayedColumn, 200); - metadataValues->signal_cursor_changed().connect(sigc::mem_fun(*this, - &BrowseItem::emitSignalChanged )); - - allString = Glib::Markup::escape_text( - *getResourceUstring("allStringForBrowse")); - - onShow(); -} - - -/*------------------------------------------------------------------------------ - * Return the search criteria selected by the user. - *----------------------------------------------------------------------------*/ -Ptr::Ref -BrowseItem :: getSearchCriteria(void) throw (std::invalid_argument) -{ - Ptr::Ref metadataKey = metadataEntry->getActiveKey(); - - Glib::ustring metadataValue; - Glib::RefPtr refSelection = - metadataValues->get_selection(); - bool found = false; - if (refSelection) { - Gtk::TreeModel::iterator iter = refSelection->get_selected(); - if (iter) { - found = true; - metadataValue = (*iter)[modelColumns.originalColumn]; - } - } - - if (!found) { - return parentCriteria; // should never happen, but für alle Fälle - } - - if (metadataValue == allString) { - return parentCriteria; - - } else { - Ptr::Ref criteria(new SearchCriteria(*parentCriteria)); - criteria->addCondition(*metadataKey, "=", metadataValue); - return criteria; - } -} - - -/*------------------------------------------------------------------------------ - * Fill in the column with the possible values. - *----------------------------------------------------------------------------*/ -void -BrowseItem :: onShow(void) throw () -{ - Ptr::Ref metadataKey = metadataEntry->getActiveKey(); - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr >::Ref values; - try { - values = storage->browse(sessionId, metadataKey, parentCriteria); - } catch (XmlRpcException &e) { - std::cerr << "Error in BrowseItem::onShow(): " - << e.what() << std::endl; - return; - } - - treeModel->clear(); - Gtk::TreeModel::Row row = *treeModel->append(); - row[modelColumns.originalColumn] = allString; - row[modelColumns.displayedColumn] = allString; - metadataValues->get_selection()->select(*row); - - std::vector::const_iterator valuesIt; - for (valuesIt = values->begin(); valuesIt != values->end(); ++valuesIt) { - row = *treeModel->append(); - row[modelColumns.originalColumn] = *valuesIt; - row[modelColumns.displayedColumn] = Glib::Markup::escape_text( - *valuesIt); - } - - emitSignalChanged(); -} - diff --git a/src/products/gLiveSupport/src/BrowseItem.h b/src/products/gLiveSupport/src/BrowseItem.h deleted file mode 100644 index a4ccb735a..000000000 --- a/src/products/gLiveSupport/src/BrowseItem.h +++ /dev/null @@ -1,252 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BrowseItem_h -#define BrowseItem_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/NumericTools.h" -#include "LiveSupport/Core/SearchCriteria.h" -#include "LiveSupport/Widgets/MetadataComboBoxText.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A single browse input field. - * - * It consists of a Widgets::ComboBoxText and a Widgets::ZebraTreeView - * (without headers). It stores a "parent search criteria", and shows all - * possible metadata values of the type selected in the ComboBoxText which - * match this condition. The parent search criteria should be the conjunction - * of all search conditions selected in BrowseItem objects to the left of - * this one. - * - */ -class BrowseItem : public GuiComponent, - private NumericTools -{ - private: - - /** - * The type for storing both the metadata and the comparison operator - * localizations. - */ - typedef std::vector > - MapVector; - - /** - * The metadata field. - */ - MetadataComboBoxText * metadataEntry; - - /** - * The selection field. - */ - ZebraTreeView * metadataValues; - - /** - * The columns model needed by Gtk::TreeView. - * Lists one clip per row. - * - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - /** - * The original (unescaped) value of metadata. - */ - Gtk::TreeModelColumn originalColumn; - - /** - * The single displayed column. - */ - Gtk::TreeModelColumn displayedColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(originalColumn); - add(displayedColumn); - } - }; - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * The tree model, as a GTK reference. - */ - Glib::RefPtr treeModel; - - /** - * The localized version of the "--- all ---" string. - */ - Glib::ustring allString; - - /** - * The criteria from the browse items to the left of this one. - */ - Ptr::Ref parentCriteria; - - /** - * Default constructor. - */ - BrowseItem(void) throw (); - - /** - * Emit the "selection changed" signal. - */ - void - emitSignalChanged(void) throw () - { - signalChanged().emit(); - } - - - protected: - - /** - * A signal object to notify people that the selection has changed. - */ - sigc::signal signalChangedObject; - - - public: - - /** - * Constructor with parent and localization parameter. - * - * @param parent the GuiObject which contains this one. - * @param index the position of this item in the list of - * browse items. - * @param defaultIndex the index of the metadata entry to display - * initially - */ - BrowseItem(GuiObject * parent, - int index, - int defaultIndex) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~BrowseItem(void) throw () - { - } - - /** - * Return the search criteria selected by the user. - * This is the parent criteria (assumed to have operator "and") - * with the search condition showing the current selection added - * (if any). - * - * @return a new LiveSupport::StorageClient::SearchCriteria instance, - * which contains the data entered by the user - */ - Ptr::Ref - getSearchCriteria(void) throw (std::invalid_argument); - - /** - * Fill in the column with the possible values (limited by the - * parent criteria), and set the selection to "all". - */ - void - onShow(void) throw (); - - /** - * The signal handler for refreshing the treeview of metadata values, - * if we also need to change the parent criteria. Same as onShow(), - * plus changing the parent criteria. - * - * @param leftNeighbor the neighbor where the parent criteria - * are coming from. - */ - void - onParentChangedShow(Ptr::Ref leftNeighbor) - throw () - { - parentCriteria = leftNeighbor->getSearchCriteria(); - onShow(); - } - - /** - * The signal raised when either the combo box or the tree view - * selection has changed. - * - * @return the signal object (a protected member of this class) - */ - sigc::signal - signalChanged(void) throw () - { - return signalChangedObject; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // BrowseItem_h - diff --git a/src/products/gLiveSupport/src/ContentsStorable.h b/src/products/gLiveSupport/src/ContentsStorable.h deleted file mode 100644 index 648552633..000000000 --- a/src/products/gLiveSupport/src/ContentsStorable.h +++ /dev/null @@ -1,108 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ContentsStorable_h -#define ContentsStorable_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#include -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A virtual class to be implemented by GUI windows which - * want to store their contents as a user preference item. - * - */ -class ContentsStorable -{ - public: - - /** - * Virtual destructor. - */ - virtual - ~ContentsStorable(void) throw () - { - } - - /** - * Return the user preferences key. - * The contents of the window will be stored in the user preferences - * under this key. - * - * @return the user preference key. - */ - virtual Ptr::Ref - getUserPreferencesKey(void) throw () - = 0; - - /** - * Convert the contents of the window to a string. - * - * @return the contents of the window, as a string. - */ - virtual Ptr::Ref - getContents(void) throw () - = 0; - - /** - * Restore the contents of the window. - * - * @param contents the new contents (as a string); it will replace - * the current contents of the window - */ - virtual void - setContents(Ptr::Ref contents) throw () - = 0; -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // ContentsStorable_h - diff --git a/src/products/gLiveSupport/src/CuePlayer.cxx b/src/products/gLiveSupport/src/CuePlayer.cxx deleted file mode 100644 index b16097bfd..000000000 --- a/src/products/gLiveSupport/src/CuePlayer.cxx +++ /dev/null @@ -1,234 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "CuePlayer.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/** - * The string which identifies the Play stock image. - */ -const Glib::ustring playStockImageName = "gtk-media-play"; - -/** - * The string which identifies the Pause stock image. - */ -const Glib::ustring pauseStockImageName = "gtk-media-pause"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -CuePlayer :: CuePlayer(GuiObject * parent, - Gtk::TreeView * treeView, - const PlayableTreeModelColumnRecord & modelColumns) - throw () - : GuiComponent(parent), - treeView(treeView), - modelColumns(modelColumns) -{ - glade->get_widget("cuePlayButton1", playButton); - glade->get_widget("cueStopButton1", stopButton); - - playButton->signal_clicked().connect(sigc::mem_fun(*this, - &CuePlayer::onPlayButtonClicked )); - stopButton->signal_clicked().connect(sigc::mem_fun(*this, - &CuePlayer::onStopButtonClicked )); - - audioState = waitingState; - - gLiveSupport->attachCueAudioListener(this); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -CuePlayer :: ~CuePlayer(void) throw () -{ - try { - gLiveSupport->detachCueAudioListener(this); - } catch (std::invalid_argument &e) { - std::cerr << "Could not detach cue player audio listener." - << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Play menu item selected from the entry context menu - *----------------------------------------------------------------------------*/ -void -CuePlayer :: onPlayItem(void) throw () -{ - Glib::RefPtr - selection = treeView->get_selection(); - std::vector - selectedRows = selection->get_selected_rows(); - Gtk::TreeIter iter; - - if (selectedRows.size() > 0) { - Gtk::TreePath path = selectedRows.front(); - iter = treeView->get_model()->get_iter(path); - } else { - iter = treeView->get_model()->children().begin(); - } - - if (iter) { - Ptr::Ref playable = (*iter)[modelColumns.playableColumn]; - try { - setAudioState(playingState); - gLiveSupport->playCueAudio(playable); - } catch (std::runtime_error &e) { - std::cerr << "GLiveSupport::playCueAudio() error:" - << std::endl << e.what() << std::endl; - } - } -} - - -/*------------------------------------------------------------------------------ - * Pause the song. - *----------------------------------------------------------------------------*/ -void -CuePlayer :: onPauseItem(void) throw () -{ - try { - gLiveSupport->pauseCueAudio(); - setAudioState(pausedState); - } catch (std::logic_error &e) { - std::cerr << "GLiveSupport::pauseCueAudio() error:" << std::endl - << e.what() << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Play button getting clicked - *----------------------------------------------------------------------------*/ -void -CuePlayer :: onPlayButtonClicked(void) throw () -{ - switch (audioState) { - case waitingState: - onPlayItem(); - break; - - case playingState: - onPauseItem(); - break; - - case pausedState: - try { - gLiveSupport->pauseCueAudio(); // ie, restart - setAudioState(playingState); - } catch (std::logic_error &e) { - std::cerr << "GLiveSupport::pauseCueAudio() error:" << std::endl - << e.what() << std::endl; - } - break; - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Stop button getting clicked - *----------------------------------------------------------------------------*/ -void -CuePlayer :: onStopButtonClicked(void) throw () -{ - if (audioState != waitingState) { - try { - gLiveSupport->stopCueAudio(); - } catch (std::logic_error &e) { - std::cerr << "GLiveSupport::stopCueAudio() error:" << std::endl - << e.what() << std::endl; - } - setAudioState(waitingState); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the "cue audio player has stopped" event. - *----------------------------------------------------------------------------*/ -void -CuePlayer :: onStop(Ptr::Ref errorMessage) throw () -{ - setAudioState(waitingState); - - if (errorMessage) { - gLiveSupport->displayMessageWindow(*errorMessage); - } -} - -/*------------------------------------------------------------------------------ - * Event handler for the "cue audio player has started" event. - *----------------------------------------------------------------------------*/ -void -CuePlayer :: onStart(gint64 id) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Set the state of the widget. - *----------------------------------------------------------------------------*/ -void -CuePlayer :: setAudioState(AudioState newState) throw () -{ - if ((audioState == waitingState || audioState == pausedState) - && newState == playingState) { - playButton->set_label(pauseStockImageName); - - } else if (audioState == playingState - && (newState == waitingState || newState == pausedState)) { - playButton->set_label(playStockImageName); - } - - audioState = newState; -} - diff --git a/src/products/gLiveSupport/src/CuePlayer.h b/src/products/gLiveSupport/src/CuePlayer.h deleted file mode 100644 index 7a65499b9..000000000 --- a/src/products/gLiveSupport/src/CuePlayer.h +++ /dev/null @@ -1,192 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef CuePlayer_h -#define CuePlayer_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerEventListener.h" -#include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A box displaying a play/pause and a stop button, which control the cue - * (preview) audio player. - * - */ -class CuePlayer : public GuiComponent, - public PlaylistExecutor::AudioPlayerEventListener -{ - private: - - /** - * The possible states of the (cue) audio player. - */ - enum AudioState { waitingState, playingState, pausedState }; - - /** - * The current state of the player. - */ - AudioState audioState; - - /** - * The play button. - */ - Gtk::Button * playButton; - - /** - * The stop button. - */ - Gtk::Button * stopButton; - - /** - * The Gtk::TreeView of the parent. - */ - Gtk::TreeView * treeView; - - /** - * The Gtk::TreeModelColumnRecord of the parent. - */ - const PlayableTreeModelColumnRecord & - modelColumns; - - /** - * Default constructor. - */ - CuePlayer(void) throw (); - - /** - * Pause the song. - */ - void - onPauseItem(void) throw (); - - /** - * Event handler for the Play button being clicked. - */ - void - onPlayButtonClicked(void) throw (); - - /** - * Event handler for the Stop button being clicked. - */ - void - onStopButtonClicked(void) throw (); - - /** - * Set the state of the widget. - * It sets the value of the audioState variable, and changes the - * play/pause button if necessary. - * - * @param newState the new value of the audioState variable. - */ - void - setAudioState(AudioState newState) throw (); - - - public: - - /** - * Constructor with parent parameters. - * - * @param parent the GuiObject which contains this one. - * @param treeView the TreeView object showing the selection. - * @param modelColumns the object holding the types of the columns. - */ - CuePlayer(GuiObject * parent, - Gtk::TreeView * treeView, - const PlayableTreeModelColumnRecord & modelColumns) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~CuePlayer(void) throw (); - - /** - * Signal handler for the "play item" menu item selected - * from the entry context menu. - */ - void - onPlayItem(void) throw (); - - /** - * Event handler for the "cue audio player has stopped" event. - * - * @param errorMessage is a 0 pointer if the player stopped normally - */ - virtual void - onStop(Ptr::Ref errorMessage - = Ptr::Ref()) - throw (); - - /** - * Event handler for the "cue audio player has started" event. - * - * @param fileName - */ - virtual void - onStart(gint64 id) - throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // CuePlayer_h - diff --git a/src/products/gLiveSupport/src/DateTimeChooserWindow.cxx b/src/products/gLiveSupport/src/DateTimeChooserWindow.cxx deleted file mode 100644 index c1faa7e3e..000000000 --- a/src/products/gLiveSupport/src/DateTimeChooserWindow.cxx +++ /dev/null @@ -1,117 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "DateTimeChooserWindow.h" - - -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "dateTimeChooserWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "DateTimeChooserWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -DateTimeChooserWindow :: DateTimeChooserWindow (void) - throw () - : GuiWindow(bundleName, - gladeFileName) -{ - Gtk::Label * hourLabel; - Gtk::Label * minuteLabel; - glade->get_widget("hourLabel1", hourLabel); - glade->get_widget("minuteLabel1", minuteLabel); - hourLabel->set_label(*getResourceUstring("hourLabel")); - minuteLabel->set_label(*getResourceUstring("minuteLabel")); - - glade->get_widget("calendar1", calendar); - glade->get_widget("hourSpinButton1", hourEntry); - glade->get_widget("minuteSpinButton1", minuteEntry); - - glade->get_widget("okButton1", okButton); - okButton->signal_clicked().connect(sigc::mem_fun(*this, - &DateTimeChooserWindow::onOkButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the OK button clicked. - *----------------------------------------------------------------------------*/ -void -DateTimeChooserWindow :: onOkButtonClicked(void) throw () -{ - unsigned int year; - unsigned int month; - unsigned int day; - calendar->get_date(year, month, day); - ++month; // Gtk+ months are 0-based, Boost months are 1-based - - int hours = hourEntry->get_value_as_int(); - int minutes = minuteEntry->get_value_as_int(); - - chosenDateTime.reset(new boost::posix_time::ptime( - boost::gregorian::date(year, month, day), - boost::posix_time::time_duration(hours, minutes, 0) )); - - mainWindow->hide(); -} - - -/*------------------------------------------------------------------------------ - * Show the window and return the button clicked. - *----------------------------------------------------------------------------*/ -Ptr::Ref -DateTimeChooserWindow :: run(void) throw () -{ - chosenDateTime.reset(); - Gtk::Main::run(*mainWindow); - return chosenDateTime; -} - diff --git a/src/products/gLiveSupport/src/DateTimeChooserWindow.h b/src/products/gLiveSupport/src/DateTimeChooserWindow.h deleted file mode 100644 index f85943c60..000000000 --- a/src/products/gLiveSupport/src/DateTimeChooserWindow.h +++ /dev/null @@ -1,143 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef DateTimeChooserWindow_h -#define DateTimeChooserWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "GLiveSupport.h" - -#include "GuiWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A dialog window for choosing a date/time. - * - * The return value of the run() method is a boost::posix_time::ptime value. - * The DateTimeChooserWindow object is not destroyed when it returns from - * run(); it is the responsibility of the caller to delete it (or it can be - * reused a few times first). - * - */ -class DateTimeChooserWindow : public GuiWindow -{ - private: - - /** - * The calendar where the date is chosen. - */ - Gtk::Calendar * calendar; - - /** - * The entry field for hours. - */ - Gtk::SpinButton * hourEntry; - - /** - * The entry field for minutes. - */ - Gtk::SpinButton * minuteEntry; - - /** - * The OK button - */ - Gtk::Button * okButton; - - /** - * The return value; set to 0 if the user closed the window. - */ - Ptr::Ref chosenDateTime; - - - protected: - - /** - * The event handler for the OK button clicked. - */ - virtual void - onOkButtonClicked(void) throw (); - - - public: - - /** - * Constructor. - */ - DateTimeChooserWindow(void) - throw (); - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~DateTimeChooserWindow(void) throw () - { - } - - /** - * Run the window and return the date/time selected. - * The returned value may be a 0 pointer (if the user pressed Cancel), - * and it may be not_a_date_time, if the user's selection is invalid. - */ - Ptr::Ref - run(void) throw (); - -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // DateTimeChooserWindow_h - diff --git a/src/products/gLiveSupport/src/DndMethods.cxx b/src/products/gLiveSupport/src/DndMethods.cxx deleted file mode 100644 index 1a8ea23fc..000000000 --- a/src/products/gLiveSupport/src/DndMethods.cxx +++ /dev/null @@ -1,181 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "DndMethods.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the D'n'D callbacks. - *----------------------------------------------------------------------------*/ -void -DndMethods :: setupDndCallbacks (DndType type) throw () -{ - Gtk::TreeView * treeView = getTreeViewForDnd(); - - std::list targets; - targets.push_back(Gtk::TargetEntry("STRING", - Gtk::TARGET_SAME_APP)); - - if (type | DND_SOURCE) { - treeView->enable_model_drag_source(targets); - treeView->signal_drag_data_get().connect(sigc::mem_fun(*this, - &DndMethods::onTreeViewDragDataGet)); - } - - if (type | DND_DEST) { - treeView->enable_model_drag_dest(targets); - treeView->signal_drag_data_received().connect(sigc::mem_fun(*this, - &DndMethods::onTreeViewDragDataReceived)); - } -} - - -/*------------------------------------------------------------------------------ - * The callback for supplying the data for the drag and drop. - *----------------------------------------------------------------------------*/ -void -DndMethods :: onTreeViewDragDataGet ( - const Glib::RefPtr & context, - Gtk::SelectionData & selectionData, - guint info, - guint time) - throw () -{ - Glib::ustring dropString = getWindowNameForDnd(); - Ptr::Ref playable = getFirstSelectedPlayable(); - - while ((playable = getNextSelectedPlayable())) { - dropString += " "; - dropString += std::string(*playable->getId()); - } - - selectionData.set(selectionData.get_target(), - 8 /* 8 bits format*/, - (const guchar *) dropString.c_str(), - dropString.bytes()); -} - - -/*------------------------------------------------------------------------------ - * The callback for processing the data delivered by drag and drop. - *----------------------------------------------------------------------------*/ -void -DndMethods :: onTreeViewDragDataReceived( - const Glib::RefPtr & context, - int x, - int y, - const Gtk::SelectionData & selectionData, - guint info, - guint time) - throw () -{ - Glib::ustring windowName = getWindowNameForDnd(); - - if (selectionData.get_length() < 0 || selectionData.get_format() != 8) { - std::cerr << "unknown type of data dropped on the tree view in " - << windowName << std::endl; - context->drag_finish(false, false, time); - return; - } - - Glib::ustring data = selectionData.get_data_as_string(); - std::stringstream dataStream(data); - Glib::ustring sourceWindow; - dataStream >> sourceWindow; - - Gtk::TreeIter iter = insertRowAtPos(x, y); - Glib::ustring idAsString; - dataStream >> idAsString; // only works for 1 item, for now - Ptr::Ref id(new UniqueId(idAsString)); - addItem(iter, id); - - if (sourceWindow == windowName) { - context->drag_finish(true, true, time); // delete the original - - } else { - context->drag_finish(true, false, time); // don't delete the original - } -} - - -/*------------------------------------------------------------------------------ - * Insert a row into the tree model at the given tree view position. - *----------------------------------------------------------------------------*/ -Gtk::TreeIter -DndMethods :: insertRowAtPos (int x, - int y) throw () -{ - Gtk::TreeView * treeView = getTreeViewForDnd(); - Glib::RefPtr - treeModel = Glib::RefPtr::cast_dynamic( - treeView->get_model() ); - - Gtk::TreePath destPath; - Gtk::TreeViewDropPosition destPos; - bool pathIsValid = treeView->get_dest_row_at_pos( - x, y, destPath, destPos); - // get_drag_dest_row() does not work here, for some strange reason - Gtk::TreeIter newIter; - - if (pathIsValid) { - assert (!destPath.empty()); - Gtk::TreeIter destination = treeModel->get_iter(destPath); - - if (destPos == Gtk::TREE_VIEW_DROP_BEFORE - || destPos == Gtk::TREE_VIEW_DROP_INTO_OR_BEFORE) { - newIter = treeModel->insert(destination); - - } else if (destPos == Gtk::TREE_VIEW_DROP_AFTER - || destPos == Gtk::TREE_VIEW_DROP_INTO_OR_AFTER) { - newIter = treeModel->insert_after(destination); - - } else { - assert (false); - } - } else { - newIter = treeModel->append(); - } - - return newIter; -} - diff --git a/src/products/gLiveSupport/src/DndMethods.h b/src/products/gLiveSupport/src/DndMethods.h deleted file mode 100644 index f166176f8..000000000 --- a/src/products/gLiveSupport/src/DndMethods.h +++ /dev/null @@ -1,197 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef DndMethods_h -#define DndMethods_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#include - -#include "LiveSupport/Core/Playable.h" - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An abstract class containing template methods which implement drag and drop. - * - * To implement d'n'd in a GuiWindow, inherit from this class, implement the - * pure abstract methods declared in this class (see the requirements at the - * method declarations), and call setupDndCallbacks() after the tree view has - * been constructed. - * - */ -class DndMethods -{ - protected: - - /** - * The tree view we want to implement d'n'd on. - */ - virtual Gtk::TreeView * - getTreeViewForDnd (void) throw () - = 0; - - /** - * The name of the window. - */ - virtual Glib::ustring - getWindowNameForDnd (void) throw () - = 0; - - /** - * Return the topmost selected row in the tree view. - * - * @return the first selected playable item. - */ - virtual Ptr::Ref - getFirstSelectedPlayable(void) throw () - = 0; - - /** - * Used to iterate over the selected rows in the tree view. - * - * @return the next selected playable item. - */ - virtual Ptr::Ref - getNextSelectedPlayable(void) throw () - = 0; - - /** - * Add an item to the d'n'd tree view at the given position. - * - * @param iter the iterator pointing to the row to be filled in. - * @param id the ID of the item to add. - */ - virtual void - addItem (Gtk::TreeIter iter, - Ptr::Ref id) throw () - = 0; - - /** - * Insert a row into the tree model at the given tree view position. - * Creates the new row; the caller should fill it with data. - * - * @param x the x coordinate of the location of the new row. - * @param y the y coordinate of the location of the new row. - * @return an iterator pointing to the newly created row. - */ - Gtk::TreeIter - insertRowAtPos (int x, - int y) throw (); - - /** - * Types of d'n'd. - */ - typedef enum { DND_SOURCE = 1, - DND_DEST = 2 - } DndType; - - /** - * Set up the d'n'd callbacks. - * - * @param type set up callbacks for d'n'd source or destination - * (default: both). - */ - void - setupDndCallbacks (DndType type = DndType(DND_SOURCE | DND_DEST)) - throw (); - - /** - * The callback for supplying the data for the drag and drop. - * - * @param context the drag context. - * @param selectionData the data (filled in by this function). - * @param info not used. - * @param time timestamp for the d'n'd operation. - */ - void - onTreeViewDragDataGet ( - const Glib::RefPtr & context, - Gtk::SelectionData & selectionData, - guint info, - guint time) - throw (); - - /** - * The callback for processing the data delivered by drag and drop. - * - * @param context the drag context. - * @param x the x coord where the data was dropped. - * @param y the y coord where the data was dropped. - * @param selectionData the data. - * @param info not used. - * @param time timestamp for the d'n'd operation. - */ - virtual void - onTreeViewDragDataReceived ( - const Glib::RefPtr & context, - int x, - int y, - const Gtk::SelectionData & selectionData, - guint info, - guint time) - throw (); - - /** - * Constructor. - */ - DndMethods (void) throw () - { - } - - /** - * Virtual destructor. - */ - virtual - ~DndMethods(void) throw () - { - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // DndMethods_h - diff --git a/src/products/gLiveSupport/src/ExportFormatRadioButtons.cxx b/src/products/gLiveSupport/src/ExportFormatRadioButtons.cxx deleted file mode 100644 index 069746b4a..000000000 --- a/src/products/gLiveSupport/src/ExportFormatRadioButtons.cxx +++ /dev/null @@ -1,82 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "ExportFormatRadioButtons.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ExportFormatRadioButtons :: ExportFormatRadioButtons(GuiObject * parent) - throw () - : GuiComponent(parent) -{ - glade->get_widget("internalFormatRadioButton1", internalFormatRadioButton); - glade->get_widget("smilFormatRadioButton1", smilFormatRadioButton); - internalFormatRadioButton->set_label(*getResourceUstring( - "internalFormatName")); - smilFormatRadioButton->set_label(*getResourceUstring( - "smilFormatName")); -} - - -/*------------------------------------------------------------------------------ - * Return the format which is currently selected. - *----------------------------------------------------------------------------*/ -StorageClientInterface::ExportFormatType -ExportFormatRadioButtons :: getFormat(void) throw () -{ - if (internalFormatRadioButton->get_active()) { - return StorageClientInterface::internalFormat; - - } else if (smilFormatRadioButton->get_active()) { - return StorageClientInterface::smilFormat; - - } else { - std::cerr << "impossible value in ExportFormatRadioButtons::getFormat()" - << std::endl; - std::exit(1); - } -} - diff --git a/src/products/gLiveSupport/src/ExportFormatRadioButtons.h b/src/products/gLiveSupport/src/ExportFormatRadioButtons.h deleted file mode 100644 index 55d5eba12..000000000 --- a/src/products/gLiveSupport/src/ExportFormatRadioButtons.h +++ /dev/null @@ -1,99 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ExportFormatRadioButtons_h -#define ExportFormatRadioButtons_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#include "LiveSupport/StorageClient/StorageClientInterface.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A specialized group of radio buttons, holding the - * StorageClientInterface::ExportFormatType options. - * - */ -class ExportFormatRadioButtons : public GuiComponent -{ - private: - - /** - * The radio button for the internal Campcaster format. - */ - Gtk::RadioButton * internalFormatRadioButton; - - /** - * The radio button for the SMIL format. - */ - Gtk::RadioButton * smilFormatRadioButton; - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - */ - ExportFormatRadioButtons(GuiObject * parent) - throw (); - - /** - * Return the format which is currently selected. - */ - StorageClientInterface::ExportFormatType - getFormat(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // ExportFormatRadioButtons_h - diff --git a/src/products/gLiveSupport/src/ExportPlaylistWindow.cxx b/src/products/gLiveSupport/src/ExportPlaylistWindow.cxx deleted file mode 100644 index d7fb5c4b9..000000000 --- a/src/products/gLiveSupport/src/ExportPlaylistWindow.cxx +++ /dev/null @@ -1,217 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_PWD_H -#include -#else -#error need pwd.h -#endif - -#include "LiveSupport/Core/FileTools.h" - -#include "ExportPlaylistWindow.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "exportPlaylistWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "ExportPlaylistWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ExportPlaylistWindow :: ExportPlaylistWindow(Ptr::Ref playlist) - throw () - : GuiWindow(bundleName, - gladeFileName), - playlist(playlist) -{ - Gtk::Label * playlistTitleTextLabel; - Gtk::Label * formatLabel; - glade->get_widget("playlistTitleTextLabel1", playlistTitleTextLabel); - glade->get_widget("formatLabel1", formatLabel); - playlistTitleTextLabel->set_label(*getResourceUstring( - "playlistTitleLabel")); - formatLabel->set_label(*getResourceUstring("formatLabel")); - - Gtk::Label * playlistTitleValueLabel; - glade->get_widget("playlistTitleValueLabel1", playlistTitleValueLabel); - playlistTitleValueLabel->set_label(*playlist->getTitle()); - - glade->connect_clicked("cancelButton1", sigc::mem_fun(*this, - &ExportPlaylistWindow::onCancelButtonClicked)); - glade->connect_clicked("saveButton1", sigc::mem_fun(*this, - &ExportPlaylistWindow::onSaveButtonClicked)); - - formatButtons.reset(new ExportFormatRadioButtons(this)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Cancel button being clicked. - *----------------------------------------------------------------------------*/ -void -ExportPlaylistWindow :: onCancelButtonClicked(void) throw () -{ - mainWindow->hide(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Save button being clicked. - *----------------------------------------------------------------------------*/ -void -ExportPlaylistWindow :: onSaveButtonClicked(void) throw () -{ - if (token) { - resetToken(); - } - - // run the storage method - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - Ptr::Ref playlistId = playlist->getId(); - StorageClientInterface::ExportFormatType - format = formatButtons->getFormat(); - Ptr::Ref url(new Glib::ustring); - - try { - token = storage->exportPlaylistOpen(sessionId, playlistId, format, url); - } catch (XmlRpcException &e) { - Ptr::Ref errorMsg = getResourceUstring( - "createExportErrorMsg"); - errorMsg->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMsg); - return; - } - - // run the file chooser dialog - Ptr::Ref dialog; - try { - dialog.reset(new Gtk::FileChooserDialog( - *getResourceUstring("fileChooserDialogTitle"), - Gtk::FILE_CHOOSER_ACTION_SAVE)); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - std::exit(1); - } - - struct passwd * pwd = getpwuid(getuid()); - if (pwd) { - dialog->set_current_folder(pwd->pw_dir); - } - - Ptr::Ref fileName(new Glib::ustring( - *playlist->getTitle())); - fileName->append(".tar"); - dialog->set_current_name(*fileName); - - dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - dialog->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); - - int result = dialog->run(); - - // save the exported playlist as a local file - if (result == Gtk::RESPONSE_OK) { - fileName->assign(dialog->get_filename()); - try { - FileTools::copyUrlToFile(*url, *fileName); - - } catch (std::runtime_error &e) { - Ptr::Ref errorMsg = getResourceUstring( - "saveExportErrorMsg"); - gLiveSupport->displayMessageWindow(*errorMsg); - } - } - - // close the exporting operation - resetToken(); - - mainWindow->hide(); -} - - -/*------------------------------------------------------------------------------ - * Cancel the current operation. - *----------------------------------------------------------------------------*/ -void -ExportPlaylistWindow :: resetToken(void) throw () -{ - Ptr::Ref storage - = gLiveSupport->getStorageClient(); - try { - storage->exportPlaylistClose(token); - token.reset(); - - } catch (XmlRpcException &e) { - Ptr::Ref errorMsg = getResourceUstring( - "createExportErrorMsg"); - errorMsg->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler called when the the window gets hidden. - *----------------------------------------------------------------------------*/ -bool -ExportPlaylistWindow :: onDeleteEvent(GdkEventAny * event) throw () -{ -std::cerr << "ExportPlaylistWindow :: onDeleteEvent called\n"; - if (token) { - resetToken(); - } - - return false; -} - diff --git a/src/products/gLiveSupport/src/ExportPlaylistWindow.h b/src/products/gLiveSupport/src/ExportPlaylistWindow.h deleted file mode 100644 index a88ce0e99..000000000 --- a/src/products/gLiveSupport/src/ExportPlaylistWindow.h +++ /dev/null @@ -1,147 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ExportPlaylistWindow_h -#define ExportPlaylistWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Playlist.h" -#include "ExportFormatRadioButtons.h" -#include "GLiveSupport.h" - -#include "GuiWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The Export Playlist window. This is a pop-up window accessible from the - * right-click menus of the Scratchpad, Live Mode and Search/Browse windows. - * It lets the user select the format of the exported playlist, and the - * location where it will be saved. - * - */ -class ExportPlaylistWindow : public GuiWindow -{ - private: - - /** - * The playlist to be exported. - */ - Ptr::Ref playlist; - - /** - * The playlist to be exported. - */ - Ptr::Ref token; - - /** - * The radio buttons for selecting the export format. - */ - Ptr::Ref formatButtons; - - /** - * Cancel the current operation. - * Call exportPlaylistClose() on token, and reset it to 0. - */ - void - resetToken(void) throw (); - - - protected: - - /** - * Event handler for the Cancel button being clicked. - */ - void - onCancelButtonClicked(void) throw (); - - /** - * Event handler for the Save button being clicked. - */ - void - onSaveButtonClicked(void) throw (); - - /** - * Event handler called when the the window gets hidden. - * It closes the exporting operations, if there is one in progress. - * - * Overrides GuiWindow::onDeleteEvent(). - * - * @param event attributes of the event. - * @return true if handled the event, false to continue deleting. - */ - virtual bool - onDeleteEvent(GdkEventAny * event) throw (); - - - public: - - /** - * Constructor. - * - * @param playlist the playlist to be exported. - */ - ExportPlaylistWindow(Ptr::Ref playlist) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~ExportPlaylistWindow(void) throw () - { - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // ExportPlaylistWindow_h - diff --git a/src/products/gLiveSupport/src/GLiveSupport.cxx b/src/products/gLiveSupport/src/GLiveSupport.cxx deleted file mode 100644 index 5d90d0d4c..000000000 --- a/src/products/gLiveSupport/src/GLiveSupport.cxx +++ /dev/null @@ -1,1985 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_PWD_H -#include -#else -#error need pwd.h -#endif - -#ifdef HAVE_SYS_STAT_H -#include -#else -#error need sys/stat.h -#endif - -#ifdef HAVE_STDLIB_H -#include -#else -#error need stdlib.h -#endif - -#include -#include - -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Core/XmlRpcInvalidDataException.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/SchedulerClient/SchedulerClientFactory.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerFactory.h" - -#include "MasterPanelWindow.h" -#include "GLiveSupport.h" - - -using namespace boost; -using namespace boost::posix_time; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::SchedulerClient; -using namespace LiveSupport::Widgets; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string - LiveSupport :: GLiveSupport :: GLiveSupport :: configElementNameStr - = "gLiveSupport"; - -/*------------------------------------------------------------------------------ - * The singleton instance of GLiveSupport - *----------------------------------------------------------------------------*/ -Ptr::Ref - LiveSupport :: GLiveSupport :: GLiveSupport :: singleton; - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the configuration file for this class - *----------------------------------------------------------------------------*/ -const std::string configFileDirStr = "/.campcaster/"; - -/*------------------------------------------------------------------------------ - * The name of the configuration file for this class - *----------------------------------------------------------------------------*/ -const std::string configFileNameStr = "campcaster-studio.xml"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the list of supported languages - *----------------------------------------------------------------------------*/ -const std::string supportedLanguagesElementName = "supportedLanguages"; - -/*------------------------------------------------------------------------------ - * The name of the config element for a supported language. - *----------------------------------------------------------------------------*/ -const std::string languageElementName = "language"; - -/*------------------------------------------------------------------------------ - * The name of the attribute for the locale id for a supported language - *----------------------------------------------------------------------------*/ -const std::string localeAttrName = "locale"; - -/*------------------------------------------------------------------------------ - * The name of the attribute for the name for a supported language - *----------------------------------------------------------------------------*/ -const std::string nameAttrName = "name"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the directory where the Glade files are - *----------------------------------------------------------------------------*/ -const std::string gladeDirConfigElementName = "gladeDirectory"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const std::string gladeFileName = "GLiveSupport.glade"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the scheduler daemon start command - *----------------------------------------------------------------------------*/ -const std::string schedulerDaemonCommandsElementName - = "schedulerDaemonCommands"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the sound output player - *----------------------------------------------------------------------------*/ -const std::string outputPlayerElementName = "outputPlayer"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the sound cue player - *----------------------------------------------------------------------------*/ -const std::string cuePlayerElementName = "cuePlayer"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the station logo image - *----------------------------------------------------------------------------*/ -const std::string stationLogoConfigElementName = "stationLogo"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the taskbar icon images - *----------------------------------------------------------------------------*/ -const std::string taskbarIconsConfigElementName = "taskbarIcons"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the test audio file location - *----------------------------------------------------------------------------*/ -const std::string testAudioUrlConfigElementName = "testAudioUrl"; - -/*------------------------------------------------------------------------------ - * The name of the user preference for storing window positions - *----------------------------------------------------------------------------*/ -const std::string windowPositionsKey = "windowPositions"; - -/*------------------------------------------------------------------------------ - * The name of the user preference for storing the token of the edited p.l. - *----------------------------------------------------------------------------*/ -const std::string editedPlaylistTokenKey = "editedPlaylistToken"; - -/*------------------------------------------------------------------------------ - * Static constant for the key of the scheduler not available error message - *----------------------------------------------------------------------------*/ -const std::string schedulerNotReachableKey = "schedulerNotReachableMsg"; - -/*------------------------------------------------------------------------------ - * Static constant for the key of the storage not available error message - *----------------------------------------------------------------------------*/ -const std::string storageNotReachableKey = "storageNotReachableMsg"; - -/*------------------------------------------------------------------------------ - * Static constant for the key of the authentication not available error msg - *----------------------------------------------------------------------------*/ -const std::string authenticationNotReachableKey = - "authenticationNotReachableMsg"; - -/*------------------------------------------------------------------------------ - * Static constant for the key of the locale not available error message - *----------------------------------------------------------------------------*/ -const std::string localeNotAvailableKey = "localeNotAvailableMsg"; - -/*------------------------------------------------------------------------------ - * The name of the config element for the serial device - *----------------------------------------------------------------------------*/ -const std::string serialPortConfigElementName = "serialPort"; - -/*------------------------------------------------------------------------------ - * The default serial device - *----------------------------------------------------------------------------*/ -const std::string serialPortDefaultDevice = "/dev/ttyS0"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new LiveSupport::GLiveSupport::GLiveSupport()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the gLiveSupport object - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - xmlpp::Node::NodeList nodes; - - // read the list of supported languages - nodes = element.get_children(supportedLanguagesElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no supportedLanguages element"); - } - configSupportedLanguages( - *dynamic_cast(nodes.front())); - - // configure the resource bundle - nodes = element.get_children(LocalizedObject::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no resourceBundle element"); - } - LocalizedConfigurable::configure( - *dynamic_cast(nodes.front()) ); - - // configure the AuthenticationClientFactory - nodes = element.get_children( - AuthenticationClientFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no authenticationClientFactory element"); - } - Ptr::Ref acf - = AuthenticationClientFactory::getInstance(); - acf->configure(*dynamic_cast(nodes.front())); - - authentication = acf->getAuthenticationClient(); - - // configure the StorageClientFactory - nodes = element.get_children(StorageClientFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no storageClientFactory element"); - } - Ptr::Ref stcf = StorageClientFactory::getInstance(); - stcf->configure(*dynamic_cast(nodes.front())); - - storage = stcf->getStorageClient(); - - // configure the directory where the Glade files are - nodes = element.get_children(gladeDirConfigElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no gladeDirectory element"); - } - const xmlpp::Element* gladeDirElement - = dynamic_cast(nodes.front()); - gladeDir = gladeDirElement->get_attribute("path") - ->get_value(); - glade = Gnome::Glade::Xml::create(gladeDir + gladeFileName); - - // configure the WidgetFactory - nodes = element.get_children(WidgetFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no widgetFactory element"); - } - widgetFactory = WidgetFactory::getInstance(); - widgetFactory->configure( - *dynamic_cast(nodes.front()) ); - - // configure the SchedulerClientFactory - nodes = element.get_children( - SchedulerClientFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no schedulerClientFactory element"); - } - Ptr::Ref schcf - = SchedulerClientFactory::getInstance(); - schcf->configure(*dynamic_cast(nodes.front())); - - scheduler = schcf->getSchedulerClient(); - - // configure the scheduler daemon start and stop command strings - nodes = element.get_children(schedulerDaemonCommandsElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no scheduler daemon commands element"); - } - const xmlpp::Element* schedulerDaemonCommandsElement - = dynamic_cast(nodes.front()); - xmlpp::Attribute * schedulerDaemonStartAttribute - = schedulerDaemonCommandsElement->get_attribute( - "start"); - xmlpp::Attribute * schedulerDaemonStopAttribute - = schedulerDaemonCommandsElement->get_attribute( - "stop"); - if (!schedulerDaemonStartAttribute) { - throw std::invalid_argument("missing scheduler start command"); - } - if (!schedulerDaemonStopAttribute) { - throw std::invalid_argument("missing scheduler stop command"); - } - - schedulerDaemonStartCommand.reset(new Glib::ustring( - schedulerDaemonStartAttribute->get_value())); - - schedulerDaemonStopCommand.reset(new Glib::ustring( - schedulerDaemonStopAttribute->get_value())); - - Ptr::Ref apf; - xmlpp::Element * elem; - // configure the outputPlayer AudioPlayerFactory - nodes = element.get_children(outputPlayerElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no outputPlayer element"); - } - elem = (xmlpp::Element*) *(nodes.begin()); - nodes = elem->get_children(AudioPlayerFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no audioPlayer element"); - } - apf = AudioPlayerFactory::getInstance(); - apf->configure(*dynamic_cast(nodes.front())); - - outputPlayer = apf->getAudioPlayer(); - outputPlayer->initialize(); - outputPlayer->attachListener(this); - - // configure the cuePlayer AudioPlayerFactory - nodes = element.get_children(cuePlayerElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no cuePlayer element"); - } - elem = (xmlpp::Element*) *(nodes.begin()); - nodes = elem->get_children(AudioPlayerFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no audioPlayer element"); - } - apf = AudioPlayerFactory::getInstance(); - apf->configure(*dynamic_cast(nodes.front())); - - cuePlayer = apf->getAudioPlayer(); - cuePlayer->initialize(); - - // configure the station logo image - nodes = element.get_children(stationLogoConfigElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no station logo element"); - } - const xmlpp::Element* stationLogoElement - = dynamic_cast(nodes.front()); - const Glib::ustring stationLogoFileName - = stationLogoElement->get_attribute("path") - ->get_value(); - try { - stationLogoPixbuf = Gdk::Pixbuf::create_from_file(stationLogoFileName); - } catch (Glib::FileError &e) { - Glib::ustring errorMsg = "could not open station logo image file: "; - errorMsg += e.what(); - throw std::invalid_argument(errorMsg); - } catch (Gdk::PixbufError &e) { - Glib::ustring errorMsg = "could not create station logo image: "; - errorMsg += e.what(); - throw std::invalid_argument(errorMsg); - } - - // configure the taskbar icon images - nodes = element.get_children(taskbarIconsConfigElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no taskbar icons element"); - } - taskbarIcons.reset(new TaskbarIcons()); - taskbarIcons->configure( - *dynamic_cast(nodes.front()) ); - - // configure the MetadataTypeContainer - nodes = element.get_children(MetadataTypeContainer::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no metadataTypeContainer element"); - } - Ptr::Ref metadataBundle = getBundle("metadataTypes"); - metadataTypeContainer.reset(new MetadataTypeContainer(metadataBundle)); - metadataTypeContainer->configure( - *dynamic_cast(nodes.front()) ); - - // configure the KeyboardShortcutList - nodes = element.get_children( - KeyboardShortcutList::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no keyboardShortcutList element"); - } - keyboardShortcutList.reset(new KeyboardShortcutList); - keyboardShortcutList->configure( - *dynamic_cast(nodes.front()) ); - - // save the configuration so we can modify it later - // TODO: move configuration code to the OptionsContainer class? - Ptr::Ref configFileName(new Glib::ustring); - configFileName->append(Glib::get_home_dir()); - configFileName->append(configFileDirStr); - mkdir(configFileName->c_str(), 0700); // create dir if does not exist - configFileName->append(configFileNameStr); - optionsContainer.reset(new OptionsContainer(element, configFileName)); - - // read the test audio file location - nodes = element.get_children(testAudioUrlConfigElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no test audio url element"); - } - const xmlpp::Element* testAudioUrlElement - = dynamic_cast(nodes.front()); - testAudioUrl.reset(new Glib::ustring( - testAudioUrlElement->get_attribute("path") - ->get_value() )); - - // read the serial port's file name - nodes = element.get_children(serialPortConfigElementName); - if (nodes.size() < 1) { - Ptr::Ref serialDevice(new const Glib::ustring( - serialPortDefaultDevice)); - optionsContainer->setOptionItem(OptionsContainer::serialDeviceName, - serialDevice); - } -} - - -/*------------------------------------------------------------------------------ - * Configure the list of supported languages - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: configSupportedLanguages(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - xmlpp::Node::NodeList nodes; - xmlpp::Node::NodeList::iterator begin; - xmlpp::Node::NodeList::iterator end; - - supportedLanguages.reset(new LanguageMap()); - - // read the list of supported languages - nodes = element.get_children(languageElementName); - begin = nodes.begin(); - end = nodes.end(); - - while (begin != end) { - xmlpp::Element * elem = (xmlpp::Element *) *begin; - xmlpp::Attribute * localeAttr = elem->get_attribute(localeAttrName); - xmlpp::Attribute * nameAttr = elem->get_attribute(nameAttrName); - - std::string locale = localeAttr->get_value().raw(); - Glib::ustring name = nameAttr->get_value(); - - supportedLanguages->insert(std::make_pair(name, locale)); - - begin++; - } -} - - -/*------------------------------------------------------------------------------ - * Check all configured resources - *----------------------------------------------------------------------------*/ -bool -LiveSupport :: GLiveSupport :: -GLiveSupport :: checkConfiguration(void) throw () -{ - // === FATAL ERRORS === - - // first, check if resources are available for all configured languages - LanguageMap::iterator it = supportedLanguages->begin(); - try { - LanguageMap::iterator end = supportedLanguages->end(); - while (it != end) { - changeLocale((*it).second); - ++it; - } - changeLocale(""); - } catch (std::invalid_argument &e) { - Ptr::Ref language(new Glib::ustring((*it).first)); - Ptr::Ref uLanguage = ustringToUnicodeString(language); - Ptr::Ref msg = formatMessage(localeNotAvailableKey, - (*it).first); - displayMessageWindow(*msg); - - changeLocale(""); - return false; - } - - // check if the authentication server is available - try { - authentication->getVersion(); - } catch (XmlRpcException &e) { - displayAuthenticationServerMissingMessage(); - return false; - } - - // === NON-FATAL ERRORS === - - // check if the storage server is available - try { - storage->getVersion(); - storageAvailable = true; - } catch (XmlRpcException &e) { - storageAvailable = false; - displayMessageWindow(*getResourceUstring(storageNotReachableKey)); - } - - // no need to check the widget factory - - // check the scheduler client - checkSchedulerClient(); - if (!isSchedulerAvailable()) { - displayMessageWindow(*getResourceUstring(schedulerNotReachableKey)); - } - - // TODO: check the audio player? - - return true; -} - - -/*------------------------------------------------------------------------------ - * Display a message window. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: displayMessageWindow(const Glib::ustring & message) - throw () -{ - runOkDialog(message); -} - - -/*------------------------------------------------------------------------------ - * Run a dialog window with No and Yes buttons. - *----------------------------------------------------------------------------*/ -Gtk::ResponseType -LiveSupport :: GLiveSupport :: -GLiveSupport :: runNoYesDialog(const Glib::ustring & message) - throw () -{ - return runDialog("noYesDialog", message); -} - - -/*------------------------------------------------------------------------------ - * Run a dialog window with just an OK button. - *----------------------------------------------------------------------------*/ -Gtk::ResponseType -LiveSupport :: GLiveSupport :: -GLiveSupport :: runOkDialog(const Glib::ustring & message) - throw () -{ - return runDialog("okDialog", message); -} - - -/*------------------------------------------------------------------------------ - * Run a dialog window. - *----------------------------------------------------------------------------*/ -Gtk::ResponseType -LiveSupport :: GLiveSupport :: -GLiveSupport :: runDialog(const Glib::ustring & dialogName, - const Glib::ustring & message) - throw () -{ - Gtk::Dialog * dialog; - Gtk::Label * dialogLabel; - glade->get_widget(dialogName + "1", dialog); - glade->get_widget(dialogName + "Label1", dialogLabel); - - Glib::ustring formattedMessage = ""; - formattedMessage += message; - formattedMessage += ""; - dialogLabel->set_label(formattedMessage); - - Gtk::ResponseType response = Gtk::ResponseType(dialog->run()); - dialog->hide(); - return response; -} - - -/*------------------------------------------------------------------------------ - * Show the main window. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: show(void) throw () -{ - masterPanel.reset(new MasterPanelWindow()); - - masterPanel->getWindow()->set_icon_list(taskbarIcons->getIconList()); - masterPanel->getWindow()->set_default_icon_list( - taskbarIcons->getIconList()); - - // Shows the window and returns when it is closed. - Gtk::Main::run(*masterPanel->getWindow()); - - masterPanel.reset(); -} - - -/*------------------------------------------------------------------------------ - * Change the language of the application - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: changeLanguage(Ptr::Ref locale) - throw (std::invalid_argument) -{ - changeLocale(*locale); - - metadataTypeContainer->setBundle(getBundle("metadataTypes")); - - if (masterPanel.get()) { - masterPanel->changeLanguage(); - } -} - - -/*------------------------------------------------------------------------------ - * Authenticate the user - *----------------------------------------------------------------------------*/ -bool -LiveSupport :: GLiveSupport :: -GLiveSupport :: login(const std::string & login, - const std::string & password) throw () -{ - try { - sessionId = authentication->login(login, password); - } catch (XmlRpcException &e) { - return false; - } - - userName.reset(new Glib::ustring(login)); - - Ptr::Ref editedPlaylistToken; - Ptr::Ref editedPlaylistTokenString; - try { - editedPlaylistToken = authentication->loadPreferencesItem( - sessionId, - editedPlaylistTokenKey); - editedPlaylistTokenString.reset(new const std::string( - *editedPlaylistToken )); - } catch (std::invalid_argument &e) { - // no stuck playlist token found; that's OK - } catch (XmlRpcException &e) { - std::cerr << "Problem loading " - << editedPlaylistTokenKey - << " user preference item:" - << std::endl - << e.what(); - } - - if (editedPlaylistTokenString) { - try { - storage->revertPlaylist(editedPlaylistTokenString); - } catch (XmlRpcException &e) { - // sometimes this throws; we don't care - } - - try { - authentication->deletePreferencesItem(sessionId, - editedPlaylistTokenKey); - } catch (XmlRpcException &e) { - std::cerr << "Problem deleting " - << editedPlaylistTokenKey - << " user preference item at login:" - << std::endl - << e.what(); - } - } - - loadWindowPositions(); - - return true; -} - - -/*------------------------------------------------------------------------------ - * Log the user out. - *----------------------------------------------------------------------------*/ -bool -LiveSupport :: GLiveSupport :: -GLiveSupport :: logout(void) throw () -{ - if (!sessionId) { - return false; - } - - if (!masterPanel->cancelEditedPlaylist()) { - return false; // do nothing if the user presses the cancel button - } - - stopCueAudio(); - masterPanel->showAnonymousUI(); - - storeWindowPositions(); - windowPositions.clear(); - - try { - authentication->logout(sessionId); - } catch (XmlRpcException &e) { - std::cerr << "error in GLiveSupport::logout: " - << e.what() << std::endl; - } - sessionId.reset(); - - return true; -} - - -/*------------------------------------------------------------------------------ - * Store the contents of a window as a user preference - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: storeWindowContents(ContentsStorable * window) - throw () -{ - Ptr::Ref userPreferencesKey - = window->getUserPreferencesKey(); - Ptr::Ref windowContents - = window->getContents(); - - try { - authentication->savePreferencesItem(sessionId, - *userPreferencesKey, - windowContents); - } catch (XmlRpcException &e) { - // TODO: signal error - std::cerr << "error saving user preferences: " - << e.what() - << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Load the contents of a window from a user preference - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: loadWindowContents(ContentsStorable * window) - throw () -{ - Ptr::Ref userPreferencesKey - = window->getUserPreferencesKey(); - Ptr::Ref windowContents; - - try { - windowContents = authentication->loadPreferencesItem( - sessionId, - *userPreferencesKey); - } catch (XmlRpcException &e) { - // TODO: signal error - std::cerr << "error loading user preferences: " << e.what() - << std::endl; - return; - } catch (std::invalid_argument &e) { - // no preferences stored for this user yet; no problem - return; - } - - window->setContents(windowContents); -} - - -/*------------------------------------------------------------------------------ - * Open an audio clip, and put it into the internal cache of the GLiveSupport - * object. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: getAudioClip(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref clip; - - AudioClipMap::iterator it = openedAudioClips->find(id->getId()); - if (it != openedAudioClips->end()) { - clip = it->second; - } else { - clip = storage->getAudioClip(sessionId, id); - (*openedAudioClips)[id->getId()] = clip; - } - - return clip; -} - - -/*------------------------------------------------------------------------------ - * Acquire an audio clip, and put it into the internal cache of - * the GLiveSupport object. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: acquireAudioClip(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref clip; - - AudioClipMap::iterator it = openedAudioClips->find(id->getId()); - if (it != openedAudioClips->end()) { - clip = it->second; - } - - if (!clip || !clip->getToken()) { - clip = storage->acquireAudioClip(sessionId, id); - (*openedAudioClips)[id->getId()] = clip; - } - - return clip; -} - - -/*------------------------------------------------------------------------------ - * Open an playlist, and put it into the internal cache of the GLiveSupport - * object. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: getPlaylist(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref playlist; - - PlaylistMap::iterator it = openedPlaylists->find(id->getId()); - if (it != openedPlaylists->end()) { - playlist = it->second; - } else { - playlist = storage->getPlaylist(sessionId, id); - (*openedPlaylists)[id->getId()] = playlist; - } - - return playlist; -} - - -/*------------------------------------------------------------------------------ - * Acquire an playlist, and put it into the internal cache of - * the GLiveSupport object. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: acquirePlaylist(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref playlist; - - PlaylistMap::iterator it = openedPlaylists->find(id->getId()); - if (it != openedPlaylists->end()) { - playlist = it->second; - } - - if (!playlist || !playlist->getUri()) { - playlist = storage->acquirePlaylist(sessionId, id); - (*openedPlaylists)[id->getId()] = playlist; - } - - return playlist; -} - - -/*------------------------------------------------------------------------------ - * Open a Playable object. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: getPlayable(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref playable; - - if (existsPlaylist(id)) { - playable = getPlaylist(id); - - } else if (existsAudioClip(id)) { - playable = getAudioClip(id); - - } else { - throw XmlRpcInvalidArgumentException( - "invalid ID in GLiveSupport::getPlayable"); - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Acquire a Playable object. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: acquirePlayable(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref playable; - - if (existsPlaylist(id)) { - playable = acquirePlaylist(id); - - } else if (existsAudioClip(id)) { - playable = acquireAudioClip(id); - - } else { - throw XmlRpcInvalidArgumentException( - "invalid ID in GLiveSupport::acquirePlayable"); - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Remove a playlist from the playlist cache. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: uncachePlaylist(Ptr::Ref id) - throw (XmlRpcException) -{ - Ptr::Ref playlist; - PlaylistMap::iterator it; - PlaylistMap::iterator end = openedPlaylists->end(); - - if ((it = openedPlaylists->find(id->getId())) != end) { - playlist = (*openedPlaylists)[id->getId()]; - if (playlist->getUri()) { - storage->releasePlaylist(playlist); - } - - openedPlaylists->erase(it); - } -} - - -/*----------------------------------------------------------------------------- - * Release all opened audio clips. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: releaseOpenedAudioClips(void) throw (XmlRpcException) -{ - AudioClipMap::iterator it = openedAudioClips->begin(); - AudioClipMap::iterator end = openedAudioClips->end(); - - while (it != end) { - Ptr::Ref clip = it->second; - - if (clip->getToken().get()) { - storage->releaseAudioClip(clip); - } - - ++it; - } - - openedAudioClips->clear(); -} - - -/*------------------------------------------------------------------------------ - * Release all opened playlists. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: releaseOpenedPlaylists(void) throw (XmlRpcException) -{ - PlaylistMap::iterator it = openedPlaylists->begin(); - PlaylistMap::iterator end = openedPlaylists->end(); - - while (it != end) { - Ptr::Ref playlist = it->second; - - if (playlist->getUri()) { - storage->releasePlaylist(playlist); - } - - ++it; - } - - openedPlaylists->clear(); -} - - -/*------------------------------------------------------------------------------ - * Upload an audio clip to the local storage. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: uploadAudioClip(Ptr::Ref audioClip) - throw (XmlRpcException) -{ - storage->storeAudioClip(sessionId, audioClip); - - // this will also add it to the local cache - addToScratchpad(audioClip); -} - - -/*------------------------------------------------------------------------------ - * Upload a playlist archive to the local storage. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: uploadPlaylistArchive(Ptr::Ref path) - throw (XmlRpcException) -{ - Ptr::Ref id = storage->importPlaylist(sessionId, path); - Ptr::Ref playlist = storage->getPlaylist(sessionId, id); - - // this will also add it to the local cache - addToScratchpad(playlist); - - return playlist; -} - - -/*------------------------------------------------------------------------------ - * Add a file to the Scratchpad, and update it. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: addToScratchpad(Ptr::Ref playable) - throw (XmlRpcException) -{ - if (playable->getType() == Playable::AudioClipType) { - acquireAudioClip(playable->getId()); - } else if (playable->getType() == Playable::PlaylistType) { - acquirePlaylist(playable->getId()); - } - - // this will also add it to the local cache - masterPanel->updateScratchpadWindow(playable); -} - - -/*------------------------------------------------------------------------------ - * Add a file to the Live Mode, and update it. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: addToLiveMode(Ptr::Ref playable) - throw () -{ - masterPanel->updateLiveModeWindow(playable); -} - - -/*------------------------------------------------------------------------------ - * Display the playable item on the master panel as "now playing". - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: setNowPlaying(Ptr::Ref playable) - throw () -{ - // test needed: this gets called indirectly from ~MasterPanelWindow - if (masterPanel) { - masterPanel->setNowPlaying(playable); - } -} - - -/*------------------------------------------------------------------------------ - * Open a playlist for editing. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: openPlaylistForEditing(Ptr::Ref playlistId) - throw (XmlRpcException) -{ - if (masterPanel->cancelEditedPlaylist() == false) { - return; // the user canceled the operation - } - - if (!playlistId.get()) { - playlistId = storage->createPlaylist(sessionId); - } else { - uncachePlaylist(playlistId); - } - - editedPlaylist = storage->editPlaylist(sessionId, playlistId); - editedPlaylist->setMetadata(userName, "dc:creator"); - - try { - Ptr::Ref editToken(new const Glib::ustring( - *editedPlaylist->getEditToken() )); - authentication->savePreferencesItem(sessionId, - editedPlaylistTokenKey, - editToken); - } catch (XmlRpcException &e) { - std::cerr << "Problem saving " - << editedPlaylistTokenKey - << " user preference item:" - << std::endl - << e.what(); - } - - editedPlaylist->createSavedCopy(); - - masterPanel->updatePlaylistWindow(); -} - - -/*------------------------------------------------------------------------------ - * Cancel the edited playlist: undo changes and release the lock. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: cancelEditedPlaylist(void) - throw (XmlRpcException) -{ - if (editedPlaylist) { - if (editedPlaylist->isLocked()) { - editedPlaylist->revertToSavedCopy(); - storage->savePlaylist(sessionId, editedPlaylist); - try { - authentication->deletePreferencesItem(sessionId, - editedPlaylistTokenKey); - } catch (XmlRpcException &e) { - std::cerr << "Problem deleting " - << editedPlaylistTokenKey - << " user preference item at cancel:" - << std::endl - << e.what(); - } - } - editedPlaylist.reset(); - } -} - - -/*------------------------------------------------------------------------------ - * Add a playlist to the currently edited playlist - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: addToPlaylist(Ptr::Ref id) - throw (XmlRpcException) -{ - if (!editedPlaylist.get()) { - openPlaylistForEditing(); - } - - // append the appropriate playable object to the end of the playlist - if (existsPlaylist(id)) { - Ptr::Ref playlist = getPlaylist(id); - editedPlaylist->addPlaylist(playlist, editedPlaylist->getPlaylength()); - } else if (existsAudioClip(id)) { - Ptr::Ref clip = getAudioClip(id); - Ptr::Ref elid = editedPlaylist->addAudioClip(clip, editedPlaylist->getPlaylength()); - - //TODO: for testing only!!!!!!!!! -// editedPlaylist->setClipStart(elid, Ptr::Ref(new time_duration(seconds(5)))); -// editedPlaylist->setClipEnd(elid, Ptr::Ref(new time_duration(seconds(10)))); - } - - masterPanel->updatePlaylistWindow(); - emitSignalEditedPlaylistModified(); -} - - -/*------------------------------------------------------------------------------ - * Save the currently edited playlist in storage - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: savePlaylist(void) - throw (XmlRpcException) -{ - if (editedPlaylist) { - if (editedPlaylist->isLocked()) { - editedPlaylist->deleteSavedCopy(); - storage->savePlaylist(sessionId, editedPlaylist); - try { - authentication->deletePreferencesItem(sessionId, - editedPlaylistTokenKey); - } catch (XmlRpcException &e) { - std::cerr << "Problem deleting " - << editedPlaylistTokenKey - << " user preference item at save:" - << std::endl - << e.what(); - } - // update with new version - // this will also add it to the local cache - uncachePlaylist(editedPlaylist->getId()); - addToScratchpad(editedPlaylist); - refreshPlaylistInLiveMode(editedPlaylist); - } - editedPlaylist.reset(); - } -} - - -/*------------------------------------------------------------------------------ - * Schedule a playlist, then show the scheduler at that timepoint - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: schedulePlaylist(Ptr::Ref playlist, - Ptr::Ref playtime) - throw (XmlRpcException) -{ - scheduler->uploadPlaylist(sessionId, playlist->getId(), playtime); - masterPanel->updateSchedulerWindow(playtime); -} - - -/*------------------------------------------------------------------------------ - * Remove a scheduled entry. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: removeFromSchedule(Ptr::Ref scheduleEntryId) - throw (XmlRpcException) -{ - // for some weird reason, the schedule functions won't accept - // Ptr::Ref, just a non-const version - Ptr::Ref seid(new UniqueId(scheduleEntryId->getId())); - - scheduler->removeFromSchedule(sessionId, seid); -} - - -/*------------------------------------------------------------------------------ - * Preload the item in the output audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: preload(Ptr::Ref playable) - throw () -{ - Ptr::Ref uri = playable->getUri(); - if (uri) { - try { - outputPlayer->preload(*uri); - - } catch (std::invalid_argument) { - std::cerr << "gLiveSupport: invalid argument in preload(" - << *uri - << ")" << std::endl; - } catch (std::runtime_error) { - std::cerr << "gLiveSupport: runtime error in preload(" - << *uri - << ")" << std::endl; - } - } -} - - -/*------------------------------------------------------------------------------ - * Play a Playable object using the output audio player. - *----------------------------------------------------------------------------*/ -bool -LiveSupport :: GLiveSupport :: -GLiveSupport :: playOutputAudio(Ptr::Ref playable) - throw (std::logic_error, - std::runtime_error) -{ - try { - switch (playable->getType()) { - case Playable::AudioClipType: - outputItemPlayingNow = acquireAudioClip(playable->getId()); - if(false == outputPlayer->open(*outputItemPlayingNow->getUri(), (gint64)outputItemPlayingNow->getId()->getId(), 0L)) - { - return false; - } - outputPlayer->start(); - std::cerr << "gLiveSupport: Live Mode playing audio clip '" - << *playable->getTitle() - << "'" << std::endl; - break; - - case Playable::PlaylistType: - outputItemPlayingNow = acquirePlaylist(playable->getId()); - outputPlayer->open(*outputItemPlayingNow->getUri(), (gint64)outputItemPlayingNow->getId()->getId(), 0L); - outputPlayer->start(); - std::cerr << "gLiveSupport: Live Mode playing playlist '" - << *playable->getTitle() - << "'" << std::endl; - break; - - default: // this never happens - break; - } - } catch (XmlRpcException &e) { - Ptr::Ref eMsg - = getResourceUstring("audioErrorMsg"); - eMsg->append("\n"); - eMsg->append(e.what()); - displayMessageWindow(*eMsg); - throw std::runtime_error(e.what()); - } catch (std::invalid_argument &e) { - Ptr::Ref eMsg - = getResourceUstring("audioErrorMsg"); - eMsg->append("\n"); - eMsg->append(e.what()); - displayMessageWindow(*eMsg); - throw std::runtime_error(e.what()); - } catch (std::runtime_error &e) { - Ptr::Ref eMsg - = getResourceUstring("audioErrorMsg"); - eMsg->append("\n"); - eMsg->append(e.what()); - displayMessageWindow(*eMsg); - throw std::runtime_error(e.what()); - } - - outputPlayerIsPaused = false; - return true; -} - - -/*------------------------------------------------------------------------------ - * Pause the output audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: pauseOutputAudio(void) - throw (std::logic_error) -{ - if (!outputPlayerIsPaused && outputPlayer->isPlaying()) { - outputPlayer->pause(); - outputPlayerIsPaused = true; - - } else if (outputPlayerIsPaused) { - outputPlayer->start(); - outputPlayerIsPaused = false; - } -} - - -/*------------------------------------------------------------------------------ - * Stop the output audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: stopOutputAudio(void) - throw (std::logic_error) -{ - if (outputItemPlayingNow) { - outputPlayerIsPaused = false; - outputItemPlayingNow.reset(); - - Ptr::Ref nullPointer; - setNowPlaying(nullPointer); - - outputPlayer->close(); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the "output audio player has stopped" event. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: onStop(Ptr::Ref errorMessage) - throw () -{ - outputItemPlayingNow.reset(); - try { - outputPlayer->close(); - - Ptr::Ref playable = masterPanel->getNextItemToPlay(); - setNowPlaying(playable); - if (playable) { - playOutputAudio(playable); - } - } catch (std::logic_error) { - std::cerr << "logic_error caught in GLiveSupport::onStop()\n"; - std::exit(1); - } - - if (errorMessage) { - displayMessageWindow(*errorMessage); - } -} - -/*------------------------------------------------------------------------------ - * Event handler for the "output audio player has started" event. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: onStart(gint64 id) - throw () -{ - masterPanel->setCurrentInnerPlayable(id); -} - - -/*------------------------------------------------------------------------------ - * Play a Playable object using the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: playCueAudio(Ptr::Ref playable) - throw (std::logic_error, - std::runtime_error) -{ - if (cueItemPlayingNow) { - stopCueAudio(); // stop the audio player and - } // release old resources - - try { - switch (playable->getType()) { - case Playable::AudioClipType: - cueItemPlayingNow = acquireAudioClip(playable->getId()); - cuePlayer->open(*cueItemPlayingNow->getUri(), (gint64)cueItemPlayingNow->getId()->getId(), 0L); - cuePlayer->start(); - std::cerr << "gLiveSupport: Cue playing audio clip '" - << *playable->getTitle() - << "'" << std::endl; - break; - - case Playable::PlaylistType: - cueItemPlayingNow = acquirePlaylist(playable->getId()); - cuePlayer->open(*cueItemPlayingNow->getUri(), (gint64)cueItemPlayingNow->getId()->getId(), 0L); - cuePlayer->start(); - std::cerr << "gLiveSupport: Cue playing playlist '" - << *playable->getTitle() - << "'" << std::endl; - break; - - default: // this never happens - break; - } - } catch (XmlRpcException &e) { - Ptr::Ref eMsg - = getResourceUstring("audioErrorMsg"); - eMsg->append("\n"); - eMsg->append(e.what()); - displayMessageWindow(*eMsg); - throw std::runtime_error(e.what()); - } catch (std::invalid_argument &e) { - Ptr::Ref eMsg - = getResourceUstring("audioErrorMsg"); - eMsg->append("\n"); - eMsg->append(e.what()); - displayMessageWindow(*eMsg); - throw std::runtime_error(e.what()); - } catch (std::runtime_error &e) { - Ptr::Ref eMsg - = getResourceUstring("audioErrorMsg"); - eMsg->append("\n"); - eMsg->append(e.what()); - displayMessageWindow(*eMsg); - throw std::runtime_error(e.what()); - } - - cuePlayerIsPaused = false; -} - - -/*------------------------------------------------------------------------------ - * Pause the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: pauseCueAudio(void) - throw (std::logic_error) -{ - if (!cuePlayerIsPaused && cuePlayer->isPlaying()) { - cuePlayer->pause(); - cuePlayerIsPaused = true; - - } else if (cuePlayerIsPaused) { - cuePlayer->start(); - cuePlayerIsPaused = false; - } -} - - -/*------------------------------------------------------------------------------ - * Stop the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: stopCueAudio(void) - throw (std::logic_error) -{ - if (cueItemPlayingNow) { - cuePlayer->close(); - cuePlayerIsPaused = false; - cueItemPlayingNow.reset(); - - // test needed: this gets called indirectly from ~MasterPanelWindow - if (masterPanel) { - masterPanel->showCuePlayerStopped(); - } - } -} - - -/*------------------------------------------------------------------------------ - * Attach a listener for the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: attachCueAudioListener(AudioPlayerEventListener * listener) - throw () -{ - cuePlayer->attachListener(listener); -} - - -/*------------------------------------------------------------------------------ - * Detach the listener for the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: detachCueAudioListener(AudioPlayerEventListener * listener) - throw (std::invalid_argument) -{ - cuePlayer->detachListener(listener); -} - - -/*------------------------------------------------------------------------------ - * Return an image containing the radio station logo. - *----------------------------------------------------------------------------*/ -Glib::RefPtr -LiveSupport :: GLiveSupport :: -GLiveSupport :: getStationLogoPixbuf(void) throw() -{ - return stationLogoPixbuf; -} - - -/*------------------------------------------------------------------------------ - * Get the localized name of the keyboard shortcut action. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: getLocalizedKeyboardActionName( - Ptr::Ref actionName) - throw (std::invalid_argument) -{ - return getResourceUstring("keyboardShortcuts", actionName->c_str()); -} - - -/*------------------------------------------------------------------------------ - * Get the localized name of the window. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveSupport :: GLiveSupport :: -GLiveSupport :: getLocalizedWindowName( - Ptr::Ref windowName) - throw (std::invalid_argument) -{ - return getResourceUstring(windowName->c_str(), "windowTitle"); -} - - -/*------------------------------------------------------------------------------ - * Save the position and size of the window. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: putWindowPosition(const GuiWindow * window) - throw () -{ - WindowPositionType pos; - window->getWindow()->get_position(pos.x, pos.y); - window->getWindow()->get_size(pos.width, pos.height); - - windowPositions[replaceSpaces(window->getTitle())] = pos; -} - - -/*------------------------------------------------------------------------------ - * Apply saved position and size data to the window. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: getWindowPosition(GuiWindow * window) - throw () -{ - WindowPositionsListType::const_iterator it = windowPositions.find( - replaceSpaces(window->getTitle())); - if (it != windowPositions.end()) { - WindowPositionType pos = it->second; - window->getWindow()->move(pos.x, pos.y); - window->getWindow()->resize(pos.width, pos.height); - } -} - - -/*------------------------------------------------------------------------------ - * Replace spaces with underscore characters. - *----------------------------------------------------------------------------*/ -Glib::ustring -LiveSupport :: GLiveSupport :: -GLiveSupport :: replaceSpaces(Ptr::Ref string) - throw () -{ - Glib::ustring copy = *string; - - for (unsigned int i = 0; i < copy.size(); ++i) { - if (copy[i] == ' ') { - copy.replace(i, 1, 1, '_'); - } - } - - return copy; -} - - -/*------------------------------------------------------------------------------ - * Store the saved window positions. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: storeWindowPositions(void) throw () -{ - // just store this as a space-delimited list of window names and numbers - std::ostringstream prefsString; - WindowPositionsListType::iterator it; - WindowPositionsListType::iterator end; - WindowPositionType pos; - - it = windowPositions.begin(); - end = windowPositions.end(); - while (it != end) { - prefsString << it->first << " "; - pos = it->second; - prefsString << pos.x << " " - << pos.y << " " - << pos.width << " " - << pos.height << " "; - ++it; - } - - Ptr::Ref prefsUstring(new Glib::ustring(prefsString.str())); - try { - authentication->savePreferencesItem(sessionId, - windowPositionsKey, - prefsUstring); - } catch (XmlRpcException &e) { - // TODO: signal error - std::cerr << "error saving user preferences: " << e.what() << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Load the window positions. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: loadWindowPositions(void) throw () -{ - Ptr::Ref prefsUstring; - - try { - prefsUstring = authentication->loadPreferencesItem(sessionId, - windowPositionsKey); - } catch (XmlRpcException &e) { - // TODO: signal error - std::cerr << "error loading user preferences: " << e.what() - << std::endl; - return; - } catch (std::invalid_argument &e) { - // no window positions were stored for this user yet; no problem - return; - } - - // load the prefs, which is a space-delimited list - std::istringstream prefsString(prefsUstring->raw()); - - while (!prefsString.eof()) { - Glib::ustring windowName; - prefsString >> windowName; - if (prefsString.fail()) { - break; - } - - WindowPositionType pos; - prefsString >> pos.x; - if (prefsString.fail()) { - continue; - } - prefsString >> pos.y; - if (prefsString.fail()) { - continue; - } - prefsString >> pos.width; - if (prefsString.fail()) { - continue; - } - prefsString >> pos.height; - if (prefsString.fail()) { - continue; - } - - windowPositions[windowName] = pos; - } -} - - -/*------------------------------------------------------------------------------ - * Set the device for the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: setCueAudioDevice(Ptr::Ref deviceName) - throw () -{ - cuePlayer->setAudioDevice(*deviceName); -} - - -/*------------------------------------------------------------------------------ - * Play a test sound on the cue audio player. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: playTestSoundOnCue(Ptr::Ref oldDevice, - Ptr::Ref newDevice) - throw () -{ - if (cueItemPlayingNow) { - stopCueAudio(); // stop the audio player and - } // release old resources - - try { - if (cuePlayer->isOpen()) { - if (cuePlayer->isPlaying()) { - cuePlayer->stop(); - } - cuePlayer->close(); - } - cuePlayer->setAudioDevice(*newDevice); - cuePlayer->open(*testAudioUrl, 0L, 0L); - cuePlayer->start(); - Ptr::Ref sleepT(new time_duration(microseconds(10))); - while (cuePlayer->isPlaying()) { - runMainLoop(); - TimeConversion::sleep(sleepT); - } - } catch (std::runtime_error &e) { - // "invalid device" error from open(); do nothing - } catch (std::logic_error &e) { - // some other error; do nothing - } - cuePlayer->close(); - cuePlayer->setAudioDevice(*oldDevice); -} - - -/*------------------------------------------------------------------------------ - * Check if the scheduler is available. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: checkSchedulerClient(void) throw () -{ - try { - scheduler->getVersion(); - schedulerAvailable = true; - if (masterPanel) { - masterPanel->setSchedulerAvailable(true); - } - } catch (XmlRpcException &e) { - schedulerAvailable = false; - if (masterPanel) { - masterPanel->setSchedulerAvailable(false); - } - } -} - - -/*------------------------------------------------------------------------------ - * Start the scheduler daemon. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: startSchedulerClient(void) throw () -{ - system(schedulerDaemonStartCommand->c_str()); -} - - -/*------------------------------------------------------------------------------ - * Stop the scheduler daemon. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: stopSchedulerClient(void) throw () -{ - system(schedulerDaemonStopCommand->c_str()); -} - - -/*------------------------------------------------------------------------------ - * Upload a Playable object to the network hub. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: uploadToHub(Ptr::Ref playable) - throw () -{ - masterPanel->uploadToHub(playable); -} - - -/*------------------------------------------------------------------------------ - * Display a message that the authentication server is not available. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: displayAuthenticationServerMissingMessage(void) throw () -{ - // "authentication not available -- would you like to edit the options?" - Gtk::ResponseType answer = runNoYesDialog(*getResourceUstring( - "authenticationNotReachableMsg")); - - if (answer == Gtk::RESPONSE_YES) { -/* DISABLED TEMPORARILY - Ptr::Ref optionsWindow(new OptionsWindow( - shared_from_this(), - getBundle("optionsWindow"), - 0, - gladeDir)); - optionsWindow->run(); - - if (optionsContainer->isTouched()) { - optionsContainer->writeToFile(); - } -*/ - } -} - - -/*------------------------------------------------------------------------------ - * Refresh the playlist in the Live Mode window. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: refreshPlaylistInLiveMode(Ptr::Ref playlist) - throw () -{ - masterPanel->refreshPlaylistInLiveMode(playlist); -} - - -/*------------------------------------------------------------------------------ - * Preload the Scratchpad window during login. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: createScratchpadWindow(void) - throw () -{ - if (masterPanel) { - masterPanel->createScratchpadWindow(); - } -} - - -/*------------------------------------------------------------------------------ - * Write a string to the serial device. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: writeToSerial(Ptr::Ref message) - throw () -{ - Ptr::Ref - serialDevice = optionsContainer->getOptionItem( - OptionsContainer::serialDeviceName); - try { - // TODO: move this to a separate class, and make it configurable - serialStream->Open(*serialDevice); - serialStream->SetBaudRate(LibSerial::SerialStreamBuf::BAUD_2400); - serialStream->SetCharSize(LibSerial::SerialStreamBuf::CHAR_SIZE_8); - serialStream->SetNumOfStopBits(1); - serialStream->SetParity(LibSerial::SerialStreamBuf::PARITY_NONE); - serialStream->SetFlowControl( - LibSerial::SerialStreamBuf::FLOW_CONTROL_NONE); - (*serialStream) << *message; - serialStream->flush(); - serialStream->Close(); - } catch (...) { - // TODO: handle this somehow - std::cerr << "IO error in GLiveSupport::writeToSerial()" << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Replace the placeholders in the RDS settings with the current values. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: substituteRdsData(Ptr::Ref rdsString) - throw () -{ - Ptr::Ref playable = masterPanel->getCurrentInnerPlayable(); - - // these substitutions are documented in the doxygen docs of the - // public updateRds() function - substituteRdsItem(rdsString, "%c", playable, "dc:creator"); - substituteRdsItem(rdsString, "%t", playable, "dc:title"); - substituteRdsItem(rdsString, "%d", playable, "dc:format:extent"); - substituteRdsItem(rdsString, "%s", playable, "dc:source"); - substituteRdsItem(rdsString, "%y", playable, "ls:year"); -} - - -/*------------------------------------------------------------------------------ - * Replace a single placeholders in the RDS settings. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: substituteRdsItem(Ptr::Ref rdsString, - const std::string & placeholder, - Ptr::Ref playable, - const std::string & metadataKey) - throw () -{ - size_t pos; - while ((pos = rdsString->find(placeholder)) != std::string::npos) { - Ptr::Ref value; - if (playable) { - value = playable->getMetadata(metadataKey); - } - if (!value) { - value.reset(new Glib::ustring("")); - } - rdsString->replace(pos, placeholder.length(), *value); - } -} - - -/*------------------------------------------------------------------------------ - * Read the RDS settings, and send them to the serial port. - *----------------------------------------------------------------------------*/ -void -LiveSupport :: GLiveSupport :: -GLiveSupport :: updateRds(void) throw () -{ - Ptr::Ref - rdsString = optionsContainer->getCompleteRdsString(); - if (rdsString) { - substituteRdsData(rdsString); - writeToSerial(rdsString); - } -} - diff --git a/src/products/gLiveSupport/src/GLiveSupport.h b/src/products/gLiveSupport/src/GLiveSupport.h deleted file mode 100644 index 8779aff39..000000000 --- a/src/products/gLiveSupport/src/GLiveSupport.h +++ /dev/null @@ -1,1429 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GLiveSupport_h -#define GLiveSupport_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/LocalizedConfigurable.h" -#include "LiveSupport/Core/MetadataTypeContainer.h" -#include "LiveSupport/Core/OptionsContainer.h" -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/SchedulerClient/SchedulerClientInterface.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "LiveSupport/Widgets/WidgetFactory.h" -#include "KeyboardShortcutList.h" -#include "TaskbarIcons.h" -#include "ContentsStorable.h" -#include "GuiWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::SchedulerClient; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::Widgets; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - - -class MasterPanelWindow; - - -/** - * The main application object for the gLiveSupport GUI. - * - * The configuration file for this object is based on configuration - * elements used by the object. The DTD for the root element of the - * configuration file is: - * - *

- *  
- *  
- * - * These elements configure objects of the same name, except for - * outputPlayer and cuePlayer, which configure two instances of - * AudioPlayerFactory; and stationLogo, which is just a path to the - * station logo image file. - * - * @see LocalizedObject#getBundle(const xmlpp::Element &) - * @see AuthenticationClientFactory - * @see StorageClientFactory - * @see SchedulerClientFactory - */ -class GLiveSupport : public LocalizedConfigurable, - public boost::enable_shared_from_this, - public AudioPlayerEventListener -{ - public: - - /** - * A type for the map of supported languages. - * This is an STL map, containing const Glib::ustring as keys, which - * are the language name of supported langauges. The values are - * const std::string, the names of the locales for the languages. - */ - typedef std::map LanguageMap; - - /** - * A type for having a map of AudioClip objects, with using - * the ids of the objects as keys. - */ - typedef std::map::Ref> AudioClipMap; - - /** - * A type for having a map of Playlist objects, with using - * the ids of the objects as keys. - */ - typedef std::map::Ref> PlaylistMap; - - - private: - - /** - * The name of the configuration XML elmenent used by this class. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The authentication client used by the application. - */ - Ptr::Ref authentication; - - /** - * The storage client used by the application. - */ - Ptr::Ref storage; - - /** - * The directory where the Glade files are. - */ - Glib::ustring gladeDir; - - /** - * The Glade object, containing the visual design. - * For this class, it only contains some pop-up windows. - */ - Glib::RefPtr glade; - - /** - * The widget factory, containing our own widgets. - */ - Ptr::Ref widgetFactory; - - /** - * The scheduler client, used to access the scheduler daemon. - */ - Ptr::Ref scheduler; - - /** - * The output audio player. - */ - Ptr::Ref outputPlayer; - - /** - * The cue audio player. - */ - Ptr::Ref cuePlayer; - - /** - * The user id for the logged-in user. - */ - Ptr::Ref userName; - - /** - * The session id for the logged-in user. - */ - Ptr::Ref sessionId; - - /** - * The map of supported languages. - */ - Ptr::Ref supportedLanguages; - - /** - * The container for all the possible metadata types. - */ - Ptr::Ref metadataTypeContainer; - - /** - * The master panel window. - */ - Ptr::Ref masterPanel; - - /** - * A map, holding references to all AudioClip objects that are - * opened. - */ - Ptr::Ref openedAudioClips; - - /** - * A map, holding references to all Playlist objects that are - * opened. - */ - Ptr::Ref openedPlaylists; - - /** - * The one and only playlist that may be edited at any one time. - */ - Ptr::Ref editedPlaylist; - - /** - * The playlist or audio clip that is being played on the - * live mode output sound card (may be null). - */ - Ptr::Ref outputItemPlayingNow; - - /** - * The playlist or audio clip that is being played on the - * cue (preview) sound card (may be null). - */ - Ptr::Ref cueItemPlayingNow; - - /** - * True if the output audio player has been paused. - */ - bool outputPlayerIsPaused; - - /** - * True if the cue audio player has been paused. - */ - bool cuePlayerIsPaused; - - /** - * The raw image containing the station logo. - */ - Glib::RefPtr stationLogoPixbuf; - - /** - * The wrapper class containing the taskbar icon images. - */ - Ptr::Ref taskbarIcons; - - /** - * The location of the test audio file. - */ - Ptr::Ref testAudioUrl; - - /** - * The command which starts the scheduler daemon. - */ - Ptr::Ref schedulerDaemonStartCommand; - - /** - * The command which stops the scheduler daemon. - */ - Ptr::Ref schedulerDaemonStopCommand; - - /** - * The serial stream object. - */ - Ptr::Ref serialStream; - - /** - * Read a supportedLanguages configuration element, - * and fill the supportedLanguages map with its contents. - * - * @param element a supportedLanguages element - * @exception std::invalid_argument if the supplied XML element - * is wrong - */ - void - configSupportedLanguages(const xmlpp::Element & element) - throw (std::invalid_argument); - - /** - * Emit the "edited playlist has been modified" signal. - */ - void - emitSignalEditedPlaylistModified(void) throw () - { - signalEditedPlaylistModified().emit(); - } - - /** - * Remove a playlist from the playlist cache. - * The playlist will be released, if it has been acquired earlier. - * If the playlist wasn't in the cache, nothing happens. - * - * @param id the id of the playlist to remove. - */ - void - uncachePlaylist(Ptr::Ref id) - throw (XmlRpcException); - - /** - * The list of keyboard shortcuts for the various windows. - */ - Ptr::Ref keyboardShortcutList; - - /** - * The type for a single window position. - */ - typedef struct { - int x; - int y; - int width; - int height; - } WindowPositionType; - /** - * The type for storing the window positions. - */ - typedef std::map - WindowPositionsListType; - - /** - * The positions of the various windows. - */ - WindowPositionsListType windowPositions; - - /** - * An object containing the contents of the options file. - */ - Ptr::Ref optionsContainer; - - /** - * Whether the storage component is available. - */ - bool storageAvailable; - - /** - * Whether the scheduler component is available. - */ - bool schedulerAvailable; - - /** - * Private constructor. - */ - GLiveSupport(void) throw () - : outputPlayerIsPaused(false), - cuePlayerIsPaused(false) - { - openedAudioClips.reset(new AudioClipMap()); - openedPlaylists.reset(new PlaylistMap()); - serialStream.reset(new LibSerial::SerialStream()); - } - - /** - * Display a message that the authentication server is not available. - * And offer a chance to edit the options to fix it. - */ - void - displayAuthenticationServerMissingMessage(void) throw (); - - /** - * Refresh the playlist in the Live Mode window. - * Updates the playlist to the new copy supplied in the argument, - * if it is present in the Live Mode window. - * This is called by savePlaylist() after the playlist has been - * edited. - * - * @param playlist the new version of the playlist. - */ - void - refreshPlaylistInLiveMode(Ptr::Ref playlist) - throw (); - - /** - * Replace the placeholders in the RDS settings with the - * current values. - * - * @param rdsString the string with the placeholders; - * they will be replaced in place. - */ - void - substituteRdsData(Ptr::Ref rdsString) - throw (); - - /** - * Replace a single placeholders in the RDS settings. - * If the corresponding metadata is not found, an empty string - * is substituted instead. - * - * @param rdsString the string with the placeholders; - * they will be replaced in place. - * @param placeholder the string to be substituted, e.g. "%t". - * @param playable the Playable object whose data is to be used. - * @param metadataKay the kind of metadata to be substituted. - */ - void - substituteRdsItem(Ptr::Ref rdsString, - const std::string & placeholder, - Ptr::Ref playable, - const std::string & metadataKey) - throw (); - - /** - * Write a string to the serial device. - */ - void - writeToSerial(Ptr::Ref message) throw (); - - /** - * Replace spaces with underscore characters. - * - * @param string the original string, eg: "one two three". - * @return the new string, eg: "one_two_three". - */ - Glib::ustring - replaceSpaces(Ptr::Ref string) throw (); - - /** - * Run a dialog window. - * - * @param dialogName the type of the dialog; can be "noYesDialog" - * or "okDialog". - * @param message the text to be displayed by the dialog. - * @return the response ID returned by the dialog. - */ - Gtk::ResponseType - runDialog(const Glib::ustring & dialogName, - const Glib::ustring & message) throw (); - - - protected: - - /** - * A signal object to notify people that the edited playlist changed. - */ - sigc::signal signalEditedPlaylistModifiedObject; - - - public: - - /** - * Virtual destructor. - */ - virtual - ~GLiveSupport(void) throw () - { - if (outputPlayer.get()) { - outputPlayer->deInitialize(); - } - if (cuePlayer.get()) { - cuePlayer->deInitialize(); - } - try { - releaseOpenedAudioClips(); - } catch (XmlRpcException &e) { - } - try { - releaseOpenedPlaylists(); - } catch(XmlRpcException &e) { - } - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the scheduler daemon based on the XML element - * supplied. - * - * @param element the XML element to configure the scheduler - * daemon from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured. - */ - void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * A function to check the configuration of this object. - * Checks all resources configured by configure() - * - * @retun true if all resources are accessible and working, - * false otherwise - */ - bool - checkConfiguration(void) throw (); - - /** - * Display a message window. - * This function only returns after the message window is closed. - * - * @param message the message to display - */ - void - displayMessageWindow(const Glib::ustring & message) - throw (); - - /** - * Run a dialog window with No and Yes buttons. - * - * @param message the text to be displayed by the dialog. - * @return the response ID returned by the dialog. - */ - Gtk::ResponseType - runNoYesDialog(const Glib::ustring & message) throw (); - - /** - * Run a dialog window with just an OK button. - * - * @param message the text to be displayed by the dialog. - * @return the response ID returned by the dialog. - */ - Gtk::ResponseType - runOkDialog(const Glib::ustring & message) throw (); - - /** - * Show the main window, and run the application. - * This call will only return after the main window has been closed. - */ - void - show(void) throw (); - - /** - * Change the language of the application. - * - * @param locale the new locale of the appliction. - * @exception std::invalid_argument if the specified locale is not - * available - */ - void - changeLanguage(Ptr::Ref locale) - throw (std::invalid_argument); - - /** - * Perform authentication for the user of the application. - * As a result, the user will be authenticated for later - * actions, that need authentication. - * The user has to be logged out later. - * - * @param login the login ID of the user - * @param password the password of the user - * @return true if the authentication was successful, - * false otherwise - * @see #logout - */ - bool - login(const std::string & login, - const std::string & password) throw (); - - /** - * Return the session id for the user. - * - * @return the session id for the user, if he has been already - * successfully authenticated with a call to login(), - * and not yet logged out. - * otherwise, a reference to 0. - * @see #login - */ - Ptr::Ref - getSessionId(void) const throw () - { - return sessionId; - } - - /** - * Log out the user, if he has been authenticated previously - * with a successful call to login(). - * - * @return true if the logout was successful, false if not - * (e.g., if the user is editing a playlist, and - * presses "cancel" at the "Save playlist?" dialog.) - * @see #logout - */ - bool - logout(void) throw (); - - /** - * Accessor function to the scheduler client held by this object. - * - * @return the scheduler client held by this object. - */ - Ptr::Ref - getScheduler(void) throw () - { - return scheduler; - } - - /** - * Get the map of supported languages. - * - * @return the map of supported languages. - */ - Ptr::Ref - getSupportedLanguages(void) const throw () - { - return supportedLanguages; - } - - /** - * Return a container with all supported metadata types. - * - * @return the metadata type container - */ - Ptr::Ref - getMetadataTypeContainer(void) const throw () - { - return metadataTypeContainer; - } - - /** - * Upload an audio clip to the storage. - * - * @param audioClip the audio clip to upload. - * @exception XmlRpcException on upload failures. - */ - void - uploadAudioClip(Ptr::Ref audioClip) - throw (XmlRpcException); - - /** - * Upload a playlist archive to the storage. - * - * @param path the path of the file to upload. - * @exception XmlRpcException on upload failures. - */ - Ptr::Ref - uploadPlaylistArchive(Ptr::Ref path) - throw (XmlRpcException); - - /** - * Add an item to the Scratchpad, and update it. - * If the item is already in the scratchpad, it gets pushed to the top. - * - * @param playable the audio clip or playlist to be added - */ - void - addToScratchpad(Ptr::Ref playable) - throw (XmlRpcException); - - /** - * Reset the storage behind GLiveSupport. - * Used for testing only. - * - * @exception XmlRpcException on communication problems. - */ - void - resetStorage(void) throw (XmlRpcException) - { - storage->reset(); - } - - /** - * Tell if an audio clip specified by an id exists. - * - * @param id the id of the audio clip to check for. - * @return true if the audio clip by the specified id exists, - * false otherwise. - * @exception XmlRpcException on communication problems. - */ - bool - existsAudioClip(Ptr::Ref id) throw (XmlRpcException) - { - return storage->existsAudioClip(sessionId, id); - } - - /** - * Open an audio clip, for reading only. - * The audio clip will be put into the internal cache of the - * GLiveSupport object. - * - * @param id the audio clip id. - * @return the audio clip opened. - * @exception XmlRpcException if no audio clip with the specified - * id exists, or there was a communication problem. - */ - Ptr::Ref - getAudioClip(Ptr::Ref id) - throw (XmlRpcException); - - /** - * Acquire an audio clip, for random file access. - * The audio clip will be put into the internal cache of the - * GLiveSupport object. - * - * @param id the audio clip id. - * @return the AudioClip acquired. - * note that the returned AudioClip does not have to be - * released, this will be done by the caching system - * automatically. - * @exception XmlRpcException if no audio clip with the specified - * id exists, or there was a communication problem. - */ - Ptr::Ref - acquireAudioClip(Ptr::Ref id) - throw (XmlRpcException); - - /** - * Tell if a playlist specified by an id exists. - * - * @param id the id of the playlist to check for. - * @return true if the playlist by the specified id exists, - * false otherwise. - * @exception XmlRpcException on communication problems. - */ - bool - existsPlaylist(Ptr::Ref id) throw (XmlRpcException) - { - return storage->existsPlaylist(sessionId, id); - } - - /** - * Open a playlist, for reading only. - * The playlist will be put into the internal cache of the - * GLiveSupport object. - * - * @param id the playlist id. - * @return the playlist opened. - * @exception XmlRpcException if no playlist with the specified - * id exists, or there was a communication problem. - */ - Ptr::Ref - getPlaylist(Ptr::Ref id) - throw (XmlRpcException); - - /** - * Acquire a playlist, for random file access. - * The playlist will be put into the internal cache of the - * GLiveSupport object. - * - * @param id the playlist id. - * @return the playlist acquired. - * note that the returned Playlist does not have to be - * released, this will be done by the caching system - * automatically. - * @exception XmlRpcException if no playlist with the specified - * id exists, or there was a communication problem. - */ - Ptr::Ref - acquirePlaylist(Ptr::Ref id) - throw (XmlRpcException); - - /** - * Tell if a playable object specified by an id exists. - * - * @param id the id of the playable to check for. - * @return true if the playable by the specified id exists, - * false otherwise. - * @exception XmlRpcException on communication problems. - */ - bool - existsPlayable(Ptr::Ref id) throw (XmlRpcException) - { - return storage->existsAudioClip(sessionId, id) - || storage->existsPlaylist(sessionId, id); - } - - /** - * Open a playable object, for reading only. - * Calls either getAudioClip() or getPlaylist(). - * You do not need to release the returned Playable object. - * - * @param id the id of the playable object. - * @return the playable object opened. - * @exception XmlRpcException if no Playable with the specified - * id exists, or there was a communication problem. - */ - Ptr::Ref - getPlayable(Ptr::Ref id) - throw (XmlRpcException); - - /** - * Acquire a playable object. - * Calls either acquireAudioClip() or acquirePlaylist(). - * - * @param id the id of the playable object. - * @return the playable object acquired. - * note that the returned Playable does not have to be - * released, this will be done by the caching system - * automatically. - * @exception XmlRpcException if no Playable with the specified - * id exists, or there was a communication problem. - */ - Ptr::Ref - acquirePlayable(Ptr::Ref id) - throw (XmlRpcException); - - /** - * Release all opened audio clips. - */ - void - releaseOpenedAudioClips(void) throw (XmlRpcException); - - /** - * Release all opened playlists. - */ - void - releaseOpenedPlaylists(void) throw (XmlRpcException); - - /** - * Add a file to the Live Mode, and update it. - * - * @param playable the audio clip or playlist to be added - */ - void - addToLiveMode(Ptr::Ref playable) throw (); - - /** - * Return the currently edited playlist. - * - * @return the currenlty edited playlist, or a reference to 0 - * if no playlist is edited - */ - Ptr::Ref - getEditedPlaylist(void) throw () - { - return editedPlaylist; - } - - /** - * Create a new playlist or Open a playlist for editing. - * The opened playlist can be later accessed by getEditedPlaylist(). - * Always release the opened playlist by calling - * releaseEditedPlaylist(). - * - * If the argument is 0, a new playlist is created in the storage. - * - * After a call to this function, getEditedPlaylist() is guaranteed - * to return a non-0 value. - * - * If there is a playlist being edited, the - * PlaylistWindow's confirmation message is displayed. - * If the user presses "Cancel", then this function does nothing. - * - * @param playlistId the id of the playlist to open for editing. - * if a reference to 0, create a new playlist. - * @return the new playlist object, which is opened for editing. - * @exception XmlRpcException on XMl-RPC errors. - * @see #getEditedPlaylist - * @see #releaseEditedPlaylist - */ - void - openPlaylistForEditing( - Ptr::Ref playlistId - = Ptr::Ref()) - throw (XmlRpcException); - - /** - * Add a playable item to the currently open playlist. - * If there is no currently open playlist, open the simple playlist - * management window with a new playlist, holding only this one - * entry. - * Always release the opened playlist by calling - * releaseEditedPlaylist() - * - * @param id the id of the playable object to add to the playlist. - * @exception XmlRpcException on XMl-RPC errors. - * @see #releaseEditedPlaylist - */ - void - addToPlaylist(Ptr::Ref id) - throw (XmlRpcException); - /** - * Save the currently edited playlist in storage. - * This call has to be preceeded by a call to openPlaylistForEditing() - * or addToPlaylist(). - * After this call, the playlist is no longer being edited. If you - * want to continue editing, open the playlist for editing again. - * - * @exception XmlRpcException on upload failures. - * @see #openPlaylistForEditing - * @see #addToPlaylist - */ - void - savePlaylist(void) throw (XmlRpcException); - - /** - * Cancel the edited playlist: undo changes and release the lock. - * - * @exception XmlRpcException on XML-RPC errors. - * @see #openPlaylistForEditing - */ - void - cancelEditedPlaylist(void) throw (XmlRpcException); - - /** - * Return the scheduled entries for a specified time interval. - * - * @param from the start of the interval, inclusive - * @param to the end of the interval, exclusive - * @return a vector of the schedule entries for the time period. - * @exception XmlRpcException in case of XML-RPC errors. - */ - virtual Ptr::Ref> >::Ref - displaySchedule(Ptr::Ref from, - Ptr::Ref to) - throw (XmlRpcException) - { -std::cout << "calling GLiveSupport :: displaySchedule !!!!!!!!!!!!!!!!!" << std::endl; - return scheduler->displaySchedule(sessionId, from, to); - } - - /** - * Schedule a playlist. - * This will schedule the plalyist, and show the scheduler window - * at the time of the scheduled playlist. - * - * @param playlist the playlist to schedule. - * @param playtime the time for when to schedule. - * @exception XmlRpcException in case of XML-RPC errors. - */ - virtual void - schedulePlaylist(Ptr::Ref playlist, - Ptr::Ref playtime) - throw (XmlRpcException); - - - /** - * Remove a scheduled item. - * - * @param sessionId a valid, authenticated session id. - * @param scheduledEntryId the id of the scheduled entry to remove. - * @exception XmlRpcException in case of XML-RPC errors. - */ - virtual void - removeFromSchedule(Ptr::Ref scheduleEntryId) - throw (XmlRpcException); - - /** - * Preload the item in the output audio player. - * This is to shorten the time a playlist takes to start. - * - * @param playable the Playable object to be preloaded. - */ - void - preload(Ptr::Ref playable) - throw (); - - /** - * Play a Playable object using the output audio player. - * - * @param playable the Playable object to play. - * @exception std::logic_error in case of audio player errors. - * @exception std::runtime_error in case of audio player errors. - */ - virtual bool - playOutputAudio(Ptr::Ref playable) - throw (std::logic_error, - std::runtime_error); - - /** - * Stop the output audio player. - * - * @exception std::logic_error in case of audio player errors. - */ - virtual void - stopOutputAudio(void) - throw (std::logic_error); - - /** - * Pause the output audio player. - * - * @exception std::logic_error in case of audio player errors. - */ - virtual void - pauseOutputAudio(void) - throw (std::logic_error); - - /** - * Determine the time elapsed in the current Playable object - * played by the output audio player. - * - * @return the current time position in the currently open - * Playable object. - * @exception std::logic_error if there is no Playable object open. - */ - virtual Ptr::Ref - getOutputAudioPosition(void) - throw (std::logic_error) - { - return outputPlayer->getPosition(); - } - - /** - * Play a Playable object using the cue audio player. - * - * @param playable the Playable object to play. - * @exception std::logic_error in case of audio player errors. - * @exception std::runtime_error in case of audio player errors. - */ - virtual void - playCueAudio(Ptr::Ref playable) - throw (std::logic_error, - std::runtime_error); - - /** - * Stop the cue audio player. - * - * @exception XmlRpcException in case of storage server errors. - * @exception std::logic_error in case of audio player errors. - */ - virtual void - stopCueAudio(void) - throw (std::logic_error); - - /** - * Pause the cue audio player. - * - * @exception std::logic_error in case of audio player errors. - */ - virtual void - pauseCueAudio(void) - throw (std::logic_error); - - /** - * Attach a listener for the cue audio player (the listener - * will be notified when the cue audio player has stopped playing). - * - * @param listener the event listener to register. - */ - void - attachCueAudioListener(AudioPlayerEventListener * listener) - throw (); - - /** - * Detach the listener for the cue audio player. - * - * @param listener the event listener to unregister. - * @exception std::invalid_argument if the supplied event listener - * has not been previously registered. - */ - void - detachCueAudioListener(AudioPlayerEventListener * listener) - throw (std::invalid_argument); - - /** - * Set the device for the cue audio player. - * - * @param deviceName the name of the new device - */ - void - setCueAudioDevice(Ptr::Ref deviceName) - throw (); - - /** - * Play a test sound on the cue audio player. - * - * @param oldDevice the name of the current audio device. - * @param oldDevice the name of the audio device to be tested. - */ - void - playTestSoundOnCue(Ptr::Ref oldDevice, - Ptr::Ref newDevice) - throw (); - - /** - * Search in the local storage. - * Note that the return value (number of items found) will not be - * the same as the size of getSearchResults() if the limit and offset - * fields in the criteria parameter are not zero. - * - * @param criteria the search conditions to use. - * @return the number of audio clips and playlists found. - * @exception XmlRpcException thrown by - * StorageClientInterface::search() - */ - int - search(Ptr::Ref criteria) - throw (XmlRpcException); - - /** - * Event handler for the "output audio player has stopped" event. - * - * @param errorMessage is a 0 pointer if the player stopped normally - */ - virtual void - onStop(Ptr::Ref errorMessage - = Ptr::Ref()) - throw (); - - /** - * Event handler for the "output audio player has started" event. - * - * @param fileName - */ - virtual void - onStart(gint64 id) - throw (); - - /** - * Display the playable item on the master panel as "now playing". - */ - void - setNowPlaying(Ptr::Ref playable) - throw (); - - /** - * Return a pixbuf containing the radio station logo. - * - * @return a pixbuf containing the station logo image. - */ - Glib::RefPtr - getStationLogoPixbuf() throw (); - - /** - * The signal raised when the edited playlist is modified. - * - * @return the signal object (a protected member of this class) - */ - sigc::signal - signalEditedPlaylistModified(void) throw () - { - return signalEditedPlaylistModifiedObject; - } - - /** - * Find the action triggered by the given key in the given window. - * - * @param windowName a string identifying the window (not localized). - * @param modifiers the gdktypes code for the Shift, Ctrl etc. - * modifier keys which are pressed. - * @param key the gdkkeysyms code for the key pressed. - * @return the associated action; or noAction, if none is found. - */ - KeyboardShortcut::Action - findAction(const Glib::ustring & windowName, - Gdk::ModifierType modifiers, - guint key) const throw () - { - return keyboardShortcutList->findAction(windowName, modifiers, key); - } - - /** - * The list of all KeyboardShortcutContainer objects. - * Used in the Key bindings section of the OptionsWindow class. - * - * @return a const pointer to the list (implemented as a std::map). - */ - Ptr::Ref - getKeyboardShortcutList(void) throw () - { - return keyboardShortcutList; - } - - /** - * Get the localized name of the window. - * Used in the Key bindings section of the OptionsWindow class. - * - * @param windowName the name of the window. - * @return the localized name. - * @exception std::invalid_argument if the resource bundle is - * not found - */ - Ptr::Ref - getLocalizedWindowName(Ptr::Ref windowName) - throw (std::invalid_argument); - - /** - * Get the localized name of the keyboard shortcut action. - * Used in the Key bindings section of the OptionsWindow class. - * - * @param actionName the name of the action. - * @return the localized name. - * @exception std::invalid_argument if the resource bundle is - * not found - * @see KeyboardShortcut::getActionString() - */ - Ptr::Ref - getLocalizedKeyboardActionName( - Ptr::Ref actionName) - throw (std::invalid_argument); - - /** - * Save the position and size of the window. - * - * The coordinates of the window's North-West corner and the - * size of the window are read, and stored in a variable of the - * GLiveSupport object, indexed by the window's get_name(). - * - * @param window the window to save the position and size of. - * @see getWindowPosition() - */ - void - putWindowPosition(const GuiWindow * window) throw (); - - /** - * Apply saved position and size data to the window. - * - * If position and size data were previously saved for a window - * with the same get_name(), then these data are read and applied to - * the window, restoring its position and size. - * - * @param window the window to apply the position and size info to. - * @see putWindowPosition() - */ - void - getWindowPosition(GuiWindow * window) throw (); - - /** - * Store the saved window positions. - * - * The window positions (and sizes) are stored in a user preference - * item. This is called when the user logs out. - * - * @see loadWindowPositions() - */ - void - storeWindowPositions(void) throw (); - - /** - * Load the window positions. - * - * The window positions (and sizes) are retrieved from the user - * preference item they were stored in. This is called when the - * user logs in. - * - * @see storeWindowPosition() - */ - void - loadWindowPositions(void) throw (); - - /** - * Access the OptionsContainer object containing the options. - */ - Ptr::Ref - getOptionsContainer(void) throw() - { - return optionsContainer; - } - - /** - * Store the contents of a window as a user preference. - * - * @param window the window to get the contents of. - */ - void - storeWindowContents(Ptr::Ref window) - throw () - { - storeWindowContents(window.get()); - } - - /** - * Load the contents of a window as a user preference. - * - * @param window the window to restore the contents of. - */ - void - loadWindowContents(Ptr::Ref window) - throw () - { - loadWindowContents(window.get()); - } - - /** - * Store the contents of a window as a user preference. - * - * @param window the window to get the contents of. - */ - void - storeWindowContents(ContentsStorable * window) throw (); - - /** - * Load the contents of a window as a user preference. - * - * @param window the window to restore the contents of. - */ - void - loadWindowContents(ContentsStorable * window) throw (); - - /** - * Return whether the storage component is available. - */ - bool - isStorageAvailable(void) throw() - { - return storageAvailable; - } - - /** - * Return whether the scheduler component is available. - */ - bool - isSchedulerAvailable(void) throw() - { - return schedulerAvailable; - } - - /** - * Access the StorageClientInterface object. - */ - Ptr::Ref - getStorageClient(void) throw() - { - return storage; - } - - /** - * Check if the scheduler is available. - * This updates the schedulerAvailable variable accordingly. - */ - void - checkSchedulerClient(void) throw(); - - /** - * Start the scheduler client. - */ - void - startSchedulerClient(void) throw(); - - /** - * Stop the scheduler client. - */ - void - stopSchedulerClient(void) throw(); - - /** - * Upload a Playable object to the network hub. - * - * This opens the Transports tab in the Search window, and adds the - * new upload task to it. - * - * @param playable the audio clip or playlist to be uploaded. - */ - void - uploadToHub(Ptr::Ref playable) throw (); - - /** - * Take a break. - * This will perform all pending redraws, by giving the control back - * to the main loop for a while. - * Call this occasionally in the middle of long computations, to - * make sure your window gets redrawn. - */ - void - runMainLoop(void) throw () - { - while (Gtk::Main::events_pending()) { - Gtk::Main::iteration(); - } - } - - /** - * Preload the Scratchpad window during login. - */ - void - createScratchpadWindow(void) throw (); - - /** - * Read the RDS settings, and send them to the serial port. - * - * The following RDS placeholders will be substituted: - * - *
    - *
  • "%c" ---> "dc:creator" (Creator)
  • - *
  • "%t" ---> "dc:title" (Title)
  • - *
  • "%d" ---> "dc:format:extent" (Duration)
  • - *
  • "%s" ---> "dc:source" (Album)
  • - *
  • "%y" ---> "ls:year" (Year)
  • - *
- * - * @see substituteRdsData() - */ - void - updateRds(void) throw (); - - /** - * Return the directory where the Glade files are. - * - * @return the directory where the Glade files are. - */ - Glib::ustring - getGladeDir(void) throw () - { - return gladeDir; - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // GLiveSupport_h - diff --git a/src/products/gLiveSupport/src/GLiveSupportTest.cxx b/src/products/gLiveSupport/src/GLiveSupportTest.cxx deleted file mode 100644 index 22702f0b6..000000000 --- a/src/products/gLiveSupport/src/GLiveSupportTest.cxx +++ /dev/null @@ -1,324 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_SYS_TYPES_H -#include -#else -#error "Need sys/types.h" -#endif - -#if HAVE_PWD_H -#include -#else -#error "Need pwd.h" -#endif - - -#include -#include -#include - -#include - -#include "LiveSupport/Core/TimeConversion.h" - -#include "GLiveSupportTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(GLiveSupportTest); - -namespace { - -/** - * The name of the generic configuration file for the GLiveSupport object. - */ -const std::string gLiveSupportEtcConfigFileName - = "etc/campcaster-studio.xml"; - -/** - * The name of the user-specific configuration file for the - * GLiveSupport object, relative to the user's home directory. - */ -const std::string gLiveSupportUserConfigFileName - = "/.campcaster/campcaster-studio.xml"; - -/** - * The login name. - */ -const std::string login = "root"; - -/** - * The password. - */ -const std::string password = "q"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Gtk::Main kit(0, 0); - - gLiveSupport = GLiveSupport::getInstance(); - - uid_t uid = getuid(); - struct passwd * pwd = getpwuid(uid); - std::string configFileName; - std::ifstream ifs; - - configFileName = pwd->pw_dir; - configFileName += gLiveSupportUserConfigFileName; - ifs.open(configFileName.c_str()); - if (!ifs.is_open() || ifs.bad()) { - ifs.close(); - ifs.clear(); - ifs.open(gLiveSupportEtcConfigFileName.c_str()); - } - - try { - Ptr::Ref parser(new xmlpp::DomParser()); - parser->parse_stream(ifs); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - - gLiveSupport->configure(*root); - - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in audio player configuration file: " - << e.what() << std::endl; - } catch (xmlpp::exception &e) { - std::cerr << "syntax error in audio player configuration file: " - << e.what() << std::endl; - } - ifs.close(); - - CPPUNIT_ASSERT_NO_THROW( - gLiveSupport->resetStorage(); - ); - - if (!gLiveSupport->login(login, password)) { - std::cerr << "gLiveSupport unable to log in" << std::endl; - } - - CPPUNIT_ASSERT_NO_THROW( - storage = gLiveSupport->getStorageClient(); - ); - CPPUNIT_ASSERT(storage); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: tearDown(void) throw () -{ - gLiveSupport->logout(); - - gLiveSupport.reset(); -} - - -/*------------------------------------------------------------------------------ - * Test to see if the audio player engine can be started and stopped - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref sessionId; - - sessionId = gLiveSupport->getSessionId(); - CPPUNIT_ASSERT(sessionId.get()); -} - - -/*------------------------------------------------------------------------------ - * Open an audio clip object. - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: openAudioClipTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref id; - Ptr::Ref clip; - - CPPUNIT_ASSERT(sampleData()->size() >= 7); - id = sampleData()->at(6)->getId(); - - try { - clip = gLiveSupport->getAudioClip(id); - CPPUNIT_ASSERT(clip.get()); - CPPUNIT_ASSERT(!clip->getToken().get()); - clip = gLiveSupport->getAudioClip(id); - CPPUNIT_ASSERT(clip.get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - gLiveSupport->releaseOpenedAudioClips(); - - try { - clip = gLiveSupport->getAudioClip(id); - CPPUNIT_ASSERT(clip.get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Acquire an audio clip object. - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: acquireAudioClipTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref id; - Ptr::Ref clip; - - CPPUNIT_ASSERT(sampleData()->size() >= 7); - id = sampleData()->at(6)->getId(); - - try { - clip = gLiveSupport->acquireAudioClip(id); - CPPUNIT_ASSERT(clip.get()); - CPPUNIT_ASSERT(clip->getToken().get()); - // for a subsequent open call, returned the acquired clip again - clip = gLiveSupport->getAudioClip(id); - CPPUNIT_ASSERT(clip.get()); - CPPUNIT_ASSERT(clip->getToken().get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - gLiveSupport->releaseOpenedAudioClips(); - - try { - clip = gLiveSupport->acquireAudioClip(id); - CPPUNIT_ASSERT(clip.get()); - CPPUNIT_ASSERT(clip->getToken().get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Open a playlist object. - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: openPlaylistTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref id; - Ptr::Ref playlist; - - CPPUNIT_ASSERT(sampleData()->size() >= 2); - id = sampleData()->at(1)->getId(); - - try { - playlist = gLiveSupport->getPlaylist(id); - CPPUNIT_ASSERT(playlist.get()); - CPPUNIT_ASSERT(!playlist->getUri().get()); - playlist = gLiveSupport->getPlaylist(id); - CPPUNIT_ASSERT(playlist.get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - gLiveSupport->releaseOpenedPlaylists(); - - try { - playlist = gLiveSupport->getPlaylist(id); - CPPUNIT_ASSERT(playlist.get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Acquire a playlist object. - *----------------------------------------------------------------------------*/ -void -GLiveSupportTest :: acquirePlaylistTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref id; - Ptr::Ref playlist; - - CPPUNIT_ASSERT(sampleData()->size() >= 2); - id = sampleData()->at(1)->getId(); - - try { - playlist = gLiveSupport->acquirePlaylist(id); - CPPUNIT_ASSERT(playlist.get()); - CPPUNIT_ASSERT(playlist->getUri().get()); - // for a subsequent open call, returned the acquired playlist again - playlist = gLiveSupport->getPlaylist(id); - CPPUNIT_ASSERT(playlist.get()); - CPPUNIT_ASSERT(playlist->getUri().get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } - - gLiveSupport->releaseOpenedPlaylists(); - - try { - playlist = gLiveSupport->acquirePlaylist(id); - CPPUNIT_ASSERT(playlist.get()); - CPPUNIT_ASSERT(playlist->getUri().get()); - } catch (XmlRpcException &e) { - CPPUNIT_FAIL(e.what()); - } -} - diff --git a/src/products/gLiveSupport/src/GLiveSupportTest.h b/src/products/gLiveSupport/src/GLiveSupportTest.h deleted file mode 100644 index d320e9d86..000000000 --- a/src/products/gLiveSupport/src/GLiveSupportTest.h +++ /dev/null @@ -1,170 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GLiveSupportTest_h -#define GLiveSupportTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Core/BaseTestMethod.h" - -#include "GLiveSupport.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Testing the GLiveSupport class - * - * @see GLiveSupport - */ -class GLiveSupportTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(GLiveSupportTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(openAudioClipTest); - CPPUNIT_TEST(acquireAudioClipTest); - CPPUNIT_TEST(openPlaylistTest); - CPPUNIT_TEST(acquirePlaylistTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The GLiveSupport object we're testing. - */ - Ptr::Ref gLiveSupport; - - /** - * The storage object we get from gLiveSupport. - */ - Ptr::Ref storage; - - /** - * Get the list of test Playable objects. - * This gets the result of the latest "local search", which in - * this case is reset(), which loads the sample data into the - * local storage. - * - * @return a list of Playable items loaded by reset(). - */ - Ptr::Ref - sampleData(void) throw () - { - return storage->getLocalSearchResults(); - } - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Open an audio clip. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - openAudioClipTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Acquire an audio clip. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - acquireAudioClipTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Open a playlist. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - openPlaylistTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Acquire a playlist. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - acquirePlaylistTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // GLiveSupportTest_h - diff --git a/src/products/gLiveSupport/src/GuiComponent.cxx b/src/products/gLiveSupport/src/GuiComponent.cxx deleted file mode 100644 index a1b7a02c8..000000000 --- a/src/products/gLiveSupport/src/GuiComponent.cxx +++ /dev/null @@ -1,71 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision: 3204 $ - Location : $URL: svn://code.campware.org/campcaster/trunk/campcaster/src/products/gLiveSupport/src/GuiComponent.cxx $ - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GLiveSupport.h" -#include "GuiComponent.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Protected constructor. - *----------------------------------------------------------------------------*/ -GuiComponent :: GuiComponent (GuiObject * parent, - const Glib::ustring & bundleName) - throw () - : GuiObject(), - parent(parent) -{ - if (bundleName == "") { - setBundle(parent->getBundle()); - } else { - setBundle(gLiveSupport->getBundle(bundleName)); - } - - glade = parent->getGlade(); -} - diff --git a/src/products/gLiveSupport/src/GuiComponent.h b/src/products/gLiveSupport/src/GuiComponent.h deleted file mode 100644 index 8a356101c..000000000 --- a/src/products/gLiveSupport/src/GuiComponent.h +++ /dev/null @@ -1,102 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GuiComponent_h -#define GuiComponent_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GuiObject.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The common ancestor of all window components in the GUI. - * These are non-standalone sub-windows, like the AdvancedSearchEntry, and - * sub-widgets of those, like the AdvancedSearchItem. - * - */ -class GuiComponent : public GuiObject -{ - protected: - - /** - * The parent object. - */ - GuiObject * parent; - - /** - * Protected constructor. - * - * @param parent the GuiObject which contains this one. - * @param bundleName the name of the localization resource bundle - * (optional); if missing, the parent's bundle - * is used. - */ - GuiComponent(GuiObject * parent, - const Glib::ustring & bundleName = "") - throw (); - - - public: - - /** - * Virtual destructor. - */ - virtual - ~GuiComponent(void) throw () - { - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // GuiComponent_h - diff --git a/src/products/gLiveSupport/src/GuiObject.cxx b/src/products/gLiveSupport/src/GuiObject.cxx deleted file mode 100644 index 0744b558b..000000000 --- a/src/products/gLiveSupport/src/GuiObject.cxx +++ /dev/null @@ -1,57 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GLiveSupport.h" -#include "GuiObject.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Protected constructor. - *----------------------------------------------------------------------------*/ -GuiObject :: GuiObject (void) - throw () - : LocalizedObject() -{ - gLiveSupport = GLiveSupport::getInstance(); -} - diff --git a/src/products/gLiveSupport/src/GuiObject.h b/src/products/gLiveSupport/src/GuiObject.h deleted file mode 100644 index dd633d5f4..000000000 --- a/src/products/gLiveSupport/src/GuiObject.h +++ /dev/null @@ -1,112 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GuiObject_h -#define GuiObject_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/LocalizedObject.h" - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -class GLiveSupport; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The common ancestor of all windows and sub-windows in the GUI. - * - */ -class GuiObject : public LocalizedObject -{ - protected: - - /** - * The GLiveSupport object, holding the state of the application. - */ - Ptr::Ref gLiveSupport; - - /** - * The Glade object, containing the visual design. - */ - Glib::RefPtr glade; - - /** - * Protected constructor. - */ - GuiObject(void) throw (); - - - public: - - /** - * Virtual destructor. - */ - virtual - ~GuiObject(void) throw () - { - } - - /** - * Get the Glade object. - */ - virtual Glib::RefPtr - getGlade(void) const throw () - { - return glade; - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // GuiObject_h - diff --git a/src/products/gLiveSupport/src/GuiWindow.cxx b/src/products/gLiveSupport/src/GuiWindow.cxx deleted file mode 100644 index 20008bc69..000000000 --- a/src/products/gLiveSupport/src/GuiWindow.cxx +++ /dev/null @@ -1,156 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GLiveSupport.h" -#include "GuiWindow.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/** - * The name of the application, shown on the task bar. - */ -const Glib::ustring applicationTitle = "Campcaster"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Protected constructor. - *----------------------------------------------------------------------------*/ -GuiWindow :: GuiWindow (const Glib::ustring & bundleName, - const Glib::ustring & gladeFileName, - Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiObject(), - windowOpenerButton(windowOpenerButton) -{ - setBundle(gLiveSupport->getBundle(bundleName)); - - glade = Gnome::Glade::Xml::create(gLiveSupport->getGladeDir() + - gladeFileName); - - glade->get_widget("mainWindow1", mainWindow); - setTitle(getResourceUstring("windowTitle")); - - mainWindow->signal_delete_event().connect(sigc::mem_fun(*this, - &GuiWindow::onDeleteEvent)); -} - - -/*------------------------------------------------------------------------------ - * Restore the window position and show the window. - *----------------------------------------------------------------------------*/ -void -GuiWindow :: show (void) throw () -{ - if (!mainWindow->is_visible()) { - preShow(); - mainWindow->show(); - } -} - - -/*------------------------------------------------------------------------------ - * Stuff to do before showing the window. - *----------------------------------------------------------------------------*/ -void -GuiWindow :: preShow (void) throw () -{ - gLiveSupport->getWindowPosition(this); - if (windowOpenerButton) { - windowOpenerButton->set_active(true); - } -} - - -/*------------------------------------------------------------------------------ - * Save the window position and hide the window. - *----------------------------------------------------------------------------*/ -void -GuiWindow :: hide (void) throw () -{ - if (mainWindow->is_visible()) { - preHide(); - mainWindow->hide(); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the close button getting clicked. - *----------------------------------------------------------------------------*/ -bool -GuiWindow :: onDeleteEvent (GdkEventAny * event) throw () -{ - preHide(); - return false; -} - - -/*------------------------------------------------------------------------------ - * Stuff to do before hiding the window. - *----------------------------------------------------------------------------*/ -void -GuiWindow :: preHide (void) throw () -{ - gLiveSupport->putWindowPosition(this); - if (windowOpenerButton) { - windowOpenerButton->set_active(false); - } -} - - -/*------------------------------------------------------------------------------ - * Set the title of the window. - *----------------------------------------------------------------------------*/ -void -GuiWindow :: setTitle (Ptr::Ref title) - throw () -{ - windowTitle = title; - - Glib::ustring fullTitle = applicationTitle; - fullTitle += " - "; - fullTitle += *title; - mainWindow->set_title(fullTitle); -} - diff --git a/src/products/gLiveSupport/src/GuiWindow.h b/src/products/gLiveSupport/src/GuiWindow.h deleted file mode 100644 index 607047816..000000000 --- a/src/products/gLiveSupport/src/GuiWindow.h +++ /dev/null @@ -1,184 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GuiWindow_h -#define GuiWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GuiObject.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The common ancestor of all standalone windows in the GUI. - * - */ -class GuiWindow : public GuiObject -{ - private: - - /** - * The title of the window. - */ - Ptr::Ref windowTitle; - - /** - * Stuff to do before showing the window. - */ - void - preShow(void) throw (); - - /** - * Stuff to do before hiding the window. - */ - void - preHide(void) throw (); - - - protected: - - /** - * The button which was used to open this window. - */ - Gtk::ToggleButton * windowOpenerButton; - - /** - * The window itself. - */ - Gtk::Window * mainWindow; - - /** - * Signal handler for the close button getting clicked. - */ - virtual bool - onDeleteEvent(GdkEventAny * event) throw (); - - /** - * Protected constructor. - * - * @param bundleName the name of the sub-bundle for this object. - * @param gladeFileName the name of the Glade file for this window. - * @param windowOpenerButton the button which was pressed to open - * this window (optional). - */ - GuiWindow(const Glib::ustring & bundleName, - const Glib::ustring & gladeFileName, - Gtk::ToggleButton * windowOpenerButton = 0) - throw (); - - - public: - - /** - * Virtual destructor. - */ - virtual - ~GuiWindow(void) throw () - { - } - - /** - * Restore the window position and show the window. - */ - virtual void - show(void) throw (); - - /** - * Save the window position and hide the window. - */ - virtual void - hide(void) throw (); - - /** - * Set the title of the window. - * - * Adds the application's title to the title of the window shown - * on the task bar. - * - * @param title the title of the window. - */ - virtual void - setTitle(Ptr::Ref title) throw (); - - /** - * A replacement for Gtk::Window::get_name(). - * - * @return the (localized) title of the window. - */ - virtual Ptr::Ref - getTitle(void) const throw () - { - return windowTitle; - } - - /** - * Get the underlying Gtk::Window. - */ - virtual Gtk::Window * - getWindow(void) throw () - { - return mainWindow; - } - - /** - * Get the underlying Gtk::Window. - */ - virtual const Gtk::Window * - getWindow(void) const throw () - { - return mainWindow; - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // GuiWindow_h - diff --git a/src/products/gLiveSupport/src/KeyboardShortcut.cxx b/src/products/gLiveSupport/src/KeyboardShortcut.cxx deleted file mode 100644 index ac2880390..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcut.cxx +++ /dev/null @@ -1,195 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "KeyboardShortcut.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string KeyboardShortcut::configElementName = "keyboardShortcut"; - -namespace { - -/** - * The name of the attribute of the action element. - */ -const std::string actionAttributeName = "action"; - -/** - * The name of the attribute of the key element. - */ -const std::string keyAttributeName = "key"; - -/* - * The modifier keys we check against. - * The following modifiers are omitted, hence ignored: - * Gdk::LOCK_MASK (caps lock), - * Gdk::MOD2_MASK (don't know what; always on on my computer), - * Gdk::MOD3_MASK (don't know what; always off on my computer), - * Gdk::BUTTONX_MASK (mouse buttons, X = 1..5). - */ -const Gdk::ModifierType modifiersChecked = Gdk::SHIFT_MASK - | Gdk::CONTROL_MASK - | Gdk::MOD1_MASK // Alt - | Gdk::MOD4_MASK // Windows key - | Gdk::MOD5_MASK; // AltGr - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Create a keyboard shortcut element object based on an XML element. - *----------------------------------------------------------------------------*/ -void -KeyboardShortcut :: configure(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - if (element.get_name() != configElementName) { - throw std::invalid_argument("bad coniguration element " - + element.get_name()); - } - - // set the action - xmlpp::Attribute * actionAttribute = element.get_attribute( - actionAttributeName); - if (actionAttribute) { - actionString.reset(new Glib::ustring(actionAttribute->get_value())); - try { - action = stringToAction(actionString); - } catch (std::invalid_argument &e) { - std::string eMsg = "Invalid action specification "; - eMsg += *actionString; - eMsg += "."; - throw std::invalid_argument(eMsg); - } - } else { - throw std::invalid_argument("missing " - + actionAttributeName + " attribute"); - } - - // set the key - xmlpp::Attribute * keyAttribute = element.get_attribute( - keyAttributeName); - if (keyAttribute) { - setKey(keyAttribute->get_value()); - } else { - throw std::invalid_argument("missing " - + keyAttributeName + " attribute"); - } -} - - -/*------------------------------------------------------------------------------ - * Set the shortcut key. - *----------------------------------------------------------------------------*/ -void -KeyboardShortcut :: setKey(const Glib::ustring & keyName) - throw (std::invalid_argument) -{ - shortcutKey = Gtk::AccelKey(keyName); - if (shortcutKey.get_key() == 0) { - throw std::invalid_argument("invalid shortcut key name"); - } -} - - -/*------------------------------------------------------------------------------ - * Tell whether the given modifier-key pair triggers this action. - *----------------------------------------------------------------------------*/ -bool -KeyboardShortcut :: isTriggeredBy(Gdk::ModifierType modifiers, - guint key) const - throw () -{ - Gdk::ModifierType myModifiers = modifiers & modifiersChecked; - - if (shortcutKey.get_mod() == myModifiers - && shortcutKey.get_key() == key) { - return true; - } else { - return false; - } -} - - -/*------------------------------------------------------------------------------ - * Convert an action name string to an enumeration value. - *----------------------------------------------------------------------------*/ -KeyboardShortcut::Action -KeyboardShortcut :: stringToAction(Ptr::Ref actionName) - throw (std::invalid_argument) -{ - if (*actionName == "playAudio") { - return playAudio; - } else if (*actionName == "pauseAudio") { - return pauseAudio; - } else if (*actionName == "stopAudio") { - return stopAudio; - } else if (*actionName == "nextTrack") { - return nextTrack; - } else if (*actionName == "fadeOut") { - return fadeOut; - } else if (*actionName == "moveItemUp") { - return moveItemUp; - } else if (*actionName == "moveItemDown") { - return moveItemDown; - } else if (*actionName == "removeItem") { - return removeItem; - } else { - throw std::invalid_argument(""); - } -} - - -/*------------------------------------------------------------------------------ - * Convert a modifiers-key code pair to a user-readable string. - *----------------------------------------------------------------------------*/ -Ptr::Ref -KeyboardShortcut :: modifiedKeyToString(Gdk::ModifierType modifiers, - guint key) - throw () -{ - Gtk::AccelKey accelKey(key, modifiers & modifiersChecked); - Ptr::Ref keyName(new Glib::ustring(accelKey.get_abbrev())); - return keyName; -} - diff --git a/src/products/gLiveSupport/src/KeyboardShortcut.h b/src/products/gLiveSupport/src/KeyboardShortcut.h deleted file mode 100644 index ace0693ae..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcut.h +++ /dev/null @@ -1,273 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef KeyboardShortcut_h -#define KeyboardShortcut_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A class for representing a keyboard shortcut. - * - * This object has to be configured with an XML configuration element - * called keyboardShortcut. This may look like the following: - * - *

- *  <keyboardShortcut    action  = "pauseAudio"
- *                          key     = "<Alt><Ctrl>P" />
- *  
- * - * The possible action values are the members of the Action enumeration. - * - * The possible key values are zero or more of the modifiers - * <Shift>, <Control> and <Alt>, followed by the - * name of the key, e.g., the letters A-Z (or a-z; they are not - * case-sensitive), the numbers 0-9, Space, Tab, etc. - * The key names are the ones defined in Gtk::AccelKey, used in the - * Gnome Keyboard Shortcuts applet, for example. - * (Note: Gtk::AccelKey is a wrapper for the gdk_keyval_name() and - * gdk_keyval_from_name() C functions in GDK.) - * - * There must be exactly one each of the action - * key attributes. - * - * The DTD for the expected XML element looks like the following: - * - *

- *  <!ELEMENT keyboardShortcut   EMPTY >
- *  <!ATTLIST keyboardShortcut   action  CDATA   #REQUIRED >
- *  <!ATTLIST keyboardShortcut   key     CDATA   #REQUIRED >
- *  
- * - * - * @see KeyboardShortcutContainer - */ -class KeyboardShortcut : public Configurable -{ - friend class KeyboardShortcutContainer; - - public: - /** - * An enumeration of all possible actions. - */ - typedef enum { noAction, - playAudio, - pauseAudio, - stopAudio, - nextTrack, - fadeOut, - moveItemUp, - moveItemDown, - removeItem } Action; - - - private: - /** - * The name of the configuration XML element used by KeyboardShortcut. - */ - static const std::string configElementName; - - /** - * The action associated with this keyboard shortcut. - */ - Action action; - - /** - * A string representation of the action. - */ - Ptr::Ref actionString; - - /** - * The key associated with this keyboard shortcut. - */ - Gtk::AccelKey shortcutKey; - - /** - * Convert an action name string to an enumeration value. - * If no matching enumeration value is found, noAction is returned. - * - * @param actionName a string containing the name of the action. - */ - Action - stringToAction(Ptr::Ref actionName) - throw(std::invalid_argument); - - - protected: - /** - * Default constructor. - */ - KeyboardShortcut() throw () - : action(noAction) - { - } - - /** - * Constructor. - * - * @param action the action associated with this object. - */ - KeyboardShortcut(Action action) throw () - : action(action) - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementName; - } - - /** - * Configure the metadata object based on an XML configuration element. - * - * @param elemen the XML configuration element. - * @exception std::invalid_argument of the supplied XML element - * contains bad configuration information - */ - virtual void - configure(const xmlpp::Element &element) - throw (std::invalid_argument); - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~KeyboardShortcut(void) throw () - { - } - - /** - * Return the action. - * - * @return the Action enumeration value associated with this object. - */ - Action - getAction(void) const throw () - { - return action; - } - - /** - * Set the shortcut key. - * - * @param keyName the string representation of the shortcut key. - */ - void - setKey(const Glib::ustring & keyName) - throw (std::invalid_argument); - - /** - * Tell whether the given modifier-key pair is one of those - * associated with this object. - * - * @return true if the modifier-key pair triggers this action, - * false if not. - */ - bool - isTriggeredBy(Gdk::ModifierType modifiers, - guint key) const throw (); - - /** - * Return a string corresponding to the action of this shortcut. - * - * @return a string representing the action of this shortcut. - */ - Ptr::Ref - getActionString(void) const throw () - { - return actionString; - } - - /** - * Return the first key associated with this shortcut. - * - * @return a string representing the first modifier-key pair of - * this shortcut. - */ - Ptr::Ref - getKeyString(void) const throw () - { - Ptr::Ref keyName(new Glib::ustring( - shortcutKey.get_abbrev() )); - return keyName; - } - - /** - * Convert a modifiers-key code pair to a user-readable string. - * - * @return a string representing the modifier-key pair. - */ - static Ptr::Ref - modifiedKeyToString(Gdk::ModifierType modifiers, - guint key) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // KeyboardShortcut_h - diff --git a/src/products/gLiveSupport/src/KeyboardShortcutContainer.cxx b/src/products/gLiveSupport/src/KeyboardShortcutContainer.cxx deleted file mode 100644 index efff3f818..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcutContainer.cxx +++ /dev/null @@ -1,116 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "KeyboardShortcutContainer.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * The name of the config element for this class - */ -const std::string KeyboardShortcutContainer::configElementName - = "keyboardShortcutContainer"; -namespace { - -/** - * The name of the window name sub-element. - */ -const std::string windowNameAttributeName = "windowName"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Create a metadata type container element object based on an XML element. - *----------------------------------------------------------------------------*/ -void -KeyboardShortcutContainer :: configure(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - if (element.get_name() != configElementName) { - throw std::invalid_argument("bad coniguration element " - + element.get_name()); - } - - xmlpp::Node::NodeList childNodes = element.get_children( - KeyboardShortcut::getConfigElementName()); - xmlpp::Node::NodeList::const_iterator it = childNodes.begin(); - - while (it != childNodes.end()) { - const xmlpp::Element * keyboardShortcutElement - = dynamic_cast (*it); - - Ptr::Ref keyboardShortcut(new KeyboardShortcut); - keyboardShortcut->configure(*keyboardShortcutElement); - - shortcutList.push_back(keyboardShortcut); - ++it; - } - - xmlpp::Attribute * windowNameAttr = element.get_attribute( - windowNameAttributeName); - if (windowNameAttr) { - windowName.reset(new const Glib::ustring(windowNameAttr->get_value())); - } else { - throw std::invalid_argument("missing windowName attribute"); - } -} - -/*------------------------------------------------------------------------------ - * Return the action triggered by the given key. - *----------------------------------------------------------------------------*/ -KeyboardShortcut::Action -KeyboardShortcutContainer :: findAction(Gdk::ModifierType modifiers, - guint key) const - throw () -{ - ShortcutListType::const_iterator it = shortcutList.begin(); - - while (it != shortcutList.end()) { - Ptr::Ref shortcut = *it; - if (shortcut->isTriggeredBy(modifiers, key)) { - return shortcut->getAction(); - } - ++it; - } - - return KeyboardShortcut::noAction; -} - diff --git a/src/products/gLiveSupport/src/KeyboardShortcutContainer.h b/src/products/gLiveSupport/src/KeyboardShortcutContainer.h deleted file mode 100644 index cbbba7034..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcutContainer.h +++ /dev/null @@ -1,214 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef KeyboardShortcutContainer_h -#define KeyboardShortcutContainer_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" - -#include "KeyboardShortcut.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Container holding KeyboardShortcut objects. - * - * This object has to be configured with an XML configuration element - * called keyboardShortcutContainer. This may look like the following: - * - *

- *  <keyboardShortcutContainer
- *              windowName = "liveModeWindow">
- *      <keyboardShortcut> ... </keyboardShortcut>
- *      <keyboardShortcut> ... </keyboardShortcut>
- *      ...
- *      <keyboardShortcut> ... </keyboardShortcut>
- *  </keyboardShortcutContainer>
- *  
- * - * The DTD for the expected XML element is the following: - * - *

- *  
- *  
- *  
- * - * WindowName is an arbitrary utf-8 string which identifies the window the - * shortcuts are for. - * For a description of the keyboardShortcut XML element, see the documentation - * of the KeyboardShortcut class. - * - * @see KeyboardShortcut - */ -class KeyboardShortcutContainer : public Configurable -{ - private: - /** - * The name of the configuration XML element used by - * KeyboardShortcutContainer. - */ - static const std::string configElementName; - - /** - * A vector type holding contant KeyboardShortcut references. - */ - typedef std::vector::Ref> - ShortcutListType; - - /** - * The list of all KeyboardShortcut references. - */ - ShortcutListType shortcutList; - - /** - * The name of the window the shortcuts are for. - */ - Ptr::Ref windowName; - - - public: - /** - * Constructor. - */ - KeyboardShortcutContainer() throw () - { - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~KeyboardShortcutContainer(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementName; - } - - /** - * Configure the metadata object based on an XML configuration element. - * - * @param elemen the XML configuration element. - * @exception std::invalid_argument of the supplied XML element - * contains bad configuration information - */ - virtual void - configure(const xmlpp::Element &element) - throw (std::invalid_argument); - - /** - * Return the action triggered by the given key. - * Scans the keyboard shortcuts in order, and returns the first - * match. - * - * @param modifiers the gdktypes code of the modifiers flag. - * @param key the gdkkeysyms code of the key pressed. - * @return the action; or noAction if none is found. - */ - KeyboardShortcut::Action - findAction(Gdk::ModifierType modifiers, - guint key) const throw (); - - /** - * Return the name of the window the shortcuts are for. - * - * @return the name of the window; this may be 0 if (and only if) - * the object has not been configured yet. - */ - Ptr::Ref - getWindowName(void) const throw () - { - return windowName; - } - - /** - * The iterator for cycling through the keyboard shortcuts. - * Dereference an iterator to get a Ptr::Ref. - */ - typedef ShortcutListType::const_iterator iterator; - - /** - * The first item in the list. - */ - iterator - begin(void) const throw () - { - return shortcutList.begin(); - } - - /** - * One after the last item in the list. - */ - iterator - end(void) const throw () - { - return shortcutList.end(); - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // KeyboardShortcutContainer_h - diff --git a/src/products/gLiveSupport/src/KeyboardShortcutList.cxx b/src/products/gLiveSupport/src/KeyboardShortcutList.cxx deleted file mode 100644 index c2065beb5..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcutList.cxx +++ /dev/null @@ -1,94 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "KeyboardShortcutList.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * The name of the config element for this class - */ -const std::string KeyboardShortcutList::configElementName - = "keyboardShortcutList"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Create a metadata type container element object based on an XML element. - *----------------------------------------------------------------------------*/ -void -KeyboardShortcutList :: configure(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - if (element.get_name() != configElementName) { - throw std::invalid_argument("bad coniguration element " - + element.get_name()); - } - - xmlpp::Node::NodeList nodes = element.get_children( - KeyboardShortcutContainer::getConfigElementName()); - xmlpp::Node::NodeList::const_iterator it = nodes.begin(); - while (it != nodes.end()) { - Ptr::Ref ksc(new KeyboardShortcutContainer); - ksc->configure(*((const xmlpp::Element*) *it)); - containerList.push_back(ksc); - ++it; - } -} - -/*------------------------------------------------------------------------------ - * Find the action triggered by the given key in the given window. - *----------------------------------------------------------------------------*/ -KeyboardShortcut::Action -KeyboardShortcutList :: findAction(const Glib::ustring & windowName, - Gdk::ModifierType modifiers, - guint key) const - throw () -{ - for (iterator it = begin(); it != end(); ++it) { - Ptr::Ref ksc = *it; - if (*ksc->getWindowName() == windowName) { - return ksc->findAction(modifiers, key); - } - } - - return KeyboardShortcut::noAction; -} - diff --git a/src/products/gLiveSupport/src/KeyboardShortcutList.h b/src/products/gLiveSupport/src/KeyboardShortcutList.h deleted file mode 100644 index 373e61507..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcutList.h +++ /dev/null @@ -1,186 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef KeyboardShortcutList_h -#define KeyboardShortcutList_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include // TODO: REMOVE ME - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" - -#include "KeyboardShortcutContainer.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A list of KeyboardShortcutContainer objects. - * - * This object has to be configured with an XML configuration element - * called keyboardShortcutList. - * - * The DTD for the expected XML element is the following: - *

- *  
- *  
- * - * For a description of the keyboardShortcutContainer XML element, - * see the documentation of the KeyboardShortcutContainer class. - * - * @see KeyboardShortcut - */ -class KeyboardShortcutList : public Configurable -{ - private: - /** - * The name of the configuration XML element used by - * KeyboardShortcutList. - */ - static const std::string configElementName; - - /** - * The type for storing the keyboard shortcut containers. - */ - typedef std::vector::Ref> - ContainerListType; - - /** - * The list of keyboard shortcut containers for the various windows. - */ - ContainerListType containerList; - - - public: - /** - * Constructor. - */ - KeyboardShortcutList() throw () - { - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~KeyboardShortcutList(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementName; - } - - /** - * Configure the metadata object based on an XML configuration element. - * - * @param elemen the XML configuration element. - * @exception std::invalid_argument of the supplied XML element - * contains bad configuration information - */ - virtual void - configure(const xmlpp::Element &element) - throw (std::invalid_argument); - - /** - * Find the action triggered by the given key in the given window. - * - * @param windowName a string identifying the window (not localized). - * @param modifiers the gdktypes code for the Shift, Ctrl etc. - * modifier keys which are pressed. - * @param key the gdkkeysyms code for the key pressed. - * @return the associated action; or noAction, if none is found. - */ - KeyboardShortcut::Action - findAction(const Glib::ustring & windowName, - Gdk::ModifierType modifiers, - guint key) const throw (); - - /** - * The iterator for cycling through the keyboard shortcut containers. - * Dereference an iterator to get a - * Ptr::Ref. - */ - typedef ContainerListType::const_iterator iterator; - - /** - * The first item in the list. - */ - iterator - begin(void) const throw () - { - return containerList.begin(); - } - - /** - * One after the last item in the list. - */ - iterator - end(void) const throw () - { - return containerList.end(); - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // KeyboardShortcutList_h - diff --git a/src/products/gLiveSupport/src/KeyboardShortcutTest.cxx b/src/products/gLiveSupport/src/KeyboardShortcutTest.cxx deleted file mode 100644 index a3fdb2398..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcutTest.cxx +++ /dev/null @@ -1,142 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#include - -#include "KeyboardShortcutContainer.h" -#include "KeyboardShortcutTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(KeyboardShortcutTest); - -namespace { - -/** - * The name of the test keyboard shortcut config file. - */ -const std::string configFileName = "etc/keyboardShortcut.xml"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -KeyboardShortcutTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - std::ifstream ifs; - ifs.open(configFileName.c_str()); - - if (!ifs.is_open() || ifs.bad()) { - ifs.close(); - CPPUNIT_FAIL("could not open keyboard shortcut config file " - + configFileName); - } - - ksc.reset(new KeyboardShortcutContainer); - - try { - Ptr::Ref parser(new xmlpp::DomParser()); - parser->parse_stream(ifs); - parser->set_validate(); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - - ksc->configure(*root); - - } catch (std::invalid_argument &e) { - ifs.close(); - CPPUNIT_FAIL("semantic error in keyboard shortcuts configuration file: " - + std::string(e.what())); - } catch (xmlpp::exception &e) { - ifs.close(); - CPPUNIT_FAIL("syntax error in keyboard shortcuts configuration file: " - + std::string(e.what())); - } - ifs.close(); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -KeyboardShortcutTest :: tearDown(void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * A simple test. - *----------------------------------------------------------------------------*/ -void -KeyboardShortcutTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(ksc->findAction(Gdk::ModifierType(0), GDK_p) - == KeyboardShortcut::playAudio); - - CPPUNIT_ASSERT(ksc->findAction(Gdk::MOD2_MASK | Gdk::LOCK_MASK, GDK_p) - == KeyboardShortcut::playAudio); - - CPPUNIT_ASSERT(ksc->findAction(Gdk::CONTROL_MASK, GDK_p) - == KeyboardShortcut::pauseAudio); - - CPPUNIT_ASSERT(ksc->findAction(Gdk::ModifierType(0), GDK_space) - == KeyboardShortcut::stopAudio); - - CPPUNIT_ASSERT(ksc->findAction(Gdk::ModifierType(0), GDK_q) - == KeyboardShortcut::noAction); - - CPPUNIT_ASSERT(ksc->findAction(Gdk::CONTROL_MASK, GDK_w) - == KeyboardShortcut::noAction); - - CPPUNIT_ASSERT(ksc->findAction(Gdk::ModifierType(0xffffff), 0xffffff) - == KeyboardShortcut::noAction); -} - diff --git a/src/products/gLiveSupport/src/KeyboardShortcutTest.h b/src/products/gLiveSupport/src/KeyboardShortcutTest.h deleted file mode 100644 index 6edd5333f..000000000 --- a/src/products/gLiveSupport/src/KeyboardShortcutTest.h +++ /dev/null @@ -1,111 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef KeyboardShortcutTest_h -#define KeyboardShortcutTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/BaseTestMethod.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Testing audio playback from the storage. - * - * @see KeyboardShortcutFactory - */ -class KeyboardShortcutTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(KeyboardShortcutTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The KeyboardShortcutContainer object we are testing. - */ - Ptr::Ref ksc; - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // KeyboardShortcutTest_h - diff --git a/src/products/gLiveSupport/src/LiveModeWindow.cxx b/src/products/gLiveSupport/src/LiveModeWindow.cxx deleted file mode 100644 index 13b864115..000000000 --- a/src/products/gLiveSupport/src/LiveModeWindow.cxx +++ /dev/null @@ -1,782 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" - -#include "LiveModeWindow.h" - - -using namespace Glib; - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "liveModeWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "LiveModeWindow.glade"; - -/*------------------------------------------------------------------------------ - * The name of the user preference for storing contents of the window. - *----------------------------------------------------------------------------*/ -const Glib::ustring userPreferencesKeyName = "liveModeContents"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -LiveModeWindow :: LiveModeWindow (Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton), - isDeleting(false) -{ - glade->get_widget_derived("treeView1", treeView); - treeView->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); - - treeView->appendLineNumberColumn("", 2 /* offset */, 50); - treeView->appendColumn("", modelColumns.infoColumn, 200); - - treeModel = Gtk::ListStore::create(modelColumns); - treeView->set_model(treeModel); - treeView->connectModelSignals(treeModel); - setupDndCallbacks(); - - treeView->signal_button_press_event().connect(sigc::mem_fun(*this, - &LiveModeWindow::onEntryClicked), - false /* call this first */); - treeView->signal_row_activated().connect(sigc::mem_fun(*this, - &LiveModeWindow::onDoubleClick)); - treeView->signalTreeModelChanged().connect(sigc::mem_fun(*this, - &LiveModeWindow::onTreeModelChanged)); - treeView->signal_key_press_event().connect(sigc::mem_fun(*this, - &LiveModeWindow::onKeyPressed)); - - glade->get_widget("cueLabel1", cueLabel); - cueLabel->set_label(*getResourceUstring("cuePlayerLabel")); - cuePlayer.reset(new CuePlayer(this, - treeView, - modelColumns)); - - glade->get_widget("autoPlayNext1", autoPlayNext); - autoPlayNext->set_label(*getResourceUstring("autoPlayNextLabel")); - - glade->connect_clicked("outputPlayButton1", sigc::mem_fun(*this, - &LiveModeWindow::onOutputPlay)); - - audioClipContextMenu = constructAudioClipContextMenu(); - playlistContextMenu = constructPlaylistContextMenu(); - - userPreferencesKey.reset(new const Glib::ustring(userPreferencesKeyName)); -} - - -/*------------------------------------------------------------------------------ - * Add a new item to the top of the Live Mode Window. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: addItem(Ptr::Ref playable) throw () -{ - addItem(treeModel->append(), playable); -} - - -/*------------------------------------------------------------------------------ - * Add a new item as the given row in the Live Mode Window. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: addItem(Gtk::TreeIter iter, - Ptr::Ref playable) throw () -{ - - Gtk::TreeModel::Row row = *iter; - row[modelColumns.playableColumn] = playable; - - Ptr::Ref infoString(new Glib::ustring); - - infoString->append(""); - infoString->append(Glib::Markup::escape_text(*playable->getTitle())); - infoString->append(""); - - // TODO: rewrite this using the Core::Metadata class - - Ptr::Ref - creator = playable->getMetadata("dc:creator"); - if (creator) { - infoString->append("\n"); - infoString->append(Glib::Markup::escape_text(*creator)); - infoString->append(""); - } - - Ptr::Ref - album = playable->getMetadata("dc:source"); - if (album) { - infoString->append("\n"); - infoString->append(Glib::Markup::escape_text(*album)); - infoString->append(""); - } - - infoString->append("\n" - "duration: "); - infoString->append(*TimeConversion::timeDurationToHhMmSsString( - playable->getPlaylength() )); - infoString->append(""); - - row[modelColumns.infoColumn] = *infoString; - - onTreeModelChanged(); -} - - -/*------------------------------------------------------------------------------ - * Add an item to the Live Mode window, by ID. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: addItem(Ptr::Ref id) - throw () -{ - Ptr::Ref playable; - try { - playable = gLiveSupport->acquirePlayable(id); - } catch (XmlRpcException &e) { - std::cerr << "could not acquire playable in LiveModeWindow: " - << e.what() << std::endl; - return; - } - - addItem(playable); -} - - -/*------------------------------------------------------------------------------ - * Add an item to the Live Mode window at the given position, by ID. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: addItem(Gtk::TreeIter iter, - Ptr::Ref id) - throw () -{ - Ptr::Ref playable; - try { - playable = gLiveSupport->acquirePlayable(id); - } catch (XmlRpcException &e) { - std::cerr << "could not acquire playable in LiveModeWindow: " - << e.what() << std::endl; - return; - } - - addItem(iter, playable); -} - - -/*------------------------------------------------------------------------------ - * "Pop" the first item from the top of the Live Mode Window. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveModeWindow :: popTop(void) throw () -{ - Ptr::Ref playable; - if (!autoPlayNext->get_active()) { - return playable; // return a 0 pointer if auto is set to off - } - - Gtk::TreeIter iter = treeModel->children().begin(); - if (iter) { - playable = (*iter)[modelColumns.playableColumn]; - treeModel->erase(iter); - } - gLiveSupport->runMainLoop(); - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Event handler for an entry being clicked in the list. - *----------------------------------------------------------------------------*/ -bool -LiveModeWindow :: onEntryClicked(GdkEventButton * event) throw () -{ - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - Ptr::Ref playable = getFirstSelectedPlayable(); - - if (selectedPaths->size() == 1) { - if (playable->getType() == Playable::AudioClipType) { - audioClipContextMenu->popup(event->button, event->time); - return true; - - } else if (playable->getType() == Playable::PlaylistType) { - playlistContextMenu->popup(event->button, event->time); - return true; - } - - } else if (selectedPaths->size() > 1) { - audioClipContextMenu->popup(event->button, event->time); - return true; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Return the first selected playable item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveModeWindow :: getFirstSelectedPlayable(void) throw () -{ - Ptr::Ref playable; - - Glib::RefPtr - selection = treeView->get_selection(); - selectedPaths.reset(new std::vector( - selection->get_selected_rows())); - - if (selectedPaths->size() > 0) { - selectedIter = selectedPaths->begin(); - Gtk::TreeRow row = *(treeModel->get_iter(*selectedIter)); - playable = row[modelColumns.playableColumn]; - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Return the next selected playable item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveModeWindow :: getNextSelectedPlayable(void) throw () -{ - Ptr::Ref playable; - - if (selectedPaths) { - if (selectedIter != selectedPaths->end()) { - Gtk::TreeRow row = *(treeModel->get_iter(*selectedIter)); - playable = row[modelColumns.playableColumn]; - ++selectedIter; - } else { - selectedPaths.reset(); - } - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the user double-clicking or pressing Enter. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onDoubleClick(const Gtk::TreeModel::Path & path, - const Gtk::TreeViewColumn * column) - throw () -{ - onOutputPlay(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for a key pressed. - *----------------------------------------------------------------------------*/ -bool -LiveModeWindow :: onKeyPressed(GdkEventKey * event) throw () -{ - if (event->type == GDK_KEY_PRESS) { - KeyboardShortcut::Action action = gLiveSupport->findAction( - "liveModeWindow", - Gdk::ModifierType(event->state), - event->keyval); - switch (action) { - case KeyboardShortcut::moveItemUp : - if (selectionIsSingle()) { - treeView->onUpMenuOption(); - return true; - } - break; - - case KeyboardShortcut::moveItemDown : - if (selectionIsSingle()) { - treeView->onDownMenuOption(); - return true; - } - break; - - case KeyboardShortcut::removeItem : - onRemoveMenuOption(); - return true; - break; - - case KeyboardShortcut::playAudio : - onOutputPlay(); - return true; - break; - - default : break; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Check whether exactly one row is selected. - *----------------------------------------------------------------------------*/ -bool -LiveModeWindow :: selectionIsSingle(void) throw () -{ - getFirstSelectedPlayable(); - - return (selectedPaths->size() == 1); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the output play button clicked. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onOutputPlay(void) throw () -{ - Gtk::TreeIter itemPlayed; - Ptr::Ref playable = getFirstSelectedPlayable(); - - if (playable) { - itemPlayed = treeModel->get_iter(*selectedIter); - } else { - itemPlayed = treeModel->children().begin(); - if (itemPlayed) { - playable = (*itemPlayed)[modelColumns.playableColumn]; - } - } - - if (playable) { - try { - gLiveSupport->setNowPlaying(playable); - if(false == gLiveSupport->playOutputAudio(playable)) - { - treeView->removeItem(itemPlayed); - return; - } - - treeView->removeItem(itemPlayed); - - gLiveSupport->runMainLoop(); - - } catch (std::runtime_error &e) { - std::cerr << "cannot play on live mode output device: " - << e.what() << std::endl; - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Edit Playlist menu item selected from the - * entry context menu. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onEditPlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - try { - gLiveSupport->openPlaylistForEditing(playlist->getId()); - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(*getResourceUstring( - "cannotEditPlaylistMsg" )); - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Schedule Playlist menu item selected from the - * entry context menu. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onSchedulePlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - schedulePlaylistWindow.reset(new SchedulePlaylistWindow(playlist)); - schedulePlaylistWindow->getWindow()->set_transient_for(*mainWindow); - Gtk::Main::run(*schedulePlaylistWindow->getWindow()); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "export playlist" in the context menu. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onExportPlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - exportPlaylistWindow.reset(new ExportPlaylistWindow(playlist)); - exportPlaylistWindow->getWindow()->set_transient_for(*mainWindow); - Gtk::Main::run(*exportPlaylistWindow->getWindow()); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Add To Playlist menu item selected from the - * entry context menu - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onAddToPlaylist(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - try { - gLiveSupport->addToPlaylist(playable->getId()); - } catch (XmlRpcException &e) { - std::cerr << "error in LiveModeWindow::onAddToPlaylist(): " - << e.what() << std::endl; - return; - } - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "upload to hub" in the context menu. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onUploadToHub(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - gLiveSupport->uploadToHub(playable); - } -} - - -/*------------------------------------------------------------------------------ - * Refresh the playlist in the window. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: refreshPlaylist(Ptr::Ref playlist) throw () -{ - for (Gtk::TreeIter iter = treeModel->children().begin(); - iter != treeModel->children().end(); ++iter) { - Ptr::Ref currentItem = (*iter)[modelColumns.playableColumn]; - if (*currentItem->getId() == *playlist->getId()) { - addItem(iter, currentItem); - } - } -} - - -/*------------------------------------------------------------------------------ - * Construct the right-click context menu for local audio clips. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveModeWindow :: constructAudioClipContextMenu(void) throw () -{ - Ptr::Ref contextMenu(new Gtk::Menu()); - Gtk::Menu::MenuList & contextMenuList = contextMenu->items(); - - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("playMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onOutputPlay))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("cueMenuItem"), - sigc::mem_fun(*cuePlayer, - &CuePlayer::onPlayItem))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToPlaylistMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onAddToPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("removeMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onRemoveMenuOption))); - contextMenuList.push_back(Gtk::Menu_Helpers::SeparatorElem()); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("uploadToHubMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onUploadToHub))); - - contextMenu->accelerate(*mainWindow); - return contextMenu; -} - - -/*------------------------------------------------------------------------------ - * Construct the right-click context menu for local playlists. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveModeWindow :: constructPlaylistContextMenu(void) throw () -{ - Ptr::Ref contextMenu(new Gtk::Menu()); - Gtk::Menu::MenuList & contextMenuList = contextMenu->items(); - - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("playMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onOutputPlay))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("cueMenuItem"), - sigc::mem_fun(*cuePlayer, - &CuePlayer::onPlayItem))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToPlaylistMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onAddToPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("removeMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onRemoveMenuOption))); - contextMenuList.push_back(Gtk::Menu_Helpers::SeparatorElem()); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("editPlaylistMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onEditPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("schedulePlaylistMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onSchedulePlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("exportPlaylistMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onExportPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::SeparatorElem()); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("uploadToHubMenuItem"), - sigc::mem_fun(*this, - &LiveModeWindow::onUploadToHub))); - - contextMenu->accelerate(*mainWindow); - return contextMenu; -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Remove menu item selected from the context menu. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onRemoveMenuOption(void) throw () -{ - isDeleting = true; - - Glib::RefPtr selection - = treeView->get_selection(); - std::vector selectedPaths - = selection->get_selected_rows(); - - std::vector selectedIters; - for (std::vector::iterator pathIt = selectedPaths.begin(); - pathIt != selectedPaths.end(); - ++pathIt) { - selectedIters.push_back(treeModel->get_iter(*pathIt)); - } - - Gtk::TreeIter newSelection; - for (std::vector::iterator iterIt = selectedIters.begin(); - iterIt != selectedIters.end(); - ++iterIt) { - newSelection = *iterIt; - ++newSelection; - treeModel->erase(*iterIt); - } - - if (newSelection) { - selection->select(newSelection); - } - - isDeleting = false; - onTreeModelChanged(); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for a change in the tree model. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: onTreeModelChanged(void) throw () -{ - if (isDeleting) { - return; - } - - Gtk::TreeIter iter = treeModel->children().begin(); - - if (iter) { - Ptr::Ref playable = (*iter)[modelColumns.playableColumn]; - if (playable) { - if (!savedTopPlayable || - *savedTopPlayable->getId() != *playable->getId()) { - gLiveSupport->preload(playable); - } - savedTopPlayable = playable; - } - } -} - - -/*------------------------------------------------------------------------------ - * Update the strings in the widget. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: updateStrings(void) throw () -{ - setBundle(gLiveSupport->getBundle("liveModeWindow")); - - setTitle(getResourceUstring("windowTitle")); - cueLabel->set_label(*getResourceUstring("cuePlayerLabel")); -} - - -/*------------------------------------------------------------------------------ - * Return the contents of the Scratchpad. - *----------------------------------------------------------------------------*/ -Ptr::Ref -LiveModeWindow :: getContents(void) throw () -{ - std::ostringstream contentsStream; - - contentsStream << int(autoPlayNext->get_active()) << " "; - - Gtk::TreeModel::const_iterator it; - for (it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - Gtk::TreeRow row = *it; - Ptr::Ref playable = row[modelColumns.playableColumn]; - contentsStream << playable->getId()->getId() << " "; - } - - Ptr::Ref contents(new Glib::ustring( - contentsStream.str() )); - return contents; -} - - -/*------------------------------------------------------------------------------ - * Restore the contents of the Scratchpad. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: setContents(Ptr::Ref contents) - throw () -{ - std::istringstream contentsStream(*contents); - if (contentsStream.eof()) { - return; - } - - int autoPlayNextValue; - contentsStream >> autoPlayNextValue; - autoPlayNext->set_active(autoPlayNextValue); - - std::vector contentsVector; - while (!contentsStream.eof()) { - UniqueId::IdType nextItem; - contentsStream >> nextItem; - if (contentsStream.fail()) { - contentsStream.clear(); - contentsStream.ignore(); - } else { - contentsVector.push_back(nextItem); - } - } - - treeModel->clear(); - std::vector::reverse_iterator it; - - for (it = contentsVector.rbegin(); it != contentsVector.rend(); ++it) { - Ptr::Ref id(new const UniqueId(*it)); - addItem(id); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler called when the the window gets hidden. - *----------------------------------------------------------------------------*/ -void -LiveModeWindow :: hide(void) throw () -{ - if (exportPlaylistWindow) { - exportPlaylistWindow->getWindow()->hide(); - } - if (schedulePlaylistWindow) { - schedulePlaylistWindow->getWindow()->hide(); - } - - GuiWindow::hide(); -} - - -/*------------------------------------------------------------------------------ - * The name of the window for the d'n'd methods. - *----------------------------------------------------------------------------*/ -Glib::ustring -LiveModeWindow :: getWindowNameForDnd (void) throw () -{ - return bundleName; -} - diff --git a/src/products/gLiveSupport/src/LiveModeWindow.h b/src/products/gLiveSupport/src/LiveModeWindow.h deleted file mode 100644 index 85391d00f..000000000 --- a/src/products/gLiveSupport/src/LiveModeWindow.h +++ /dev/null @@ -1,492 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LiveModeWindow_h -#define LiveModeWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "GuiWindow.h" -#include "ContentsStorable.h" -#include "DndMethods.h" - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "CuePlayer.h" -#include "GLiveSupport.h" -#include "ExportPlaylistWindow.h" -#include "SchedulePlaylistWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The LiveMode window, showing recent and relevant audio clips and - * playlists. - * - */ -class LiveModeWindow : public GuiWindow, - public ContentsStorable, - public DndMethods -{ - private: - - /** - * The Playable item at the top of the window. - */ - Ptr::Ref savedTopPlayable; - - /** - * A flag used to disable preload() while deleting items. - */ - bool isDeleting; - - /** - * The user preferences key. - */ - Ptr::Ref userPreferencesKey; - - /** - * The Export Playlist pop-up window. - */ - Ptr::Ref exportPlaylistWindow; - - /** - * The Schedule Playlist pop-up window. - */ - Ptr::Ref schedulePlaylistWindow; - - /** - * The cue player widget with play/pause and stop buttons. - */ - Ptr::Ref cuePlayer; - - /** - * The label for the cue player. - */ - Gtk::Label * cueLabel; - - /** - * If checked, the top item in the window will start playing - * automatically after the current one finishes. - */ - Gtk::CheckButton * autoPlayNext; - - /** - * The list of selected rows, as path references (row numbers). - * Reset by onEntryClicked(). - */ - Ptr >::Ref selectedPaths; - /** - * One of the selected rows, set to the first one by onEntryClicked(). - * Incremented by getNextSelectedPlayable(). - */ - std::vector::const_iterator selectedIter; - - /** - * Construct the right-click context menu for local audio clips. - * - * @return the context menu created. - */ - Ptr::Ref - constructAudioClipContextMenu(void) throw (); - - /** - * Construct the right-click context menu for local playlists. - * - * @return the context menu created. - */ - Ptr::Ref - constructPlaylistContextMenu(void) throw (); - - /** - * Check whether exactly one row is selected. - * - * This is an auxilliary function used by onKeyPressed(). - * - * @return true if a single row is selected, false if not. - */ - bool - selectionIsSingle(void) throw (); - - - protected: - - /** - * The columns model needed by Gtk::TreeView. - * Lists one clip per row. - * - */ - class ModelColumns : public PlayableTreeModelColumnRecord - { - public: - /** - * The column for the title, creator, etc. - */ - Gtk::TreeModelColumn infoColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(infoColumn); - } - }; - - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * The tree view, now only showing rows. - */ - ZebraTreeView * treeView; - - /** - * The tree model, as a GTK reference. - */ - Glib::RefPtr treeModel; - - /** - * The right-click context menu for audio clips. - */ - Ptr::Ref audioClipContextMenu; - - /** - * The right-click context menu for playlists. - */ - Ptr::Ref playlistContextMenu; - - /** - * Signal handler for the output play button clicked - * or the output play menu option selected. - */ - void - onOutputPlay(void) throw (); - - /** - * Signal handler for the mouse clicked on one of the entries. - * This brings up the right-click context menu. - * - * @param event the button event recieved - * @return true if the event has been handled (a popup displayed), - * false otherwise - */ - bool - onEntryClicked(GdkEventButton * event) throw (); - - /** - * Signal handler for the user double-clicking, or pressing Enter - * on one of the entries. - * - * @param path the TreePath of the row clicked on (ignored). - * @param column the TreeViewColumn clicked on (ignored). - */ - void - onDoubleClick(const Gtk::TreeModel::Path & path, - const Gtk::TreeViewColumn * column) - throw (); - - /** - * Signal handler for a key pressed at one of the entries. - * The keys can be customized by the keyboardShortcutContainer - * element in the gLiveSupport configuration file. - * - * The actions handled are: moveItemUp, moveItemDown, removeItem, - * and playAudio (which plays the item in the output player). - * - * @param event the button event received - * @return true if the key press was fully handled, false if not - */ - bool - onKeyPressed(GdkEventKey * event) throw (); - - /** - * Signal handler for the "edit playlist" menu item selected from - * the entry context menu. - */ - virtual void - onEditPlaylist(void) throw (); - - /** - * Signal handler for the "schedule playlist" menu item selected - * from the entry context menu. - */ - virtual void - onSchedulePlaylist(void) throw (); - - /** - * Signal handler for the "export playlist" menu item selected from - * the entry context menu. - */ - virtual void - onExportPlaylist(void) throw (); - - /** - * Signal handler for the "add to playlist" menu item selected from - * the entry context menu. - */ - virtual void - onAddToPlaylist(void) throw (); - - /** - * Signal handler for the "upload to hub" menu item selected from - * the entry context menu. - */ - virtual void - onUploadToHub(void) throw (); - - /** - * Signal handler for the "remove" menu item selected from - * the entry context menu. - */ - virtual void - onRemoveMenuOption(void) throw (); - - /** - * Signal handler for a change in the tree model. - */ - virtual void - onTreeModelChanged(void) throw (); - - /** - * The tree view we want to implement d'n'd on. - */ - virtual Gtk::TreeView * - getTreeViewForDnd (void) throw () - { - return treeView; - } - - /** - * The name of the window for the d'n'd methods. - */ - virtual Glib::ustring - getWindowNameForDnd (void) throw (); - - /** - * Return the topmost selected row. - * Sets selectedPaths and selectedIter; does not increment it. - * - * @return the first selected playable item. - */ - virtual Ptr::Ref - getFirstSelectedPlayable (void) throw (); - - /** - * Used to iterate over the selected rows. - * Reset to the first row by onEntryClicked(). - * Returns a 0 pointer if nothing is selected or we have reached - * the end of the list of selected rows. - * - * @return the next selected playable item. - */ - virtual Ptr::Ref - getNextSelectedPlayable (void) throw (); - - /** - * Add an item to the d'n'd tree view at the given position. - * - * @param iter the iterator pointing to the row to be filled in. - * @param id the ID of the item to add. - */ - virtual void - addItem (Gtk::TreeIter iter, - Ptr::Ref id) throw (); - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - LiveModeWindow(Gtk::ToggleButton * windowOpenerButton) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~LiveModeWindow(void) throw () - { - } - - /** - * Add a new item to the top of the Live Mode Window. - * - * @param playable the playable object to be added. - */ - void - addItem(Ptr::Ref playable) throw (); - - /** - * Add a new item as the given row in the Live Mode Window. - * - * @param iter an iterator pointing to the row to be updated. - * @param playable the playable object to be added. - */ - void - addItem(Gtk::TreeIter iter, - Ptr::Ref playable) throw (); - - /** - * Add an item to the top of the Live Mode Window, by ID. - * - * @param id the id of the item to add. - * @see setContents(). - */ - void - addItem(Ptr::Ref id) throw (); - - /** - * "Pop" the first item from the top of the Live Mode Window. - * - * @return the playable object at the top of the window, - * or 0 if the window is empty. - */ - Ptr::Ref - popTop(void) throw (); - - /** - * Update the cue player display to show a stopped state. - */ - void - showCuePlayerStopped(void) throw () - { - cuePlayer->onStop(); - } - - /** - * Refresh the playlist in the window. - * Updates the playlist to the new copy supplied in the argument, - * if it is present in the window. - * This is called by GLiveSupport::savePlaylist() after the playlist - * has been edited. - * - * @param playlist the new version of the playlist. - */ - void - refreshPlaylist(Ptr::Ref playlist) throw (); - - /** - * Report whether the window is non-empty. - * - * @return true if there is at least one Playable item in the window. - */ - bool - isNotEmpty(void) throw () - { - return (treeModel->children().size() != 0); - } - - /** - * Update the localized strings in the widget. - */ - void - updateStrings(void) throw (); - - /** - * Return the contents of the Live Mode window. - * This means the list of audio files, plus the state of the - * autoPlayNext checkbox. - * - * @return 0 or 1, followed by a space-separated list of the - * unique IDs, in base 10. - */ - Ptr::Ref - getContents(void) throw (); - - /** - * Restore the contents of the Scratchpad. - * The current contents are discarded, and replaced with the items - * listed in the 'contents' parameter. - * - * @param contents 0 or 1, followed by a space-separated list of the - * unique IDs, in base 10. - */ - void - setContents(Ptr::Ref contents) throw (); - - /** - * Return the user preferences key. - * The contents of the window will be stored in the user preferences - * under this key. - * - * @return the user preference key. - */ - Ptr::Ref - getUserPreferencesKey(void) throw () - { - return userPreferencesKey; - } - - /** - * Hide the window. - * - * This overrides GuiWindow::hide(), and closes the Export Playlist - * and Schedule Playlist pop-up windows, if they are still open. - */ - virtual void - hide(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // LiveModeWindow_h - diff --git a/src/products/gLiveSupport/src/LoginWindow.cxx b/src/products/gLiveSupport/src/LoginWindow.cxx deleted file mode 100644 index 1e71799f5..000000000 --- a/src/products/gLiveSupport/src/LoginWindow.cxx +++ /dev/null @@ -1,198 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GLiveSupport.h" -#include "LoginWindow.h" - - -using namespace Glib; - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "loginWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "LoginWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -LoginWindow :: LoginWindow (void) - throw () - : GuiWindow(bundleName, - gladeFileName), - loggedIn(false) -{ - // localize everything - Gtk::Label * userNameLabel; - Gtk::Label * passwordLabel; - Gtk::Label * languageLabel; - glade->get_widget("userNameLabel1", userNameLabel); - glade->get_widget("passwordLabel1", passwordLabel); - glade->get_widget("languageLabel1", languageLabel); - userNameLabel->set_text(*getResourceUstring("userNameLabel")); - passwordLabel->set_text(*getResourceUstring("passwordLabel")); - languageLabel->set_text(*getResourceUstring("languageLabel")); - - // fill up the language list with the list of available languages - glade->get_widget_derived("languageEntry1", languageEntry); - - Ptr::Ref - languages = gLiveSupport->getSupportedLanguages(); - for (GLiveSupport::LanguageMap::const_iterator - it = languages->begin(); it != languages->end(); ++it) { - Glib::ustring language = it->first; - languageEntry->append_text(language); - } - languageEntry->set_active(0); - - // connect signal handlers - glade->connect_clicked("okButton1", sigc::mem_fun(*this, - &LoginWindow::onOkButtonClicked)); - glade->connect_clicked("cancelButton1", sigc::mem_fun(*this, - &LoginWindow::onCancelButtonClicked)); - - glade->get_widget("userNameEntry1", userNameEntry); - userNameEntry->signal_activate().connect(sigc::mem_fun(*this, - &LoginWindow::onUserNameEntryActivated)); - glade->get_widget("passwordEntry1", passwordEntry); - passwordEntry->signal_activate().connect(sigc::mem_fun(*this, - &LoginWindow::onPasswordEntryActivated)); - - // clear the status bar - glade->get_widget("statusBar1", statusBar); - statusBar->set_text(""); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -LoginWindow :: ~LoginWindow (void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the Enter key pressed in the user name entry. - *----------------------------------------------------------------------------*/ -void -LoginWindow :: onUserNameEntryActivated (void) throw () -{ - passwordEntry->grab_focus(); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the Enter key pressed in the password entry. - *----------------------------------------------------------------------------*/ -void -LoginWindow :: onPasswordEntryActivated (void) throw () -{ - onOkButtonClicked(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the OK button getting clicked. - *----------------------------------------------------------------------------*/ -void -LoginWindow :: onOkButtonClicked (void) throw () -{ - statusBar->set_text(*getResourceUstring("pleaseWaitMsg")); - mainWindow->set_sensitive(false); - gLiveSupport->runMainLoop(); // redraw the window - - userNameText.reset(new Glib::ustring(userNameEntry->get_text())); - passwordText.reset(new Glib::ustring(passwordEntry->get_text())); - - Ptr::Ref languages; - languages = gLiveSupport->getSupportedLanguages(); - - GLiveSupport::LanguageMap::const_iterator - langSel = languages->find(languageEntry->get_active_text()); - selectedLocale.reset(new std::string(langSel->second)); - - loggedIn = gLiveSupport->login(*getLogin(), *getPassword()); - - if (loggedIn) { - if (selectedLocale->size() > 0) { - gLiveSupport->changeLanguage(selectedLocale); - } else { - // TODO: get and set default locale for user - } - - gLiveSupport->createScratchpadWindow(); - } - - mainWindow->hide(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the cancel button getting clicked. - *----------------------------------------------------------------------------*/ -void -LoginWindow :: onCancelButtonClicked (void) throw () -{ - mainWindow->hide(); -} - - -/*------------------------------------------------------------------------------ - * Show the window, and return whether the login was successful. - *----------------------------------------------------------------------------*/ -bool -LoginWindow :: run(void) throw () -{ - Gtk::Main::run(*mainWindow); - return loggedIn; -} - - diff --git a/src/products/gLiveSupport/src/LoginWindow.h b/src/products/gLiveSupport/src/LoginWindow.h deleted file mode 100644 index 7f93fcfdf..000000000 --- a/src/products/gLiveSupport/src/LoginWindow.h +++ /dev/null @@ -1,182 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LoginWindow_h -#define LoginWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Widgets/ComboBoxText.h" -#include "GuiWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A window, handling user login. - * - */ -class LoginWindow : public GuiWindow -{ - private: - - /** - * The user name text entry area. - */ - Gtk::Entry * userNameEntry; - - /** - * The password text entry area. - */ - Gtk::Entry * passwordEntry; - - /** - * The drop-down list to select the desired language. - */ - ComboBoxText * languageEntry; - - /** - * The status bar. - */ - Gtk::Label * statusBar; - - /** - * The user name text entered by the user. - */ - Ptr::Ref userNameText; - - /** - * The password text entered by the user. - */ - Ptr::Ref passwordText; - - /** - * The locale / language selected by the user. - */ - Ptr::Ref selectedLocale; - - /** - * Flag to show that the user has successfully logged in. - */ - bool loggedIn; - - /** - * Signal handler for the Enter key pressed in the user name entry. - */ - virtual void - onUserNameEntryActivated(void) throw (); - - /** - * Signal handler for the Enter key pressed in the password entry. - */ - virtual void - onPasswordEntryActivated(void) throw (); - - /** - * Signal handler for the ok button clicked. - */ - virtual void - onOkButtonClicked(void) throw (); - - /** - * Signal handler for the cancel button clicked. - */ - virtual void - onCancelButtonClicked(void) throw (); - - /** - * Get the password entered by the user. - * - * @return the password entered by the user. - */ - Ptr::Ref - getPassword(void) const throw () - { - return passwordText; - } - - public: - - /** - * Constructor. - */ - LoginWindow(void) throw (); - - /** - * Virtual destructor. - */ - virtual - ~LoginWindow(void) throw (); - - /** - * Get the login entered by the user. - * - * @return the login entered by the user. - */ - Ptr::Ref - getLogin(void) const throw () - { - return userNameText; - } - - /** - * Show the window, and return whether the login was successful. - * - * @return true if the login was successful. - */ - bool - run(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // LoginWindow_h - diff --git a/src/products/gLiveSupport/src/MasterPanelWindow.cxx b/src/products/gLiveSupport/src/MasterPanelWindow.cxx deleted file mode 100644 index ddc0c85d7..000000000 --- a/src/products/gLiveSupport/src/MasterPanelWindow.cxx +++ /dev/null @@ -1,814 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LoginWindow.h" - -#include "MasterPanelWindow.h" - - -using namespace LiveSupport; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "masterPanelWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "MasterPanelWindow.glade"; - -/*------------------------------------------------------------------------------ - * The name of the application, shown on the task bar. - *----------------------------------------------------------------------------*/ -const Glib::ustring applicationTitleSuffix = " - Campcaster"; - -/*------------------------------------------------------------------------------ - * Number of times per second that onUpdateTime() is called. - * It's a good idea to make this a divisor of 1000. - *----------------------------------------------------------------------------*/ -const int updateTimeConstant = 20; - -/*------------------------------------------------------------------------------ - * The delay between two checks on the progress of an asynchronous method - * (in seconds). - *----------------------------------------------------------------------------*/ -const int asyncUpdateFrequency = 10; - -/** - * The delay between two RDS updates (in seconds). - */ -const int rdsUpdateFrequency = 10; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -MasterPanelWindow :: MasterPanelWindow (void) - throw () - : GuiWindow(bundleName, - gladeFileName), - userIsLoggedIn(false) -{ - // load the station logo image - Gtk::Image * stationLogoImage; - glade->get_widget("stationLogoImage1", stationLogoImage); - stationLogoImage->set(gLiveSupport->getStationLogoPixbuf()); - - // set up the time label - glade->get_widget("timeLabel1", timeLabel); - Pango::Attribute fontDescriptionAttribute = - Pango::Attribute::create_attr_font_desc( - Pango::FontDescription( - "Bitstream Vera Sans Bold 20")); - fontDescriptionAttribute.set_start_index(0); - fontDescriptionAttribute.set_end_index(10); - Pango::AttrList timeLabelAttributes; - timeLabelAttributes.insert(fontDescriptionAttribute); - timeLabel->set_attributes(timeLabelAttributes); - - // register the signal handlers for the main window - glade->get_widget("mainWindow1", mainWindow); - mainWindow->signal_key_press_event().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onKeyPressed)); - - // create the Now Playing widget - Gtk::Box * nowPlayingBox; - glade->get_widget("nowPlayingWidget1", nowPlayingBox); - nowPlayingWidget.reset(new NowPlaying(this)); - - // get a reference for the window-opener buttons - glade->get_widget("liveModeButton1", liveModeButton); - glade->get_widget("uploadFileButton1", uploadFileButton); - glade->get_widget("scratchpadButton1", scratchpadButton); - glade->get_widget("playlistButton1", playlistButton); - glade->get_widget("schedulerButton1", schedulerButton); - glade->get_widget("searchButton1", searchButton); - glade->get_widget("optionsButton1", optionsButton); - - // get a reference for some other widgets - glade->get_widget("mainButtonBox1", mainButtonBox); - glade->get_widget("userInfoLabel1", userInfoLabel); - glade->get_widget("loginButton1", loginButton); - - // bind events to the buttons - liveModeButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onLiveModeButtonClicked)); - uploadFileButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onUploadFileButtonClicked)); - scratchpadButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onScratchpadButtonClicked)); - playlistButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onPlaylistButtonClicked)); - schedulerButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onSchedulerButtonClicked)); - searchButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onSearchButtonClicked)); - optionsButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onOptionsButtonClicked)); - - loginButton->signal_clicked().connect(sigc::mem_fun( - *this, - &MasterPanelWindow::onLoginButtonClicked)); - - // set the size and location of the window, according to the screen size - Glib::RefPtr screen = mainWindow->get_screen(); - mainWindow->set_default_size(screen->get_width(), -1); - mainWindow->move(0, 0); - - // show what's there to see - showAnonymousUI(); - updateUserInfo(); - - // set the timer, that will update timeLabel - setTimer(); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -MasterPanelWindow :: ~MasterPanelWindow (void) throw () -{ - resetTimer(); - gLiveSupport->stopOutputAudio(); - gLiveSupport->stopCueAudio(); -} - - -/*------------------------------------------------------------------------------ - * Change the language of the panel - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: changeLanguage (void) - throw () -{ - Ptr::Ref newBundle = gLiveSupport->getBundle( - bundleName); - setBundle(newBundle); - nowPlayingWidget->changeLanguage(); - - setTitle(getResourceUstring("windowTitle")); - - liveModeButton->set_label(*getResourceUstring( - "liveModeButtonLabel")); - uploadFileButton->set_label(*getResourceUstring( - "uploadFileButtonLabel")); - scratchpadButton->set_label(*getResourceUstring( - "scratchpadButtonLabel")); - playlistButton->set_label(*getResourceUstring( - "playlistButtonLabel")); - schedulerButton->set_label(*getResourceUstring( - "schedulerButtonLabel")); - searchButton->set_label(*getResourceUstring( - "searchButtonLabel")); - optionsButton->set_label(*getResourceUstring( - "optionsButtonLabel")); - - updateUserInfo(); - - if (!gLiveSupport->isStorageAvailable()) { - // gray out all the buttons except Options - liveModeButton->set_sensitive(false); - uploadFileButton->set_sensitive(false); - scratchpadButton->set_sensitive(false); - playlistButton->set_sensitive(false); - schedulerButton->set_sensitive(false); - searchButton->set_sensitive(false); - } -} - - -/*------------------------------------------------------------------------------ - * Set the timer - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: setTimer (void) throw () -{ - sigc::slot slot = sigc::bind(sigc::mem_fun(*this, - &MasterPanelWindow::onUpdateTime), - 0); - - // set the timer to activate every 1/somethingth of a second - timer.reset(new sigc::connection( - Glib::signal_timeout().connect(slot, 1000/updateTimeConstant))); -} - - -/*------------------------------------------------------------------------------ - * Clear the timer - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: resetTimer (void) throw () -{ - timer->disconnect(); - timer.reset(); -} - - -/*------------------------------------------------------------------------------ - * Update the timeLabel display, with the current time - *----------------------------------------------------------------------------*/ -bool -MasterPanelWindow :: onUpdateTime (int dummy) throw () -{ - Ptr::Ref now; - - if (gLiveSupport->isSchedulerAvailable()) { - try { - now = gLiveSupport->getScheduler()->getSchedulerTime(); - } catch (XmlRpcException &e) { - std::cerr << "Scheduler time is not available; " - << "switching to local time." << std::endl; - gLiveSupport->checkSchedulerClient(); - } - } else { - now = TimeConversion::now(); - } - - if (now.get()) { - time_duration dayTime = now->time_of_day(); - // get the time of day, only up to a second precision - time_duration dayTimeSec(dayTime.hours(), - dayTime.minutes(), - dayTime.seconds(), - 0); - - timeLabel->set_text(to_simple_string(dayTimeSec)); - } - - nowPlayingWidget->onUpdateTime(); - - // check on the progress of the async methods - static int backupCounter = 0; - if (backupCounter == 0) { - if (optionsWindow) { - Ptr::Ref backupList = optionsWindow->getBackupList(); - if (backupList) { - backupList->updateSilently(); - } - } - - if (searchWindow) { - searchWindow->onTimer(); - } - } - if (++backupCounter == updateTimeConstant * asyncUpdateFrequency) { - backupCounter = 0; - } - - // refresh all windows - gLiveSupport->runMainLoop(); - - // refresh the RDS display - static int rdsCounter = 0; - if (rdsCounter == 0) { - gLiveSupport->updateRds(); - } - if (++rdsCounter == updateTimeConstant * rdsUpdateFrequency) { - rdsCounter = 0; - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * The event when the Live Mode button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateLiveModeWindow (Ptr::Ref playable) - throw () -{ - if (!liveModeWindow.get()) { - liveModeWindow.reset(new LiveModeWindow(liveModeButton)); - gLiveSupport->loadWindowContents(liveModeWindow); - } - - liveModeWindow->show(); - liveModeWindow->getWindow()->present(); - - if (playable) { - liveModeWindow->addItem(playable); - } -} - - -/*------------------------------------------------------------------------------ - * The event when the upload file button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateUploadFileWindow (void) throw () -{ - if (!uploadFileWindow.get()) { - uploadFileWindow.reset(new UploadFileWindow(uploadFileButton)); - } - - uploadFileWindow->show(); - uploadFileWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * Create the Scratchpad window. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: createScratchpadWindow (void) - throw () -{ - if (!scratchpadWindow.get()) { - scratchpadWindow.reset(new ScratchpadWindow(scratchpadButton)); - gLiveSupport->loadWindowContents(scratchpadWindow); - } -} - - -/*------------------------------------------------------------------------------ - * The event when the Scratchpad button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateScratchpadWindow (Ptr::Ref playable) - throw () -{ - createScratchpadWindow(); - - if (playable) { - scratchpadWindow->addItem(playable); - } - - scratchpadWindow->show(); - scratchpadWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * The event when the Playlist button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updatePlaylistWindow (void) throw () -{ - if (!playlistWindow.get()) { - playlistWindow.reset(new PlaylistWindow(playlistButton)); - } - - playlistWindow->showContents(); - - playlistWindow->show(); - playlistWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * The event when the Scheduler button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateSchedulerWindow ( - Ptr::Ref time) - throw () -{ - if (!schedulerWindow.get()) { - try { - schedulerWindow.reset(new SchedulerWindow(schedulerButton)); - - } catch (XmlRpcException &e) { - std::cerr << e.what() << std::endl; - return; - } - } - - if (time.get()) { - schedulerWindow->setTime(time); - } - - try { - schedulerWindow->showContents(); - } catch (XmlRpcException &e) { - std::cerr << e.what() << std::endl; - return; - } - - schedulerWindow->show(); - schedulerWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * The event when the Search button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateSearchWindow (void) throw () -{ - if (!searchWindow.get()) { - searchWindow.reset(new SearchWindow(searchButton)); - } - - searchWindow->show(); - searchWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * The event when the Options button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateOptionsWindow (void) throw () -{ - if (!optionsWindow.get()) { - optionsWindow.reset(new OptionsWindow(optionsButton)); - Ptr::Ref backupList = optionsWindow->getBackupList(); - if (backupList) { - gLiveSupport->loadWindowContents(backupList.get()); - } - } - - optionsWindow->show(); - optionsWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * Show only the UI components that are visible when no one is logged in - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: showAnonymousUI (void) throw () -{ - mainButtonBox->hide(); - - if (liveModeWindow.get()) { - gLiveSupport->storeWindowContents(liveModeWindow); - if (liveModeWindow->getWindow()->is_visible()) { - liveModeWindow->hide(); - } - // the Live Mode window is not destroyed at logout, unlike the others - } - if (uploadFileWindow.get()) { - if (uploadFileWindow->getWindow()->is_visible()) { - uploadFileWindow->hide(); - } - uploadFileWindow.reset(); - } - if (scratchpadWindow.get()) { - gLiveSupport->storeWindowContents(scratchpadWindow); - if (scratchpadWindow->getWindow()->is_visible()) { - scratchpadWindow->hide(); - } - scratchpadWindow.reset(); - } - if (playlistWindow.get()) { - if (playlistWindow->getWindow()->is_visible()) { - playlistWindow->hide(); - } - playlistWindow.reset(); - } - if (schedulerWindow.get()) { - if (schedulerWindow->getWindow()->is_visible()) { - schedulerWindow->hide(); - } - schedulerWindow.reset(); - } - if (searchWindow.get()) { - if (searchWindow->getWindow()->is_visible()) { - searchWindow->hide(); - } - searchWindow.reset(); - } - if (optionsWindow.get()) { - Ptr::Ref backupList = optionsWindow->getBackupList(); - if (backupList) { - gLiveSupport->storeWindowContents(backupList.get()); - } - if (optionsWindow->getWindow()->is_visible()) { - optionsWindow->hide(); - } - optionsWindow.reset(); - } -} - - -/*------------------------------------------------------------------------------ - * Cancel the playlist edited in the PlaylistWindow, if any. - *----------------------------------------------------------------------------*/ -bool -MasterPanelWindow :: cancelEditedPlaylist (void) throw () -{ - if (playlistWindow) { - return playlistWindow->cancelPlaylist(); - } else { - return true; - } -} - - -/*------------------------------------------------------------------------------ - * Show the UI components that are visible to a specific user. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: showLoggedInUI (void) throw () -{ - mainButtonBox->show(); - - if (!gLiveSupport->isStorageAvailable()) { - liveModeButton->set_sensitive(false); - uploadFileButton->set_sensitive(false); - scratchpadButton->set_sensitive(false); - playlistButton->set_sensitive(false); - searchButton->set_sensitive(false); - } - - setSchedulerAvailable(gLiveSupport->isSchedulerAvailable()); - - if (liveModeWindow) { - liveModeWindow->updateStrings(); - if (liveModeWindow->isNotEmpty()) { - liveModeWindow->show(); - liveModeWindow->getWindow()->present(); - } - } -} - - -/*------------------------------------------------------------------------------ - * Get the next item from the top of the Live Mode window. - *----------------------------------------------------------------------------*/ -Ptr::Ref -MasterPanelWindow :: getNextItemToPlay (void) throw () -{ - if (liveModeWindow) { - return liveModeWindow->popTop(); - } else { - Ptr::Ref nullPointer; - return nullPointer; - } -} - - -/*------------------------------------------------------------------------------ - * Resize an image to fit in a box, preserving its aspect ratio. - *----------------------------------------------------------------------------*/ -void -LiveSupport::GLiveSupport:: -resizeImage (Gtk::Image* image, int width, int height) throw () -{ - Glib::RefPtr pixbuf = image->get_pixbuf(); - int imageWidth = pixbuf->get_width(); - int imageHeight = pixbuf->get_height(); - - if (imageWidth > width || imageHeight > height) { - if (imageWidth * height > imageHeight * width) { - // image is wide: squash horizontally - image->set(pixbuf->scale_simple(width, - (imageHeight * width)/imageWidth, - Gdk::INTERP_HYPER )); - } else { - // image is tall: squash vertically - image->set(pixbuf->scale_simple((imageWidth * height)/imageHeight, - height, - Gdk::INTERP_HYPER )); - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for a key pressed. - *----------------------------------------------------------------------------*/ -bool -MasterPanelWindow :: onKeyPressed (GdkEventKey * event) throw () -{ - if (event->type == GDK_KEY_PRESS) { - KeyboardShortcut::Action action = gLiveSupport->findAction( - "masterPanelWindow", - Gdk::ModifierType(event->state), - event->keyval); - switch (action) { - case KeyboardShortcut::playAudio : - - case KeyboardShortcut::pauseAudio : - nowPlayingWidget->onPlayAudio(); - return true; - - case KeyboardShortcut::stopAudio : - nowPlayingWidget->onStopAudio(); - return true; - - case KeyboardShortcut::nextTrack : - gLiveSupport->stopOutputAudio(); - gLiveSupport->onStop(); - return true; - - default : break; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * The event when the Search button has been clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: uploadToHub (Ptr::Ref playable) - throw () -{ - if (!searchWindow.get()) { - searchWindow.reset(new SearchWindow(searchButton)); - } - - searchWindow->uploadToHub(playable); - - searchWindow->show(); - searchWindow->getWindow()->present(); -} - - -/*------------------------------------------------------------------------------ - * Show or hide the Scheduler button. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: setSchedulerAvailable (bool status) throw () -{ - if (status == false) { - if (schedulerWindow && schedulerWindow->getWindow()->is_visible()) { - schedulerWindow->hide(); - } - } - - if (schedulerButton) { - schedulerButton->set_sensitive(status); - } -} - - -/*------------------------------------------------------------------------------ - * Update the cue player displays to show a stopped state. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: showCuePlayerStopped (void) throw () -{ - if (scratchpadWindow) { - scratchpadWindow->showCuePlayerStopped(); - } - - if (liveModeWindow) { - liveModeWindow->showCuePlayerStopped(); - } -} - - -/*------------------------------------------------------------------------------ - * Handle the event of the Login/Logout button being clicked. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: onLoginButtonClicked (void) throw () -{ - if (userIsLoggedIn) { - logout(); - } else { - login(); - } -} - - -/*------------------------------------------------------------------------------ - * Let the user log in. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: login (void) throw () -{ - Ptr::Ref loginWindow(new LoginWindow()); - userIsLoggedIn = loginWindow->run(); - - if (userIsLoggedIn) { - Ptr::Ref loginName = loginWindow->getLogin(); - updateUserInfo(loginName); - showLoggedInUI(); - - } else { - // TODO: display an "incorrect login" dialog - } -} - - -/*------------------------------------------------------------------------------ - * Let the user log out. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: logout (void) throw () -{ - bool userCanceledTheLogout = !gLiveSupport->logout(); - if (userCanceledTheLogout) { - return; - } - - userIsLoggedIn = false; - updateUserInfo(); -} - - -/*------------------------------------------------------------------------------ - * Show the user info and the login button. - *----------------------------------------------------------------------------*/ -void -MasterPanelWindow :: updateUserInfo (Ptr::Ref loginName) - throw () -{ - if (userIsLoggedIn) { - Ptr::Ref logoutButtonLabel; - Ptr::Ref loggedInMsg; - - logoutButtonLabel = getResourceUstring("logoutButtonLabel"); - loggedInMsg = formatMessage("loggedInMsg", *loginName); - - loginButton->set_label(*logoutButtonLabel); - userInfoLabel->set_label(*loggedInMsg); - - } else { - Ptr::Ref loginButtonLabel; - Ptr::Ref notLoggedInMsg; - - loginButtonLabel = getResourceUstring("loginButtonLabel"); - notLoggedInMsg = getResourceUstring("notLoggedInMsg"); - - loginButton->set_label(*loginButtonLabel); - userInfoLabel->set_label(*notLoggedInMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for when the user closes the master panel. - *----------------------------------------------------------------------------*/ -bool -MasterPanelWindow :: onDeleteEvent (GdkEventAny * event) throw () -{ - Gtk::ResponseType response = gLiveSupport->runNoYesDialog( - *getResourceUstring("sureToExitMsg")); - if (response != Gtk::RESPONSE_YES) { - return true; - } - - gLiveSupport->logout(); - gLiveSupport->stopOutputAudio(); - - Ptr::Ref optionsContainer - = gLiveSupport->getOptionsContainer(); - if (optionsContainer && optionsContainer->isTouched()) { - optionsContainer->writeToFile(); - } - - return false; -} - diff --git a/src/products/gLiveSupport/src/MasterPanelWindow.h b/src/products/gLiveSupport/src/MasterPanelWindow.h deleted file mode 100644 index 0bf2c45bf..000000000 --- a/src/products/gLiveSupport/src/MasterPanelWindow.h +++ /dev/null @@ -1,610 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef MasterPanelWindow_h -#define MasterPanelWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" - -#include "GuiWindow.h" -#include "GLiveSupport.h" -#include "NowPlaying.h" -#include "LiveModeWindow.h" -#include "UploadFileWindow.h" -#include "ScratchpadWindow.h" -#include "PlaylistWindow.h" -#include "SchedulerWindow.h" -#include "SearchWindow.h" -#include "OptionsWindow.h" - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The master panel window. - * - * The layout of the window is roughly the following: - *

- *  +--- master panel ---------------------------------+
- *  | + time + + now ----+ + VU meter + + radio logo + |
- *  | |      | | playing | |          | |            | |
- *  | |      | |         | +----------+ |            | |
- *  | |      | |         | + next ----+ |            | |
- *  | |      | |         | | playing  | |            | |
- *  | +------+ +---------+ +----------+ +------------+ |
- *  | +-- bottom bar --------------------------------+ |
- *  | | +-- button bar -----------+ +-- user info -+ | |
- *  | +----------------------------------------------+ |
- *  +--------------------------------------------------+
- *  
- * - * The layout of the window is contained in the file - * "var/glade/MasterPanelWindow.glade". - * - */ -class MasterPanelWindow : public GuiWindow -{ - private: - - /** - * Whether a user is currently logged in. - */ - bool userIsLoggedIn; - - /** - * Log in. - */ - void - login (void) throw (); - - /** - * Log out. - */ - void - logout (void) throw (); - - - protected: - - /** - * The time display - */ - Gtk::Label * timeLabel; - - /** - * The signal connection, that is notified by the GTK timer each - * second, and will update the time display on each wakeup. - */ - Ptr::Ref timer; - - /** - * The 'now playing' display. - */ - Ptr::Ref nowPlayingWidget; - - /** - * The button to invoke the Live Mode window. - */ - Gtk::ToggleButton * liveModeButton; - - /** - * The button to invoke the Upload File window. - */ - Gtk::ToggleButton * uploadFileButton; - - /** - * The button to invoke the Scratchpad window. - */ - Gtk::ToggleButton * scratchpadButton; - - /** - * The button to invoke the Playlist Window. - */ - Gtk::ToggleButton * playlistButton; - - /** - * The button to invoke the Scheduler Window. - */ - Gtk::ToggleButton * schedulerButton; - - /** - * The button to invoke the Search Window. - */ - Gtk::ToggleButton * searchButton; - - /** - * The button to invoke the Options window. - */ - Gtk::ToggleButton * optionsButton; - - /** - * The box containing the window opener buttons. - */ - Gtk::ButtonBox * mainButtonBox; - - /** - * The label for the "logged in as" info. - */ - Gtk::Label * userInfoLabel; - - /** - * The button to log in or log out. - */ - Gtk::Button * loginButton; - - /** - * The one and only Live Mode window. - */ - Ptr::Ref liveModeWindow; - - /** - * The one and only Upload File window. - */ - Ptr::Ref uploadFileWindow; - - /** - * The one and only Scratchpad window. - */ - Ptr::Ref scratchpadWindow; - - /** - * The one and only simple playlist management window. - */ - Ptr::Ref playlistWindow; - - /** - * The one and only scheduler window. - */ - Ptr::Ref schedulerWindow; - - /** - * The one and only search window. - */ - Ptr::Ref searchWindow; - - /** - * The one and only options window. - */ - Ptr::Ref optionsWindow; - - /** - * Function that updates timeLabel with the current time. - * This is called by GTK at regular intervals. - * - * @param dummy a dummy, unused parameter - * @return true if the timer should call this function again, - * false if the timer should be canceled - */ - virtual bool - onUpdateTime (int dummy) throw (); - - /** - * Register onUpdateTime with the GTK timer. - * - * @see #resetTimer - */ - virtual void - setTimer (void) throw (); - - /** - * Stop the timer, which was set by setTimer(). - * - * @see #setTimer - */ - virtual void - resetTimer (void) throw (); - - /** - * Function to catch the event of the file upload button being - * pressed. - */ - virtual void - onUploadFileButtonClicked (void) throw () - { - if (!uploadFileWindow || - uploadFileWindow && !uploadFileWindow->getWindow() - ->is_visible()) { - updateUploadFileWindow(); - } else { - uploadFileWindow->hide(); - } - } - - /** - * Function to catch the event of the live mode button being - * pressed. - */ - virtual void - onLiveModeButtonClicked (void) throw () - { - if (!liveModeWindow || - liveModeWindow && !liveModeWindow->getWindow() - ->is_visible()) { - updateLiveModeWindow(); - } else { - liveModeWindow->hide(); - } - } - - /** - * Function to catch the event of the Scratchpad button being - * pressed. - */ - virtual void - onScratchpadButtonClicked (void) throw () - { - if (!scratchpadWindow || - scratchpadWindow && !scratchpadWindow->getWindow() - ->is_visible()) { - updateScratchpadWindow(); - } else { - scratchpadWindow->hide(); - } - } - - /** - * Function to catch the event of the Simple Playlist - * Management button being pressed. - */ - virtual void - onPlaylistButtonClicked (void) throw () - { - if (!playlistWindow || - playlistWindow && !playlistWindow->getWindow() - ->is_visible()) { - updatePlaylistWindow(); - } else { - playlistWindow->hide(); - } - } - - /** - * Function to catch the event of the Scheduler button - * button being pressed. - */ - virtual void - onSchedulerButtonClicked (void) throw () - { - if (!schedulerWindow || - schedulerWindow && !schedulerWindow->getWindow() - ->is_visible()) { - updateSchedulerWindow(); - } else { - schedulerWindow->hide(); - } - } - - /** - * Function to catch the event of the Search button - * button being pressed. - */ - virtual void - onSearchButtonClicked (void) throw () - { - if (!searchWindow || - searchWindow && !searchWindow->getWindow() - ->is_visible()) { - updateSearchWindow(); - } else { - searchWindow->hide(); - } - } - - /** - * Function to catch the event of the Options button - * button being pressed. - */ - virtual void - onOptionsButtonClicked (void) throw () - { - if (!optionsWindow || - optionsWindow && !optionsWindow->getWindow() - ->is_visible()) { - updateOptionsWindow(); - } else { - optionsWindow->hide(); - } - } - - /** - * Function to catch the event of the Login/Logout button - * button being pressed. - */ - virtual void - onLoginButtonClicked (void) throw (); - - /** - * Signal handler for a key pressed at one of the entries. - * The keys can be customized by the keyboardShortcutContainer - * element in the gLiveSupport configuration file. - * - * The action handled is: playAudio, pauseAudio, stopAudio, - * and nextTrack. - * - * @param event the button event received - * @return true if the key press was fully handled, false if not - */ - bool - onKeyPressed (GdkEventKey * event) throw (); - - /** - * Event handler for when the user closes the master panel. - * It pops up a confirmation dialog. - * - * Overrides GuiWindow::onDeleteEvent(). - * - * @param event attributes of the event. - * @return true if handled the event, false to continue deleting. - */ - virtual bool - onDeleteEvent (GdkEventAny * event) throw (); - - - public: - - /** - * Constructor. - */ - MasterPanelWindow (void) throw (); - - /** - * Virtual destructor. - */ - virtual - ~MasterPanelWindow (void) throw (); - - /** - * Change the user interface language of the application. - * - * This is called by GLiveSupport, when its own locale changes. - * - * This method assumes that only the MasterPanelWindow is visible, - * and will only change the language of the currently open - * MasterPanelWindow. No other open windows will be affected by - * this call, but subsequently opened windows are. - */ - void - changeLanguage (void) throw (); - - /** - * Show the UI components that are visible when no one is logged in. - */ - void - showAnonymousUI (void) throw (); - - /** - * Cancel the playlist edited in the PlaylistWindow. - * - * @return true if the canceling worked (or if there was nothing - * to cancel); false if the user canceled the canceling - * @see PlaylistWindow::cancelPlaylist() - */ - bool - cancelEditedPlaylist (void) throw (); - - /** - * Show the UI components that are visible when someone is logged in. - */ - void - showLoggedInUI (void) throw (); - - /** - * Update the Live Mode window. - * - * @param playable (optional) add this item to the bottom of - * the live mode window. - */ - void - updateLiveModeWindow (Ptr::Ref playable - = Ptr::Ref()) - throw (); - - /** - * Refresh the playlist in the Live Mode window. - * Updates the playlist to the new copy supplied in the argument, - * if it is present in the Live Mode window. - * This is called by GLiveSupport::savePlaylist() after the playlist - * has been edited. - * - * @param playlist the new version of the playlist. - */ - void - refreshPlaylistInLiveMode (Ptr::Ref playlist) - throw () - { - if (liveModeWindow) { - liveModeWindow->refreshPlaylist(playlist); - } - } - - /** - * Create the Scratchpad window. - */ - void - createScratchpadWindow (void) throw (); - - /** - * Update the Upload File window. - */ - void - updateUploadFileWindow (void) throw (); - - /** - * Update the Scratchpad window. - */ - void - updateScratchpadWindow (Ptr::Ref playable - = Ptr::Ref()) - throw (); - - /** - * Update the Simple Playlist Management Window - */ - void - updatePlaylistWindow (void) throw (); - - /** - * Update the Scheduler Window, optionally to display a new time. - * - * @param time the time to display in the scheduler window. - */ - void - updateSchedulerWindow (Ptr::Ref time - = Ptr::Ref()) - throw (); - - /** - * Update the Search Window. - */ - void - updateSearchWindow (void) throw (); - - /** - * Update the Options Window - */ - void - updateOptionsWindow (void) throw (); - - /** - * Update the User info. - * - * @param loginName the login name (only when userIsLoggedIn). - */ - void - updateUserInfo (Ptr::Ref loginName - = Ptr::Ref()) - throw (); - - /** - * Get the next item from the top of the Live Mode window. - * The item is removed from the Live Mode window. - * - * @return the item at the top of the Live Mode window, a 0 pointer - * if there is no Live Mode window, or it is empty. - */ - Ptr::Ref - getNextItemToPlay (void) throw (); - - /** - * Set the "now playing" display. - * - * @param playable the Playable whose data is to be displayed. - */ - void - setNowPlaying (Ptr::Ref playable) throw () - { - nowPlayingWidget->setPlayable(playable); - gLiveSupport->updateRds(); - } - - /** - * Get the Playable currently shown in the "now playing" display. - * - * @return the currently playing item; 0 if nothing is playing. - */ - Ptr::Ref - getCurrentInnerPlayable (void) throw () - { - return nowPlayingWidget->getCurrentInnerPlayable(); - } - - /** - * Set the Playable currently shown in the "now playing" display. - * - * @return the currently playing item; 0 if nothing is playing. - */ - void - setCurrentInnerPlayable (gint64 id) throw () - { - nowPlayingWidget->setCurrentInnerPlayable(id); - } - - /** - * Upload a Playable object to the network hub. - * And display it in the Transports tab of the Search Window. - * - * @param playable the audio clip or playlist to be uploaded. - */ - void - uploadToHub (Ptr::Ref playable) throw (); - - /** - * Show or hide the Scheduler button. - * - * @param status true means show the button, false means hide. - */ - void - setSchedulerAvailable (bool status) throw (); - - /** - * Update the cue player displays to show a stopped state. - * Two cue player displays are updated by this method: - * one in the Scratchpad, and one in the Live Mode window. - */ - void - showCuePlayerStopped (void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - -/** - * Resize an image to fit in a box, preserving its aspect ratio. - * - * @param image the image to resize (modified by the method) - * @param width the width of the box - * @param height the height of the box - */ -void -resizeImage(Gtk::Image* image, int width, int height) throw (); - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // MasterPanelWindow_h - diff --git a/src/products/gLiveSupport/src/NowPlaying.cxx b/src/products/gLiveSupport/src/NowPlaying.cxx deleted file mode 100644 index 1c4c8391a..000000000 --- a/src/products/gLiveSupport/src/NowPlaying.cxx +++ /dev/null @@ -1,506 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Widgets/Colors.h" - -#include "NowPlaying.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/** - * This should be 1/4th of MasterPanelWindow::updateTimeConstant. - */ -const int blinkingConstant = 5; - -/** - * The string which identifies the Play stock image. - */ -const Glib::ustring playStockImageName = "gtk-media-play"; - -/** - * The string which identifies the Pause stock image. - */ -const Glib::ustring pauseStockImageName = "gtk-media-pause"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -NowPlaying :: NowPlaying (GuiObject * parent) - throw () - : GuiComponent(parent) -{ - glade->get_widget("playButton1", playButton); - glade->get_widget("stopButton1", stopButton); - - playButton->signal_clicked().connect(sigc::mem_fun(*this, - &NowPlaying::onPlayButtonClicked )); - stopButton->signal_clicked().connect(sigc::mem_fun(*this, - &NowPlaying::onStopButtonClicked )); - - isActive = false; - isPaused = false; - - glade->get_widget("titleLabel1", titleLabel); - glade->get_widget("creatorLabel1", creatorLabel); - glade->get_widget("elapsedTimeLabel1", elapsedTimeLabel); - glade->get_widget("remainsTimeEventBox1", remainsTimeBox); - glade->get_widget("remainsTimeLabel1", remainsTimeLabel); - glade->get_widget("playlistLabel1", playlistLabel); - setStyle(titleLabel, 14); - setStyle(creatorLabel, 8); - setStyle(elapsedTimeLabel, 16); - setStyle(remainsTimeLabel, 16); - setStyle(playlistLabel, 8); - - glade->get_widget("elapsedTimeText1", elapsedTimeText); - glade->get_widget("remainsTimeText1", remainsTimeText); - setStyle(elapsedTimeText, 7); - setStyle(remainsTimeText, 7); - elapsedTimeText->set_text(*getResourceUstring("elapsedTimeLabel")); - remainsTimeText->set_text(*getResourceUstring("remainingTimeLabel")); - - glade->get_widget("progressBar1", progressBar); - - Ptr::Ref nullPointer; - setPlayable(nullPointer); -} - - -/*------------------------------------------------------------------------------ - * Set the font and size of a label. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: setStyle (Gtk::Label * label, - int fontSize) throw () -{ - Pango::FontDescription fontDescription; - fontDescription.set_family("Bitstream Vera Sans"); - fontDescription.set_weight(Pango::WEIGHT_BOLD); - fontDescription.set_size(fontSize * Pango::SCALE); - - Pango::Attribute fontDescriptionAttribute = - Pango::Attribute::create_attr_font_desc( - fontDescription); - fontDescriptionAttribute.set_start_index(0); - fontDescriptionAttribute.set_end_index(255); - - Pango::AttrList attributeList; - attributeList.insert(fontDescriptionAttribute); - label->set_attributes(attributeList); -} - -void -NowPlaying :: setCurrentInnerPlayable (gint64 id) throw () -{ - playableMutex.lock(); - //keep this for future use - if((gint64)currentInnerPlayable->getId()->getId() != id) - { - //we are not playing a correct file, must have had an error - adjust the playlist -//std::cout << "NowPlaying :: setCurrentInnerPlayable ERROR DETECTED! called = " << id << ", current = " << (gint64)currentInnerPlayable->getId()->getId() << std::endl; - } - else{ -//std::cout << "NowPlaying :: setCurrentInnerPlayable CORRECT!" << std::endl; - } - playableMutex.unlock(); -} - -/*------------------------------------------------------------------------------ - * Set the title etc. of the playable shown in the widget. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: setPlayable (Ptr::Ref playable) throw () -{ - playableMutex.lock(); - // BEGIN synchronized block - - if (playable) { - if (!isActive || isPaused) { - playButton->set_label(pauseStockImageName); - } - playButton->set_sensitive(true); - stopButton->set_sensitive(true); - - this->playable = playable; - isActive = true; - isPaused = false; - resetRemainsTimeState(); - - remainsTimeCounter++; - if (remainsTimeCounter == 2*blinkingConstant) { - remainsTimeCounter = 0; - } - - Ptr::Ref elapsed; - try { - elapsed = gLiveSupport->getOutputAudioPosition(); - } catch (std::logic_error &e) { - elapsed.reset(new time_duration(microseconds(0))); - } - - Ptr::Ref totalLength - = TimeConversion::roundToNearestSecond( - playable->getPlaylength()); - Ptr::Ref remains(new time_duration( - *totalLength - *elapsed)); - switch (remainsTimeState) { - case TIME_GREEN : - if (*remains <= seconds(20)) { - remainsTimeState = TIME_YELLOW; - } - break; - - case TIME_YELLOW : - if (*remains <= seconds(10)) { - remainsTimeState = TIME_RED; - } - break; - - case TIME_RED : - break; - } - setRemainsTimeColor(remainsTimeState); - - Ptr::Ref innerPlayable = playable; - Ptr::Ref innerElapsed = elapsed; - Ptr::Ref innerRemains = remains; - Glib::ustring playlistInfo; - bool isFirst = true; - - while (innerPlayable->getType() == Playable::PlaylistType) { - if (isFirst) { - isFirst = false; - } else { - playlistInfo += " >>> "; - } - playlistInfo += *innerPlayable->getTitle(); - playlistInfo += " ["; - playlistInfo += *TimeConversion::timeDurationToHhMmSsString(innerRemains); - playlistInfo += "/"; - playlistInfo += *TimeConversion::timeDurationToHhMmSsString(innerPlayable->getPlaylength()); - playlistInfo += "]"; - - Ptr::Ref element = innerPlayable->getPlaylist()->findAtOffset(elapsed); - if (!element) { - break; - } - innerPlayable = element->getPlayable(); - *innerElapsed -= *element->getRelativeOffset(); - *innerRemains = *TimeConversion::roundToNearestSecond( - innerPlayable->getPlaylength()) - *innerElapsed; - } - - playlistLabel->set_text(playlistInfo); - - titleLabel->set_text(*innerPlayable->getTitle()); - - Ptr::Ref - creator = innerPlayable->getMetadata("dc:creator"); - if (creator) { - creatorLabel->set_text(*creator); - } else { - creatorLabel->set_text(""); - } - - elapsedTimeLabel->set_text(*TimeConversion::timeDurationToHhMmSsString(innerElapsed )); - remainsTimeLabel->set_text(*TimeConversion::timeDurationToHhMmSsString(innerRemains )); - - long elapsedMilliSec = innerElapsed->total_milliseconds(); - long totalMilliSec = elapsedMilliSec - + innerRemains->total_milliseconds(); - double fraction = double(elapsedMilliSec) / double(totalMilliSec); - if (fraction < 0.0) { - fraction = 0.0; // can't happen afaik - } - if (fraction > 1.0) { - fraction = 1.0; // can and does happen! - } - progressBar->set_fraction(fraction); - - currentInnerPlayable = innerPlayable; - } else { - if (isActive && !isPaused) { - playButton->set_label(playStockImageName); - isActive = false; - } - playButton->set_sensitive(false); - stopButton->set_sensitive(false); - - titleLabel->set_text(""); - creatorLabel->set_text(""); - elapsedTimeLabel->set_text(""); - remainsTimeLabel->set_text(""); - playlistLabel->set_text(""); - progressBar->set_fraction(0); - resetRemainsTimeState(); - this->playable.reset(); - this->currentInnerPlayable.reset(); - } - - // END synchronized block - playableMutex.unlock(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Play button being clicked. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: onPlayButtonClicked (void) throw () -{ - if (isActive) { - if (isPaused) { - gLiveSupport->pauseOutputAudio(); // i.e., restart - playButton->set_label(pauseStockImageName); - isPaused = false; - } else { - gLiveSupport->pauseOutputAudio(); - playButton->set_label(playStockImageName); - isPaused = true; - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Stop button being clicked. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: onStopButtonClicked (void) throw () -{ - if (isActive) { - gLiveSupport->stopOutputAudio(); // triggers a call to GLiveSupport:: - } // onStop(), which in turn calls -} // setPlayable() with a 0 argument - - -/*------------------------------------------------------------------------------ - * Update the timer displays. This is called every second by the master panel. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: onUpdateTime (void) throw () -{ - if (!isActive) { - return; - } - - remainsTimeCounter++; - if (remainsTimeCounter == 2*blinkingConstant) { - remainsTimeCounter = 0; - } - - Ptr::Ref elapsed; - try { - elapsed = gLiveSupport->getOutputAudioPosition(); - - } catch (std::logic_error &e) { - // just act as if nothing has happened - return; - } - - Ptr::Ref totalLength - = TimeConversion::roundToNearestSecond( - playable->getPlaylength()); - Ptr::Ref remains(new time_duration( - *totalLength - *elapsed)); - switch (remainsTimeState) { - case TIME_GREEN : - if (*remains <= seconds(20)) { - remainsTimeState = TIME_YELLOW; - } - break; - - case TIME_YELLOW : - if (*remains <= seconds(10)) { - remainsTimeState = TIME_RED; - } - break; - - case TIME_RED : - break; - } - setRemainsTimeColor(remainsTimeState); - - if (!playableMutex.tryLock()) { // if the 'playable' variable is being - return; // written to, then just give up for now - } - // BEGIN synchronized block - - if (!playable) { - playableMutex.unlock(); - return; - } - Ptr::Ref innerPlayable = playable; - Ptr::Ref innerElapsed = elapsed; - Ptr::Ref innerRemains = remains; - Glib::ustring playlistInfo; - bool isFirst = true; - - while (innerPlayable->getType() == Playable::PlaylistType) { - if (isFirst) { - isFirst = false; - } else { - playlistInfo += " >>> "; - } - playlistInfo += *innerPlayable->getTitle(); - playlistInfo += " ["; - playlistInfo += *TimeConversion::timeDurationToHhMmSsString( - innerRemains); - playlistInfo += "/"; - playlistInfo += *TimeConversion::timeDurationToHhMmSsString( - innerPlayable->getPlaylength()); - playlistInfo += "]"; - - Ptr::Ref element - = innerPlayable->getPlaylist() - ->findAtOffset(elapsed); - if (!element) { - break; - } - innerPlayable = element->getPlayable(); - *innerElapsed -= *element->getRelativeOffset(); - *innerRemains = *TimeConversion::roundToNearestSecond( - innerPlayable->getPlaylength()) - - *innerElapsed; - } - - playlistLabel->set_text(playlistInfo); - - titleLabel->set_text(*innerPlayable->getTitle()); - - Ptr::Ref - creator = innerPlayable->getMetadata("dc:creator"); - if (creator) { - creatorLabel->set_text(*creator); - } else { - creatorLabel->set_text(""); - } - - elapsedTimeLabel->set_text(*TimeConversion::timeDurationToHhMmSsString( - innerElapsed )); - remainsTimeLabel->set_text(*TimeConversion::timeDurationToHhMmSsString( - innerRemains )); - - long elapsedMilliSec = innerElapsed->total_milliseconds(); - long totalMilliSec = elapsedMilliSec - + innerRemains->total_milliseconds(); - double fraction = double(elapsedMilliSec) / double(totalMilliSec); - if (fraction < 0.0) { - fraction = 0.0; // can't happen afaik - } - if (fraction > 1.0) { - fraction = 1.0; // can and does happen! - } - progressBar->set_fraction(fraction); - - currentInnerPlayable = innerPlayable; - - // END synchronized block - playableMutex.unlock(); -} - - -/*------------------------------------------------------------------------------ - * Set the background color of the "remains time" label. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: setRemainsTimeColor (RemainsTimeStateType state) throw () -{ - bool isBlinkOn = (remainsTimeCounter < blinkingConstant); - - if (isBlinkOn) { - switch (state) { - case TIME_GREEN: - remainsTimeBox->unset_bg(Gtk::STATE_NORMAL); - break; - - case TIME_YELLOW: - remainsTimeBox->modify_bg(Gtk::STATE_NORMAL, - Colors::getColor(Colors::Yellow)); - break; - - case TIME_RED: - remainsTimeBox->modify_bg(Gtk::STATE_NORMAL, - Colors::getColor(Colors::Red)); - break; - } - } else { - remainsTimeBox->unset_bg(Gtk::STATE_NORMAL); - } - - gLiveSupport->runMainLoop(); -} - - -/*------------------------------------------------------------------------------ - * Reset all remains-time-blinking related variables. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: resetRemainsTimeState (void) throw () -{ - remainsTimeState = TIME_GREEN; - remainsTimeCounter = 0; - setRemainsTimeColor(TIME_GREEN); -} - - -/*------------------------------------------------------------------------------ - * Change the language of the widget. - *----------------------------------------------------------------------------*/ -void -NowPlaying :: changeLanguage (void) - throw () -{ - setBundle(parent->getBundle()); - - elapsedTimeText->set_text(*getResourceUstring("elapsedTimeLabel")); - remainsTimeText->set_text(*getResourceUstring("remainingTimeLabel")); -} - - diff --git a/src/products/gLiveSupport/src/NowPlaying.h b/src/products/gLiveSupport/src/NowPlaying.h deleted file mode 100644 index 75bbaaf29..000000000 --- a/src/products/gLiveSupport/src/NowPlaying.h +++ /dev/null @@ -1,318 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef NowPlaying_h -#define NowPlaying_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Mutex.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The box displaying "now playing" in the master panel. - * - */ -class NowPlaying : public GuiComponent -{ - private: - - /** - * Whether anything is shown in the widget. - */ - bool isActive; - - /** - * Whether the pause button has been clicked. - */ - bool isPaused; - - /** - * The item which is currently playing (audio clip or playlist). - */ - Ptr::Ref playable; - - /** - * The audio clip which is currently playing (could be nested - * several levels inside the "playable" object). - */ - Ptr::Ref currentInnerPlayable; - - /** - * The label holding the title of the now playing item. - */ - Gtk::Label * titleLabel; - - /** - * The label holding the creator of the now playing item. - */ - Gtk::Label * creatorLabel; - - /** - * The label holding the playlist containing the audio clip - * which is playing now (if any). - */ - Gtk::Label * playlistLabel; - - /** - * The progress bar. - */ - Gtk::ProgressBar * progressBar; - - /** - * The label which says "elapsed time". - */ - Gtk::Label * elapsedTimeText; - - /** - * The label holding the elapsed time. - */ - Gtk::Label * elapsedTimeLabel; - - /** - * The label which says "remaining time". - */ - Gtk::Label * remainsTimeText; - - /** - * The label holding the remaining time. - */ - Gtk::Label * remainsTimeLabel; - - /** - * A box around the remaining time label, so we can modify its color. - */ - Gtk::EventBox * remainsTimeBox; - - /** - * The play button. - */ - Gtk::Button * playButton; - - /** - * The stop button. - */ - Gtk::Button * stopButton; - - /** - * The possible states of the 'time remains' label. - */ - typedef enum { TIME_GREEN, TIME_YELLOW, TIME_RED } - RemainsTimeStateType; - - /** - * The current state of the 'time remains' label. - */ - RemainsTimeStateType remainsTimeState; - - /** - * Counter which makes the 'time remains' label blink. - */ - int remainsTimeCounter; - - /** - * A mutex to make the writing, and some reading, of the - * 'playable' variable atomic. - */ - Mutex playableMutex; - - /** - * Default constructor. - */ - NowPlaying (void) throw (); - - /** - * Event handler for the Play button being clicked. - */ - void - onPlayButtonClicked (void) throw (); - - /** - * Event handler for the Stop button being clicked. - */ - void - onStopButtonClicked (void) throw (); - - /** - * Set the color of the 'remains time' label. - * - * It sets the background color of the label to blue, yellow or red, - * depending on the remainsTimeState and the remainsTimeCounter - * variables. - * - * @param state the new state of the label. - */ - void - setRemainsTimeColor (RemainsTimeStateType state) - throw (); - - /** - * Reset all remains-time-blinking related variables. - * - * Sets remainsTimeState to TIME_GREEN, remainsTimeCounter to 0, - * and the background color of the label to blue. - */ - void inline - resetRemainsTimeState (void) throw (); - - /** - * Sets the font and size of the label. - * - * @param label the label the style of which we want to set. - * @param fontSize the font size for the label. - */ - void - setStyle (Gtk::Label * label, - int fontSize) - throw (); - - - public: - - /** - * Constructor with parent and localization parameter. - * - * @param parent the GuiObject which contains this one. - */ - NowPlaying (GuiObject * parent) - throw (); - - /** - * A virtual destructor. - */ - virtual - ~NowPlaying (void) throw () - { - } - - /** - * Set the title etc. of the now playing item. - * - * @param playable the playable to be displayed - */ - void - setPlayable (Ptr::Ref playable) throw (); - - /** - * Function that updates the elapsed and remaining time displays. - * This is called by the MasterPanelWindow every second. - */ - void - onUpdateTime (void) throw (); - - /** - * Public interface for restarting the audio. - * - * This is used by MasterPanelWindow::onKeyPressed(). - */ - void - onPlayAudio (void) throw () - { - onPlayButtonClicked(); - } - - /** - * Public interface for stopping the audio. - * - * This is used by MasterPanelWindow::onKeyPressed(). - */ - void - onStopAudio (void) throw () - { - onStopButtonClicked(); - } - - /** - * Get the Playable object which is playing now. - * If a playlist is playing, does not return the playlist, but - * the audio clip inside the playlist (possibly several levels deep). - * - * This is used by GLiveSupport::substituteRdsData(). - * - * @return the currently playing item; 0 if nothing is playing. - */ - Ptr::Ref - getCurrentInnerPlayable (void) throw () - { - return currentInnerPlayable; - } - - /** - * Set the Playable object which is playing now. - * If a playlist is playing, does not return the playlist, but - * the audio clip inside the playlist (possibly several levels deep). - * - * This is used by GLiveSupport::substituteRdsData(). - * - * @return void - */ - void - setCurrentInnerPlayable (gint64 id) throw (); - - /** - * Change the user interface language of the widget. - * - * This is called by the parent when its locale has changed; - * NowPlaying then updates its own bundle to match the parent's. - */ - void - changeLanguage (void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // NowPlaying_h - diff --git a/src/products/gLiveSupport/src/OptionsWindow.cxx b/src/products/gLiveSupport/src/OptionsWindow.cxx deleted file mode 100644 index 49046e529..000000000 --- a/src/products/gLiveSupport/src/OptionsWindow.cxx +++ /dev/null @@ -1,785 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "OptionsWindow.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "optionsWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "OptionsWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -OptionsWindow :: OptionsWindow (Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton) -{ - bool canBackup = (gLiveSupport->getSessionId() - && gLiveSupport->isStorageAvailable()); - - // build up the notepad for the various sections - glade->get_widget("mainNotebook1", mainNotebook); - constructSoundSection(); - constructKeyBindingsSection(); - constructServersSection(); - constructSchedulerSection(); - if (canBackup) { - constructBackupSection(); - } - constructRdsSection(); - constructAboutSection(); - - Gtk::Label * soundTabLabel; - Gtk::Label * keyBindingsTabLabel; - Gtk::Label * serversTabLabel; - Gtk::Label * schedulerTabLabel; - Gtk::Label * backupTabLabel; - Gtk::Label * rdsTabLabel; - Gtk::Label * aboutTabLabel; - glade->get_widget("soundTabLabel1", soundTabLabel); - glade->get_widget("keyBindingsTabLabel1", keyBindingsTabLabel); - glade->get_widget("serversTabLabel1", serversTabLabel); - glade->get_widget("schedulerTabLabel1", schedulerTabLabel); - glade->get_widget("backupTabLabel1", backupTabLabel); - glade->get_widget("rdsTabLabel1", rdsTabLabel); - glade->get_widget("aboutTabLabel1", aboutTabLabel); - soundTabLabel->set_label(*getResourceUstring("soundSectionLabel")); - keyBindingsTabLabel->set_label(*getResourceUstring( - "keyBindingsSectionLabel")); - serversTabLabel->set_label(*getResourceUstring("serversSectionLabel")); - schedulerTabLabel->set_label(*getResourceUstring("schedulerSectionLabel")); - if (canBackup) { - backupTabLabel->set_label(*getResourceUstring("backupSectionLabel")); - } - rdsTabLabel->set_label(*getResourceUstring("rdsSectionLabel")); - aboutTabLabel->set_label(*getResourceUstring("aboutSectionLabel")); - - // bind events - glade->connect_clicked("applyButton1", sigc::mem_fun(*this, - &OptionsWindow::onApplyButtonClicked)); - glade->connect_clicked("cancelButton1", sigc::mem_fun(*this, - &OptionsWindow::onCancelButtonClicked)); - glade->connect_clicked("okButton1", sigc::mem_fun(*this, - &OptionsWindow::onOkButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Cancel button. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onCancelButtonClicked(void) throw () -{ - resetEntries(); - resetKeyBindings(); - resetRds(); - onCloseButtonClicked(false); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Apply button. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onApplyButtonClicked(void) throw () -{ - bool changed = saveChangesInStringEntryFields(); - saveChangesInKeyBindings(); // no need to restart - saveChangesInRds(); // no need to restart - - if (changed) { - gLiveSupport->displayMessageWindow(*getResourceUstring( - "needToRestartMsg")); - } -} - - -/*------------------------------------------------------------------------------ - * Save the changes in the string entry fields. - *----------------------------------------------------------------------------*/ -bool -OptionsWindow :: saveChangesInStringEntryFields(void) throw () -{ - Ptr::Ref - optionsContainer = gLiveSupport->getOptionsContainer(); - - bool changed = false; - StringEntryListType::const_iterator it; - for (it = stringEntryList.begin(); it != stringEntryList.end(); ++it) { - - OptionsContainer::OptionItemString optionItem = it->first; - Gtk::Entry * entry = it->second; - - Ptr::Ref - oldValue = optionsContainer->getOptionItem(optionItem); - Ptr::Ref - newValue(new Glib::ustring(entry->get_text())); - - if (*oldValue != *newValue) { - try { - optionsContainer->setOptionItem(optionItem, newValue); - changed = true; - } catch (std::invalid_argument &e) { - try { - Ptr::Ref - errorMessage(new Glib::ustring( - *getResourceUstring("errorMsg") )); - errorMessage->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMessage); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - std::exit(1); - } - } - } - } - - return changed; -} - - -/*------------------------------------------------------------------------------ - * Save the changes in the key bindings. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: saveChangesInKeyBindings(void) throw () -{ - Ptr::Ref - optionsContainer = gLiveSupport->getOptionsContainer(); - Ptr::Ref - list = gLiveSupport->getKeyboardShortcutList(); - - KeyboardShortcutList::iterator listIt; - Gtk::TreeModel::iterator modelIt = keyBindingsModel - ->children().begin(); - int containerNo = 1; - for (listIt = list->begin(); listIt != list->end(); - ++listIt, ++modelIt, ++containerNo) { - Ptr::Ref - container = *listIt; - Gtk::TreeRow parent = *modelIt; - - KeyboardShortcutContainer::iterator containerIt; - Gtk::TreeModel::iterator childIt = parent.children() - .begin(); - int shortcutNo = 1; - for (containerIt = container->begin(); containerIt != container->end(); - ++containerIt, ++childIt, ++shortcutNo) { - Ptr::Ref - shortcut = *containerIt; - Ptr::Ref - oldKeyString = shortcut->getKeyString(); - Gtk::TreeRow child = *childIt; - Ptr::Ref - newKeyString(new const Glib::ustring( - child[keyBindingsColumns.keyNameColumn] )); - if (*oldKeyString != *newKeyString) { - try { - shortcut->setKey(*newKeyString); - optionsContainer->setKeyboardShortcutItem(containerNo, - shortcutNo, - newKeyString); - } catch (std::invalid_argument &e) { - try { - Ptr::Ref - errorMessage(new Glib::ustring( - *getResourceUstring("errorMsg") )); - errorMessage->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMessage); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - std::exit(1); - } - } - } - } - } -} - - -/*------------------------------------------------------------------------------ - * Save the changes in the RDS settings. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: saveChangesInRds(void) throw () -{ - rdsView->saveChanges(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the OK button. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onOkButtonClicked(void) throw () -{ - onApplyButtonClicked(); - onCloseButtonClicked(false); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Close button. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onCloseButtonClicked(bool needConfirm) throw () -{ - if (needConfirm) { - // TODO: add confirmation dialog - // and either save changes or cancel them - } - - hide(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the test button - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onTestButtonClicked(const Gtk::Entry * entry) - throw () -{ - Ptr::Ref optionsContainer - = gLiveSupport->getOptionsContainer(); - - Ptr::Ref - oldDevice = optionsContainer->getOptionItem(OptionsContainer:: - cuePlayerDeviceName); - Ptr::Ref - newDevice(new Glib::ustring(entry->get_text())); - - // NOTE: we can't use the output player b/c that would trigger onStop() - gLiveSupport->playTestSoundOnCue(oldDevice, newDevice); -} - - -/*------------------------------------------------------------------------------ - * Create a new user entry field item. - *----------------------------------------------------------------------------*/ -Gtk::Entry * -OptionsWindow :: createEntry(const Glib::ustring & entryName, - OptionsContainer::OptionItemString optionItem) - throw () -{ - Ptr::Ref optionsContainer - = gLiveSupport->getOptionsContainer(); - - Gtk::Entry * entry; - glade->get_widget(entryName, entry); - - try { - entry->set_text(*optionsContainer->getOptionItem(optionItem)); - - } catch (std::invalid_argument &e) { - // TODO: signal error? - entry->set_text(""); - } - - stringEntryList.push_back(std::make_pair(optionItem, entry)); - - return entry; -} - - -/*------------------------------------------------------------------------------ - * Construct the "Sound" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructSoundSection(void) throw () -{ - Ptr::Ref optionsContainer - = gLiveSupport->getOptionsContainer(); - - Gtk::Label * cueDeviceLabel; - Gtk::Label * outputDeviceLabel; - glade->get_widget("cueDeviceLabel1", cueDeviceLabel); - glade->get_widget("outputDeviceLabel1", outputDeviceLabel); - cueDeviceLabel->set_label(*getResourceUstring("cueDeviceLabel")); - outputDeviceLabel->set_label(*getResourceUstring("outputDeviceLabel")); - - Gtk::Entry * cueDeviceEntry; - Gtk::Entry * outputDeviceEntry; - cueDeviceEntry = createEntry("cueDeviceEntry1", - OptionsContainer::cuePlayerDeviceName); - outputDeviceEntry = createEntry("outputDeviceEntry1", - OptionsContainer::outputPlayerDeviceName); - - Gtk::Button * cueTestButton; - Gtk::Button * outputTestButton; - glade->get_widget("cueTestButton1", cueTestButton); - glade->get_widget("outputTestButton1", outputTestButton); - cueTestButton->set_label(*getResourceUstring("testButtonLabel")); - outputTestButton->set_label(*getResourceUstring("testButtonLabel")); - cueTestButton->signal_clicked().connect(sigc::bind( - sigc::mem_fun(*this, &OptionsWindow::onTestButtonClicked), - cueDeviceEntry)); - outputTestButton->signal_clicked().connect(sigc::bind( - sigc::mem_fun(*this, &OptionsWindow::onTestButtonClicked), - outputDeviceEntry)); -} - - -/*------------------------------------------------------------------------------ - * Construct the "Key bindings" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructKeyBindingsSection(void) throw () -{ - // create the TreeView - keyBindingsModel = Gtk::TreeStore::create(keyBindingsColumns); - glade->get_widget_derived("keyBindingsTreeView1", keyBindingsTreeView); - keyBindingsTreeView->set_model(keyBindingsModel); - keyBindingsTreeView->connectModelSignals(keyBindingsModel); - - keyBindingsTreeView->appendColumn("", keyBindingsColumns.actionColumn); - keyBindingsTreeView->appendColumn("", keyBindingsColumns.keyDisplayColumn); - - fillKeyBindingsModel(); - - keyBindingsTreeView->columns_autosize(); - keyBindingsTreeView->expand_all(); - - // connect the callbacks - keyBindingsTreeView->signal_row_activated().connect(sigc::mem_fun(*this, - &OptionsWindow::onKeyBindingsRowActivated)); - keyBindingsTreeView->signal_key_press_event().connect(sigc::mem_fun(*this, - &OptionsWindow::onKeyBindingsKeyPressed)); - keyBindingsTreeView->signal_focus_out_event().connect_notify(sigc::mem_fun( - *this, - &OptionsWindow::onKeyBindingsFocusOut)); - - // add instructions - Gtk::Label * instructionsLabel; - glade->get_widget("keyBindingsInstructionsLabel1", instructionsLabel); - instructionsLabel->set_label(*getResourceUstring( - "keyBindingsInstructionsText")); -} - - -/*------------------------------------------------------------------------------ - * Fill the key bindings model from the KeyboardShortcutList. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: fillKeyBindingsModel(void) throw () -{ - Ptr::Ref - list = gLiveSupport->getKeyboardShortcutList(); - - KeyboardShortcutList::iterator it; - for (it = list->begin(); it != list->end(); ++it) { - Ptr::Ref - container = *it; - Ptr::Ref - windowName = container->getWindowName(); - Gtk::TreeRow parent = *keyBindingsModel->append(); - parent[keyBindingsColumns.actionColumn] - = *gLiveSupport->getLocalizedWindowName(windowName); - - KeyboardShortcutContainer::iterator iter; - for (iter = container->begin(); iter != container->end(); ++iter) { - Ptr::Ref - shortcut = *iter; - Ptr::Ref - actionString = shortcut->getActionString(); - Ptr::Ref - keyString = shortcut->getKeyString(); - Gtk::TreeRow child - = *keyBindingsModel->append(parent.children()); - child[keyBindingsColumns.actionColumn] - = *gLiveSupport->getLocalizedKeyboardActionName( - actionString); - child[keyBindingsColumns.keyNameColumn] - = *keyString; // TODO: localize this? - child[keyBindingsColumns.keyDisplayColumn] - = Glib::Markup::escape_text(*keyString); - } - } -} - - -/*------------------------------------------------------------------------------ - * Construct the "Servers" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructServersSection(void) throw () -{ - Ptr::Ref optionsContainer - = gLiveSupport->getOptionsContainer(); - - // authentication server - Gtk::Label * authenticationLabel; - Gtk::Label * authenticationServerLabel; - Gtk::Label * authenticationPortLabel; - Gtk::Label * authenticationPathLabel; - glade->get_widget("authenticationServerLabel1", authenticationLabel); - glade->get_widget("authenticationServerServerLabel1", - authenticationServerLabel); - glade->get_widget("authenticationServerPortLabel1", - authenticationPortLabel); - glade->get_widget("authenticationServerPathLabel1", - authenticationPathLabel); - authenticationLabel->set_label(*getResourceUstring("authenticationLabel")); - authenticationServerLabel->set_label(*getResourceUstring("serverLabel")); - authenticationPortLabel->set_label(*getResourceUstring("portLabel")); - authenticationPathLabel->set_label(*getResourceUstring("pathLabel")); - - createEntry("authenticationServerServerEntry1", - OptionsContainer::authenticationServer); - createEntry("authenticationServerPortEntry1", - OptionsContainer::authenticationPort); - createEntry("authenticationServerPathEntry1", - OptionsContainer::authenticationPath); - - // storage server - Gtk::Label * storageLabel; - Gtk::Label * storageServerLabel; - Gtk::Label * storagePortLabel; - Gtk::Label * storagePathLabel; - glade->get_widget("storageServerLabel1", storageLabel); - glade->get_widget("storageServerServerLabel1", storageServerLabel); - glade->get_widget("storageServerPortLabel1", storagePortLabel); - glade->get_widget("storageServerPathLabel1", storagePathLabel); - storageLabel->set_label(*getResourceUstring("storageLabel")); - storageServerLabel->set_label(*getResourceUstring("serverLabel")); - storagePortLabel->set_label(*getResourceUstring("portLabel")); - storagePathLabel->set_label(*getResourceUstring("pathLabel")); - - createEntry("storageServerServerEntry1", OptionsContainer::storageServer); - createEntry("storageServerPortEntry1", OptionsContainer::storagePort); - createEntry("storageServerPathEntry1", OptionsContainer::storagePath); - - // scheduler server - Gtk::Label * schedulerLabel; - Gtk::Label * schedulerServerLabel; - Gtk::Label * schedulerPortLabel; - Gtk::Label * schedulerPathLabel; - glade->get_widget("schedulerServerLabel1", schedulerLabel); - glade->get_widget("schedulerServerServerLabel1", schedulerServerLabel); - glade->get_widget("schedulerServerPortLabel1", schedulerPortLabel); - glade->get_widget("schedulerServerPathLabel1", schedulerPathLabel); - schedulerLabel->set_label(*getResourceUstring("schedulerLabel")); - schedulerServerLabel->set_label(*getResourceUstring("serverLabel")); - schedulerPortLabel->set_label(*getResourceUstring("portLabel")); - schedulerPathLabel->set_label(*getResourceUstring("pathLabel")); - - createEntry("schedulerServerServerEntry1", - OptionsContainer::schedulerServer); - createEntry("schedulerServerPortEntry1", OptionsContainer::schedulerPort); - createEntry("schedulerServerPathEntry1", OptionsContainer::schedulerPath); -} - - -/*------------------------------------------------------------------------------ - * Construct the "Scheduler" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructSchedulerSection(void) throw () -{ - Gtk::Label * schedulerTextLabel; - Gtk::Button * startButton; - Gtk::Button * stopButton; - glade->get_widget("schedulerTextLabel1", schedulerTextLabel); - glade->get_widget("schedulerStatusLabel1", schedulerStatusLabel); - glade->get_widget("schedulerStartButton1", startButton); - glade->get_widget("schedulerStopButton1", stopButton); - schedulerTextLabel->set_label(*getResourceUstring("schedulerStatusText")); - updateSchedulerStatus(); // sets the schedulerStatusLabel - startButton->set_label(*getResourceUstring("schedulerStartButtonLabel")); - stopButton->set_label(*getResourceUstring("schedulerStopButtonLabel")); - - startButton->signal_clicked().connect(sigc::mem_fun(*this, - &OptionsWindow::onSchedulerStartButtonClicked)); - stopButton->signal_clicked().connect(sigc::mem_fun(*this, - &OptionsWindow::onSchedulerStopButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Construct the "Backup" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructBackupSection(void) throw () -{ - backupView.reset(new BackupView(this)); -} - - -/*------------------------------------------------------------------------------ - * Construct the "RDS" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructRdsSection(void) throw () -{ - rdsView.reset(new RdsView(this)); -} - - -/*------------------------------------------------------------------------------ - * Construct the "About" section. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: constructAboutSection(void) throw () -{ - Glib::ustring aboutLabelContents; - - aboutLabelContents.append("\n"); - aboutLabelContents.append(PACKAGE_NAME); - aboutLabelContents.append(" "); - aboutLabelContents.append(PACKAGE_VERSION); - aboutLabelContents.append("\n\n"); - aboutLabelContents.append(*formatMessage("reportBugsToText", - PACKAGE_BUGREPORT )); - aboutLabelContents.append("\n\n"); - aboutLabelContents.append(*getBinaryResourceAsUstring("creditsText")); - - Gtk::Label * aboutLabel; - glade->get_widget("aboutLabel1", aboutLabel); - aboutLabel->set_label(aboutLabelContents); -} - - -/*------------------------------------------------------------------------------ - * Reset all user entries to their saved state. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: resetEntries() throw () -{ - Ptr::Ref optionsContainer - = gLiveSupport->getOptionsContainer(); - - StringEntryListType::iterator it; - for (it = stringEntryList.begin(); it != stringEntryList.end(); ++it) { - OptionsContainer::OptionItemString optionItem = it->first; - Gtk::Entry * entry = it->second; - - try { - entry->set_text(*optionsContainer->getOptionItem(optionItem)); - - } catch (std::invalid_argument &e) { - // TODO: signal error? - entry->set_text(""); - } - } -} - - -/*------------------------------------------------------------------------------ - * Reset the key bindings to their saved state. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: resetKeyBindings(void) throw () -{ - keyBindingsModel->clear(); - fillKeyBindingsModel(); - keyBindingsTreeView->expand_all(); -} - - -/*------------------------------------------------------------------------------ - * Reset the RDS settings to their saved state. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: resetRds(void) throw () -{ - rdsView->reset(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for clicking on a row in the key bindings table. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onKeyBindingsRowActivated(const Gtk::TreePath & path, - Gtk::TreeViewColumn * column) - throw () -{ - resetEditedKeyBinding(); - - Gtk::TreeIter iter = keyBindingsModel->get_iter(path); - if (iter) { - Gtk::TreeRow row = *iter; - editedKeyName.reset(new const Glib::ustring( - row[keyBindingsColumns.keyNameColumn])); - editedKeyRow = row; - row[keyBindingsColumns.keyDisplayColumn] - = *getResourceUstring("pressAKeyMsg"); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for clicking outside the key bindings table. - *----------------------------------------------------------------------------*/ -bool -OptionsWindow :: onKeyBindingsKeyPressed(GdkEventKey * event) throw () -{ - // TODO: remove this ugly hack - switch (event->keyval) { - case GDK_Shift_L : // ignore the event if only - case GDK_Shift_R : // a shift key has been pressed - case GDK_Control_L : - case GDK_Control_R : - case GDK_Alt_L : - case GDK_Alt_R : - case GDK_Super_L : - case GDK_Super_R : - case GDK_Hyper_L : - case GDK_Hyper_R : - case GDK_Meta_L : - case GDK_Meta_R : return false; - } - - if (editedKeyName) { - Ptr::Ref - newKeyName = KeyboardShortcut::modifiedKeyToString( - Gdk::ModifierType(event->state), - event->keyval); - if (newKeyName && *newKeyName != "Escape") { - editedKeyName = newKeyName; - } - resetEditedKeyBinding(); - return true; - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Event handler for clicking outside the key bindings table. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onKeyBindingsFocusOut(GdkEventFocus * event) - throw () -{ - resetEditedKeyBinding(); -} - - -/*------------------------------------------------------------------------------ - * Reset the key binding to its pre-editing value. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: resetEditedKeyBinding(void) throw () -{ - if (editedKeyName) { - editedKeyRow[keyBindingsColumns.keyNameColumn] - = *editedKeyName; - editedKeyRow[keyBindingsColumns.keyDisplayColumn] - = Glib::Markup::escape_text(*editedKeyName); - editedKeyName.reset(); - } -} - - -/*------------------------------------------------------------------------------ - * Show the window and return when the user hides it. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: run(void) throw () -{ - mainNotebook->set_current_page(2); // "Servers" - mainWindow->property_window_position().set_value( - Gtk::WIN_POS_CENTER_ALWAYS); - mainWindow->show_all(); - Gtk::Main::run(*mainWindow); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the scheduler Start button getting clicked. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onSchedulerStartButtonClicked(void) throw () -{ - gLiveSupport->checkSchedulerClient(); - if (!gLiveSupport->isSchedulerAvailable()) { - gLiveSupport->startSchedulerClient(); - } - updateSchedulerStatus(); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the scheduler Stop button getting clicked. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: onSchedulerStopButtonClicked(void) throw () -{ - gLiveSupport->checkSchedulerClient(); - if (gLiveSupport->isSchedulerAvailable()) { - gLiveSupport->stopSchedulerClient(); - } - updateSchedulerStatus(); -} - - -/*------------------------------------------------------------------------------ - * Update the status display in the Status tab. - *----------------------------------------------------------------------------*/ -void -OptionsWindow :: updateSchedulerStatus(void) throw () -{ - gLiveSupport->checkSchedulerClient(); - if (gLiveSupport->isSchedulerAvailable()) { - schedulerStatusLabel->set_text( - *getResourceUstring("schedulerRunningStatus")); - } else { - schedulerStatusLabel->set_text( - *getResourceUstring("schedulerStoppedStatus")); - } -} - diff --git a/src/products/gLiveSupport/src/OptionsWindow.h b/src/products/gLiveSupport/src/OptionsWindow.h deleted file mode 100644 index e90522e4d..000000000 --- a/src/products/gLiveSupport/src/OptionsWindow.h +++ /dev/null @@ -1,434 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef OptionsWindow_h -#define OptionsWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Core/OptionsContainer.h" -#include "LiveSupport/Widgets/ComboBoxText.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "GuiWindow.h" -#include "GLiveSupport.h" -#include "BackupView.h" -#include "RdsView.h" - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The options window. - * - * The layout of the window is roughly the following: - *

- *  +--- options window ----------------+
- *  | +- tab1 -+ ... +- tabN -+         |
- *  | +-------------------------------+ |
- *  | +-- contents of the ------------+ |
- *  | +-- currently ------------------+ |
- *  | +-- selected tab ---------------+ |
- *  | +-------------------------------+ |
- *  +------------(Apply)-(Cancel)-(OK)--+
- *  
- * - */ -class OptionsWindow : public GuiWindow -{ - private: - - /** - * The notepad holding the different sections. - */ - Gtk::Notebook * mainNotebook; - - /** - * The label showing the current status of the scheduler. - */ - Gtk::Label * schedulerStatusLabel; - - /** - * The type for the list of user entry fields of string type. - */ - typedef std::vector > StringEntryListType; - - /** - * The list of user entry fields of string type. - */ - StringEntryListType stringEntryList; - - /** - * Create a new user entry field item. - * - * This gets a reference to the Gtk::Entry from the Glade file, and - * sets its text to the current value of the option. - * The Gtk::Entry is then added to the list of user entry fields. - * - * @param entryName the name of the Entry in the Glade file. - * @param optionItem the name of the option item for this entry. - * @return the text entry field just processed. - */ - Gtk::Entry * - createEntry(const Glib::ustring & entryName, - OptionsContainer::OptionItemString optionItem) - throw (); - - /** - * Reset all user entries to their saved state. - */ - void - resetEntries(void) throw (); - - /** - * Reset the key bindings to their saved state. - */ - void - resetKeyBindings(void) throw (); - - /** - * Reset the RDS settings to their saved state. - */ - void - resetRds(void) throw (); - - /** - * Fill the key bindings model from the KeyboardShortcutList. - */ - void - fillKeyBindingsModel(void) throw (); - - /** - * The row of the currently edited key binding. - */ - Gtk::TreeRow editedKeyRow; - - /** - * The value of the currently edited key binding - * (as a user-readable modifiers - key name combo). - */ - Ptr::Ref editedKeyName; - - /** - * Reset the key binding to its pre-editing value. - */ - void - resetEditedKeyBinding(void) throw (); - - /** - * Save the changes in the string entry fields. - * - * @return true if some changes were detected and saved. - */ - bool - saveChangesInStringEntryFields(void) throw (); - - /** - * Save the changes in the key bindings. - */ - void - saveChangesInKeyBindings(void) throw (); - - /** - * Save the changes in the RDS settings. - */ - void - saveChangesInRds(void) throw (); - - /** - * Construct the "Sound" section. - */ - void - constructSoundSection(void) throw (); - - /** - * Construct the "Key bindings" section. - */ - void - constructKeyBindingsSection(void) throw (); - - /** - * Construct the "Servers" section. - */ - void - constructServersSection(void) throw (); - - /** - * Construct the "Scheduler" section. - * This section contains the scheduler start and stop buttons. - */ - void - constructSchedulerSection(void) throw (); - - /** - * Construct the "Backup" section. - */ - void - constructBackupSection(void) throw (); - - /** - * Construct the "RDS" section. - */ - void - constructRdsSection(void) throw (); - - /** - * Construct the "About" section. - */ - void - constructAboutSection(void) throw (); - - /** - * Update the scheduler status display in the Scheduler tab. - */ - void - updateSchedulerStatus(void) throw (); - - - protected: - - /** - * Event handler for the Cancel button. - */ - virtual void - onCancelButtonClicked(void) throw (); - - /** - * Event handler for the Apply button. - */ - virtual void - onApplyButtonClicked(void) throw (); - - /** - * Event handler for the OK button. - */ - virtual void - onOkButtonClicked(void) throw (); - - /** - * Event handler for the Close button. - * - * @param needConfirm if true, we check if changes has been - * made to the input fields, and if yes, then - * a "save changes?" dialog is displayed - */ - virtual void - onCloseButtonClicked(bool needConfirm = true) throw (); - - /** - * Event handler for the test button. - * - * @param entry the text entry field containing the new device name - * @see GLiveSupport::setCueAudioDevice() - * @see GLiveSupport::playTestSoundOnCue() - */ - virtual void - onTestButtonClicked(const Gtk::Entry * entry) throw (); - - /** - * Event handler for double-clicking a row in the key bindings table. - * - * @param event the button event - */ - virtual void - onKeyBindingsRowActivated(const Gtk::TreePath & path, - Gtk::TreeViewColumn * column) - throw (); - - /** - * Signal handler for a key pressed in the key bindings table. - * - * @param event the button event received - * @return true if the key press was fully handled, false if not - */ - virtual bool - onKeyBindingsKeyPressed(GdkEventKey * event) throw (); - - /** - * Event handler for clicking outside the key bindings table. - * - * @param event the focus event - */ - virtual void - onKeyBindingsFocusOut(GdkEventFocus * event) throw (); - - /** - * Signal handler for the scheduler Start button getting clicked. - */ - virtual void - onSchedulerStartButtonClicked(void) throw (); - - /** - * Signal handler for the scheduler Stop button getting clicked. - */ - virtual void - onSchedulerStopButtonClicked(void) throw (); - - /** - * The columns model containing the data for the Key bindings section. - * - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - - /** - * The column for the name of the action. - * This contains the name of the window (for parent rows), - * or the name of the action (for child rows). - */ - Gtk::TreeModelColumn actionColumn; - - /** - * The column for the user readable name of the key bound - * (plain version, with '<' and '>'). - */ - Gtk::TreeModelColumn keyNameColumn; - - /** - * The column for the user readable name of the key bound - * (escaped version, with '<' and '>'). - */ - Gtk::TreeModelColumn keyDisplayColumn; - - /** - * The column for the gdkkeytypes.h code of the modifiers. - */ - Gtk::TreeModelColumn modifiersColumn; - - /** - * The column for the gdkkeysyms.h code of the key. - */ - Gtk::TreeModelColumn keyValueColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(actionColumn); - add(keyNameColumn); - add(keyDisplayColumn); - add(modifiersColumn); - add(keyValueColumn); - } - }; - - - /** - * The column model for the key bindings. - */ - ModelColumns keyBindingsColumns; - - /** - * The tree model, as a GTK reference, for the key bindings. - */ - Glib::RefPtr keyBindingsModel; - - /** - * The tree view for the key bindings. - */ - ZebraTreeView * keyBindingsTreeView; - - /** - * The backup view shown in the backup section. - */ - Ptr::Ref backupView; - - /** - * The RdsView shown in the RDS section. - */ - Ptr::Ref rdsView; - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - OptionsWindow(Gtk::ToggleButton * windowOpenerButton) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~OptionsWindow(void) throw () - { - } - - /** - * Return the BackupList object shown by the widget. - */ - Ptr::Ref - getBackupList(void) throw () - { - return backupView ? backupView->getBackupList() - : Ptr::Ref(); - } - - /** - * Show the window and return when the user hides it. - * This is used by GLiveSupport when the authentication server - * address is wrong. It opens the window to the "Servers" tab. - */ - void - run(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // OptionsWindow_h - diff --git a/src/products/gLiveSupport/src/PlaylistWindow.cxx b/src/products/gLiveSupport/src/PlaylistWindow.cxx deleted file mode 100644 index 30944563d..000000000 --- a/src/products/gLiveSupport/src/PlaylistWindow.cxx +++ /dev/null @@ -1,806 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" - -#include "PlaylistWindow.h" - - -using namespace Glib; - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "playlistWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "PlaylistWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -PlaylistWindow :: PlaylistWindow(Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton), - isPlaylistModified(false) -{ - // set up the file name entry - Gtk::Label * nameLabel; - glade->get_widget("nameLabel1", nameLabel); - nameLabel->set_label(*getResourceUstring("nameLabel")); - glade->get_widget("nameEntry1", nameEntry); - nameEntry->signal_changed().connect(sigc::mem_fun(*this, - &PlaylistWindow::onTitleEdited)); - - // set up the entries tree view - entriesModel = Gtk::ListStore::create(modelColumns); - glade->get_widget_derived("entriesView1", entriesView); - entriesView->set_model(entriesModel); - entriesView->connectModelSignals(entriesModel); - - entriesView->appendColumn(*getResourceUstring("startColumnLabel"), - modelColumns.startColumn, - 60); - entriesView->appendColumn(*getResourceUstring("titleColumnLabel"), - modelColumns.titleColumn, - 200); - entriesView->appendEditableColumn( - *getResourceUstring("fadeInColumnLabel"), - modelColumns.fadeInColumn, - fadeInColumnId, - 60); - entriesView->appendColumn(*getResourceUstring("lengthColumnLabel"), - modelColumns.lengthColumn, - 60); - entriesView->appendEditableColumn( - *getResourceUstring("fadeOutColumnLabel"), - modelColumns.fadeOutColumn, - fadeOutColumnId, - 60); - - entriesView->signal_button_press_event().connect_notify(sigc::mem_fun(*this, - &PlaylistWindow::onEntryClicked)); - entriesView->signalCellEdited().connect(sigc::mem_fun(*this, - &PlaylistWindow::onFadeInfoEdited )); - entriesView->signal_key_press_event().connect(sigc::mem_fun(*this, - &PlaylistWindow::onKeyPressed)); - - // set up the status bar - glade->get_widget("statusBar1", statusBar); - statusBar->set_label(""); - - // create the right-click entry context menu - rightClickMenu.reset(new Gtk::Menu()); - Gtk::Menu::MenuList & rightClickMenuList = rightClickMenu->items(); - - rightClickMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("upMenuItem"), - sigc::mem_fun(*this, - &PlaylistWindow::onUpItem))); - rightClickMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("downMenuItem"), - sigc::mem_fun(*this, - &PlaylistWindow::onDownItem))); - rightClickMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("removeMenuItem"), - sigc::mem_fun(*this, - &PlaylistWindow::onRemoveItem))); - - // set up the "lock fades" check button - Gtk::CheckButton * lockFadesCheckButton; - glade->get_widget("lockFadesCheckButton1", lockFadesCheckButton); - lockFadesCheckButton->set_label(*getResourceUstring( - "lockFadesCheckButtonLabel")); - lockFadesCheckButton->set_active(true); - areFadesLocked = true; - lockFadesCheckButton->signal_toggled().connect(sigc::mem_fun(*this, - &PlaylistWindow::onLockFadesCheckButtonClicked)); - - // set up the "total time" display - Gtk::Label * lengthTextLabel; - glade->get_widget("lengthTextLabel1", lengthTextLabel); - lengthTextLabel->set_label(*getResourceUstring("lengthLabel")); - - glade->get_widget("lengthValueLabel1", lengthValueLabel); - lengthValueLabel->set_label("00:00:00"); - - // register the signal handlers for the buttons - Gtk::Button * closeButton; - glade->get_widget("saveButton1", saveButton); - glade->get_widget("closeButton1", closeButton); - saveButton->signal_clicked().connect(sigc::mem_fun(*this, - &PlaylistWindow::onSaveButtonClicked)); - closeButton->signal_clicked().connect(sigc::mem_fun(*this, - &PlaylistWindow::onBottomCloseButtonClicked)); - - // get notified when the playlist is modified outside of the window - gLiveSupport->signalEditedPlaylistModified().connect(sigc::mem_fun(*this, - &PlaylistWindow::onPlaylistModified )); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -PlaylistWindow :: ~PlaylistWindow (void) - throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Save the edited playlist. - *----------------------------------------------------------------------------*/ -bool -PlaylistWindow :: savePlaylist(bool reopen) throw () -{ - try { - Ptr::Ref playlist - = gLiveSupport->getEditedPlaylist(); - if (!playlist) { - return false; - } - - Ptr::Ref title(new Glib::ustring( - nameEntry->get_text())); - if (*title == "") { - statusBar->set_text(*getResourceUstring("emptyTitleErrorMsg")); - return false; - } - - playlist->setTitle(title); - gLiveSupport->savePlaylist(); - if (reopen) { - gLiveSupport->openPlaylistForEditing(playlist->getId()); - } - setPlaylistModified(false); - - Ptr::Ref statusText = formatMessage( - "playlistSavedMsg", - *playlist->getTitle()); - statusBar->set_text(*statusText); - return true; - - } catch (XmlRpcException &e) { - statusBar->set_text(e.what()); - return false; - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the save button getting clicked. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onSaveButtonClicked(void) throw () -{ - savePlaylist(true); -} - - -/*------------------------------------------------------------------------------ - * Cancel the edited playlist, after asking for confirmation. - *----------------------------------------------------------------------------*/ -bool -PlaylistWindow :: cancelPlaylist(void) throw () -{ - if (gLiveSupport->getEditedPlaylist()) { - if (!isPlaylistModified) { - gLiveSupport->cancelEditedPlaylist(); - } else { - Gtk::ResponseType result = runConfirmationDialog(); - switch (result) { - case Gtk::RESPONSE_NO: - try { - gLiveSupport->cancelEditedPlaylist(); - } catch (XmlRpcException &e) { - std::cerr << e.what() << std::endl; - return false; - } - setPlaylistModified(false); - break; - - case Gtk::RESPONSE_YES: - if (!savePlaylist(false)) { - return false; - } - break; - - case Gtk::RESPONSE_CANCEL: - return false; - - default : // can happen if the window - return false; // is closed with Alt-F4 - } // -- treated as cancel - } - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * Run the confirmation window. - *----------------------------------------------------------------------------*/ -Gtk::ResponseType -PlaylistWindow :: runConfirmationDialog(void) throw () -{ - Gtk::Dialog * confirmationDialog; - Gtk::Label * confirmationDialogLabel; - Gtk::Button * noButton; - glade->get_widget("confirmationDialog1", confirmationDialog); - glade->get_widget("confirmationDialogLabel1", confirmationDialogLabel); - glade->get_widget("noButton1", noButton); - - Glib::ustring message = ""; - message += *getResourceUstring("savePlaylistDialogMsg"); - message += ""; - confirmationDialogLabel->set_label(message); - noButton->set_label(*getResourceUstring("closeWithoutSavingButtonLabel")); - - Gtk::ResponseType response = Gtk::ResponseType( - confirmationDialog->run()); - confirmationDialog->hide(); - return response; -} - - -/*------------------------------------------------------------------------------ - * Clean and close the window. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: closeWindow(void) throw () -{ - statusBar->set_text(""); - nameEntry->set_text(""); - entriesModel->clear(); - setPlaylistModified(false); - hide(); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the save button getting clicked. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onBottomCloseButtonClicked(void) throw () -{ - if (cancelPlaylist()) { - closeWindow(); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the "lock fades" check button toggled. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onLockFadesCheckButtonClicked(void) - throw () -{ - areFadesLocked = !areFadesLocked; -} - - -/*------------------------------------------------------------------------------ - * Show the contents of the currently edited playlist. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: showContents(void) throw () -{ - Ptr::Ref playlist; - Playlist::const_iterator it; - Playlist::const_iterator end; - - playlist = gLiveSupport->getEditedPlaylist(); - - if (playlist) { - nameEntry->set_text(*playlist->getTitle()); - - Ptr::Ref - lengthStr = TimeConversion::timeDurationToHhMmSsString( - playlist->getPlaylength()); - lengthValueLabel->set_text(*lengthStr); - - entriesModel->clear(); - for (it = playlist->begin(); it != playlist->end(); ++it) { - Ptr::Ref playlistElement - = it->second; - Ptr::Ref playable = playlistElement->getPlayable(); - Gtk::TreeModel::Row row = *(entriesModel->append()); - - row[modelColumns.playlistElementColumn] - = playlistElement; - row[modelColumns.startColumn] - = *TimeConversion::timeDurationToHhMmSsString( - playlistElement->getRelativeOffset()); - row[modelColumns.titleColumn] - = Glib::Markup::escape_text(*playable->getTitle()); - row[modelColumns.lengthColumn] - = *TimeConversion::timeDurationToHhMmSsString( - playable->getPlaylength()); - - Ptr::Ref fadeInfo = playlistElement->getFadeInfo(); - Ptr::Ref fadeIn, fadeOut; - if (fadeInfo) { - fadeIn = fadeInfo->getFadeIn(); - fadeOut = fadeInfo->getFadeOut(); - } - row[modelColumns.fadeInColumn] - = (fadeIn && fadeIn->total_microseconds() != 0) - ? *TimeConversion::timeDurationToShortString(fadeIn) - : "- "; - row[modelColumns.fadeOutColumn] - = (fadeOut && fadeOut->total_microseconds() != 0) - ? *TimeConversion::timeDurationToShortString(fadeOut) - : "- "; - } - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the fade info being edited. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onTitleEdited(void) throw() -{ - Ptr::Ref playlist = gLiveSupport->getEditedPlaylist(); - if (!playlist) { - try { - gLiveSupport->openPlaylistForEditing(); - playlist = gLiveSupport->getEditedPlaylist(); - - } catch (XmlRpcException &e) { - std::cerr << "error in PlaylistWindow::" - "onTitleEdited(): " - << e.what() << std::endl; - return; - } - } - Ptr::Ref title(new Glib::ustring( - nameEntry->get_text())); - if (*title != *playlist->getTitle()) { - playlist->setTitle(title); - setPlaylistModified(true); - } - - showContents(); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the fade info being edited. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onFadeInfoEdited( - const Glib::ustring & pathString, - int columnId, - const Glib::ustring & newText) - throw() -{ - Gtk::TreeModel::Path path(pathString); - std::vector rowNumberVector = path.get_indices(); - int rowNumber = rowNumberVector.at(0); - - Ptr::Ref newTime; - try { - Ptr::Ref newTextPtr(new std::string(newText)); - newTime = TimeConversion::parseTimeDuration(newTextPtr); - } catch (boost::bad_lexical_cast &e) { - showContents(); // bad time format; restore previous state - return; - } - - if (newTime->is_negative()) { - showContents(); - return; - } - - Ptr::Ref playlist = gLiveSupport->getEditedPlaylist(); - Playlist::const_iterator iter = playlist->begin(); - for (int i=0; i::Ref playlistElement = iter->second; - - switch (columnId) { - case fadeInColumnId : - setFadeIn(playlistElement, newTime); - if (areFadesLocked && iter-- != playlist->begin()) { - Ptr::Ref prevPlaylistElement = iter->second; - setFadeOut(prevPlaylistElement, newTime); - } - break; - case fadeOutColumnId : - setFadeOut(playlistElement, newTime); - if (areFadesLocked && ++iter != playlist->end()) { - Ptr::Ref nextPlaylistElement = iter->second; - setFadeIn(nextPlaylistElement, newTime); - } - break; - default : - return; // should never happen - } - - showContents(); -} - - -/*------------------------------------------------------------------------------ - * Auxilliary function: set the fade in of a playlist element. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: setFadeIn( - Ptr::Ref playlistElement, - Ptr::Ref newFadeIn) - throw() -{ - Ptr::Ref oldFadeInfo = playlistElement->getFadeInfo(); - Ptr::Ref oldFadeOut; - if (oldFadeInfo) { - if (*oldFadeInfo->getFadeIn() == *newFadeIn) { - return; - } - oldFadeOut = oldFadeInfo->getFadeOut(); - } else { - oldFadeOut.reset(new time_duration(0,0,0,0)); - } - Ptr::Ref newFadeInfo(new FadeInfo( - newFadeIn, oldFadeOut )); - if (isLengthOkay(playlistElement, newFadeInfo)) { - playlistElement->setFadeInfo(newFadeInfo); - setPlaylistModified(true); - } -} - - -/*------------------------------------------------------------------------------ - * Auxilliary function: set the fade out of a playlist element. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: setFadeOut( - Ptr::Ref playlistElement, - Ptr::Ref newFadeOut) - throw() -{ - Ptr::Ref oldFadeInfo = playlistElement->getFadeInfo(); - Ptr::Ref oldFadeIn; - if (oldFadeInfo) { - if (*oldFadeInfo->getFadeOut() == *newFadeOut) { - return; - } - oldFadeIn = oldFadeInfo->getFadeIn(); - } else { - oldFadeIn.reset(new time_duration(0,0,0,0)); - } - Ptr::Ref newFadeInfo(new FadeInfo( - oldFadeIn, newFadeOut )); - if (isLengthOkay(playlistElement, newFadeInfo)) { - playlistElement->setFadeInfo(newFadeInfo); - setPlaylistModified(true); - } -} - - -/*------------------------------------------------------------------------------ - * Auxilliary function: check that fades are not longer than the whole clip. - *----------------------------------------------------------------------------*/ -inline bool -PlaylistWindow :: isLengthOkay( - Ptr::Ref playlistElement, - Ptr::Ref newFadeInfo) - throw() -{ - time_duration totalFades = *newFadeInfo->getFadeIn() - + *newFadeInfo->getFadeOut(); - return (totalFades <= *playlistElement->getPlayable()->getPlaylength()); -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the playlist being modified outside the window. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onPlaylistModified(void) throw() -{ - setPlaylistModified(true); -} - - -/*------------------------------------------------------------------------------ - * Event handler for an entry being clicked in the list - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onEntryClicked(GdkEventButton * event) - throw() -{ - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - Gtk::TreePath currentPath; - Gtk::TreeViewColumn * column; - int cell_x, - cell_y; - bool foundValidRow = entriesView->get_path_at_pos( - int(event->x), int(event->y), - currentPath, column, - cell_x, cell_y); - - if (foundValidRow) { - currentItem = entriesModel->get_iter(currentPath); - if (currentItem) { - rightClickMenu->popup(event->button, event->time); - } - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Up menu item selected from the context menu. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onUpItem(void) throw() -{ - if (currentItem && currentItem != entriesModel->children().begin()) { - int rowNumber = (*currentItem) - [modelColumns.rowNumberColumn]; - Gtk::TreeIter previousItem = currentItem; - --previousItem; - swapPlaylistElements(previousItem, currentItem); - setPlaylistModified(true); - showContents(); - selectRow(--rowNumber); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Down menu item selected from the context menu. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onDownItem(void) throw() -{ - if (currentItem) { - Gtk::TreeIter nextItem = currentItem; - ++nextItem; - if (nextItem) { - int rowNumber = (*currentItem) - [modelColumns.rowNumberColumn]; - swapPlaylistElements(currentItem, nextItem); - setPlaylistModified(true); - showContents(); - selectRow(++rowNumber); - } - } -} - - -/*------------------------------------------------------------------------------ - * Swap two playlist elements in the edited playlist. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: swapPlaylistElements( - Gtk::TreeIter firstIter, - Gtk::TreeIter secondIter) - throw() -{ - Ptr::Ref - firstElement = (*firstIter) [modelColumns.playlistElementColumn]; - Ptr::Ref - secondElement = (*secondIter)[modelColumns.playlistElementColumn]; - - // remove the two playlist elements - Ptr::Ref playlist = gLiveSupport->getEditedPlaylist(); - playlist->removePlaylistElement(firstElement->getId()); - playlist->removePlaylistElement(secondElement->getId()); - - // swap the relative offsets so that elt2.begin <-- elt1.begin - // and elt1.end <-- elt2.end - Ptr::Ref firstStart = firstElement->getRelativeOffset(); - Ptr::Ref secondStart(new time_duration( - *secondElement->getRelativeOffset() - + *secondElement->getPlayable() - ->getPlaylength() - - *firstElement->getPlayable() - ->getPlaylength() )); - firstElement->setRelativeOffset(secondStart); - secondElement->setRelativeOffset(firstStart); - - // read the fade infos - bool hasFadeInfo = false; - Ptr::Ref firstFadeInfo = firstElement->getFadeInfo(); - Ptr::Ref secondFadeInfo = secondElement->getFadeInfo(); - Ptr::Ref beginFade, - midFade1, - midFade2, - endFade; - - if (firstFadeInfo) { - hasFadeInfo = true; - beginFade = firstFadeInfo->getFadeIn(); - midFade1 = firstFadeInfo->getFadeOut(); - } else { - beginFade.reset(new time_duration(0,0,0,0)); - midFade1 .reset(new time_duration(0,0,0,0)); - } - - if (secondFadeInfo) { - hasFadeInfo = true; - midFade2 = secondFadeInfo->getFadeIn(); - endFade = secondFadeInfo->getFadeOut(); - } else if (hasFadeInfo) { - midFade2.reset(new time_duration(0,0,0,0)); - endFade .reset(new time_duration(0,0,0,0)); - } - - // move fades around if they seem to be simple crossfades - // otherwise, just leave them as they are - if (hasFadeInfo && *midFade1 == *midFade2) { - Ptr::Ref firstFadeInfo (new FadeInfo(beginFade, midFade1)); - Ptr::Ref secondFadeInfo(new FadeInfo(midFade1, endFade )); - - firstElement->setFadeInfo(secondFadeInfo); - secondElement->setFadeInfo(firstFadeInfo); - } - - // add the playlist elements back in - playlist->addPlaylistElement(firstElement); - playlist->addPlaylistElement(secondElement); - - // Note: - // removing and then adding is necessary to make sure that the playlist - // elements are correctly indexed by their relative offset in the playlist. -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Remove menu item selected from the context menu. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: onRemoveItem(void) throw() -{ - if (currentItem) { - Ptr::Ref - playlist = gLiveSupport->getEditedPlaylist(); - Ptr::Ref - playlistElement = (*currentItem) - [modelColumns.playlistElementColumn]; - - playlist->removePlaylistElement(playlistElement->getId()); - playlist->eliminateGaps(); - - setPlaylistModified(true); - showContents(); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for a key pressed. - *----------------------------------------------------------------------------*/ -bool -PlaylistWindow :: onKeyPressed(GdkEventKey * event) - throw () -{ - if (event->type == GDK_KEY_PRESS) { - KeyboardShortcut::Action action = gLiveSupport->findAction( - "playlistWindow", - Gdk::ModifierType(event->state), - event->keyval); - switch (action) { - case KeyboardShortcut::moveItemUp : - findCurrentItem(); - onUpItem(); - return true; - - case KeyboardShortcut::moveItemDown : - findCurrentItem(); - onDownItem(); - return true; - - case KeyboardShortcut::removeItem : - findCurrentItem(); - onRemoveItem(); - return true; - - default : break; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Find (an iterator pointing to) the currently selected row. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: findCurrentItem(void) throw () -{ - Glib::RefPtr selection - = entriesView->get_selection(); - currentItem = selection->get_selected(); -} - - -/*------------------------------------------------------------------------------ - * Select (highlight) the nth row. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: selectRow(int rowNumber) throw () -{ - Gtk::TreeModel::iterator iter = entriesModel->children().begin(); - for (; rowNumber > 0; --rowNumber) { - ++iter; - } - if (iter) { - Glib::RefPtr selection - = entriesView->get_selection(); - selection->select(iter); - } -} - - -/*------------------------------------------------------------------------------ - * Set the value of the isPlaylistModified variable. - *----------------------------------------------------------------------------*/ -void -PlaylistWindow :: setPlaylistModified(bool newValue) - throw () -{ - isPlaylistModified = newValue; - saveButton->set_sensitive(newValue); -} - diff --git a/src/products/gLiveSupport/src/PlaylistWindow.h b/src/products/gLiveSupport/src/PlaylistWindow.h deleted file mode 100644 index 8019b2174..000000000 --- a/src/products/gLiveSupport/src/PlaylistWindow.h +++ /dev/null @@ -1,425 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlaylistWindow_h -#define PlaylistWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "GuiWindow.h" -#include "GLiveSupport.h" - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The Simple Playlist Management Window. Allow to edit playlists in - * a top-down view fashion. - * - * The layout of this window is roughly the following: - *

- *  +--- simple playlist management window --------+
- *  | name:    +-- name input -------------+       |
- *  | +-- playlist entries ----------------------+ |
- *  | | +-- entry1 ----------------------------+ | |
- *  | | +-- entry2 ----------------------------+ | |
- *  | |  ...                                     | |
- *  | +------------------------------------------+ |
- *  | +- lock fades checkbox -+ |
- *  |        +- save button -+  +- close button -+ |
- *  | +-- status bar ----------------------------+ |
- *  +----------------------------------------------+
- *  
- * - */ -class PlaylistWindow : public GuiWindow -{ - private: - - /** - * Constants for identifying the two fade info columns. - */ - enum { fadeInColumnId, - fadeOutColumnId }; - - /** - * A flag set to true when the edited playlist is modified. - */ - bool isPlaylistModified; - - /** - * A flag controlled by the "lock fades" check button. - * This determines whether the fade-out of a clip is assumed to - * be equal to the fade-in of the next clip. - */ - bool areFadesLocked; - - /** - * An iterator pointing to the current row, for popup functions. - * It is set by onEntryClicked(), before popping up the menu. - */ - Gtk::TreeIter currentItem; - - /** - * The input text field for the name of the playlist. - */ - Gtk::Entry * nameEntry; - - /** - * The entry tree view, now only showing rows. - */ - ZebraTreeView * entriesView; - - /** - * The entry tree model, as a GTK reference. - */ - Glib::RefPtr entriesModel; - - /** - * The label containing the length of the playlist. - */ - Gtk::Label * lengthValueLabel; - - /** - * The status bar. - */ - Gtk::Label * statusBar; - - /** - * The Save Button. - */ - Gtk::Button * saveButton; - - /** - * The right-click context menu that comes up when right-clicking - * a playlist element. - */ - Ptr::Ref rightClickMenu; - - /** - * Find (an iterator pointing to) the currently selected row. - * - * This is an auxilliary function used by onKeyPressed(). - */ - void - findCurrentItem(void) throw (); - - /** - * Select (highlight) the nth row. - * - * This is an auxilliary function used by onUpItem() and onDownItem(). - * - * @param rowNumber the number of the row to be selected. - */ - void - selectRow(int rowNumber) throw (); - - /** - * Swap two playlist elements in the edited playlist. - * This is used by onUpItem() and onDownItem(). - * - * @param firstIter the first item, to be swapped... - * @param secondIter ... with this second item - */ - void - swapPlaylistElements(Gtk::TreeIter firstIter, - Gtk::TreeIter secondIter) throw (); - - /** - * Signal handler for the "remove" menu item selected from - * the right-click context menu. - */ - void - onRemoveItem(void) throw (); - - /** - * Set the fade in of a playlist element. - */ - void - setFadeIn(Ptr::Ref playlistElement, - Ptr::Ref newFadeIn) throw(); - - /** - * Set the fade out of a playlist element. - */ - void - setFadeOut(Ptr::Ref playlistElement, - Ptr::Ref newFadeOut) throw(); - - /** - * Check that fades are not longer than the whole clip. - * - * @return true if (fadeIn + fadeOut <= playlength). - */ - bool - isLengthOkay(Ptr::Ref playlistElement, - Ptr::Ref newFadeInfo) throw(); - - /** - * Clean and close the window. - * Set all widgets to empty and close the window. - */ - void - closeWindow(void) throw(); - - /** - * Save the edited playlist. - * - * @param reopen true if the playlist needs to be opened for - * editing again after saving it. - * @return true if the playlist was saved successully. - */ - bool - savePlaylist(bool reopen) throw (); - - /** - * Set the value of the isPlaylistModified variable. - */ - void - setPlaylistModified(bool newValue) throw (); - - /** - * Run the confirmation dialog. - * - * @return the response ID returned by the dialog. - */ - Gtk::ResponseType - runConfirmationDialog(void) throw (); - - - protected: - - /** - * The columns model needed by Gtk::TreeView. - * Lists one playlist entry per row. - * - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - /** - * The column for the start of the playlist entry. - */ - Gtk::TreeModelColumn startColumn; - - /** - * The column for the title of the audio clip or playlist. - */ - Gtk::TreeModelColumn titleColumn; - - /** - * The column for the fade in of the playlist entry. - */ - Gtk::TreeModelColumn fadeInColumn; - - /** - * The column for the length of the playlist entry. - */ - Gtk::TreeModelColumn lengthColumn; - - /** - * The column for the fade out of the playlist entry. - */ - Gtk::TreeModelColumn fadeOutColumn; - - /** - * The column for the pointer to the playlist element. - */ - Gtk::TreeModelColumn::Ref> - playlistElementColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(startColumn); - add(titleColumn); - add(fadeInColumn); - add(lengthColumn); - add(fadeOutColumn); - add(playlistElementColumn); - } - }; - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * Signal handler for the title being edited. - */ - void - onTitleEdited(void) throw(); - - /** - * Signal handler for the fade info being edited. - * - * @path the path representing the row in the tree model - * @columnId the ID of the row which was passed to appendColumn() - * @newText the new fade value - */ - void - onFadeInfoEdited(const Glib::ustring & path, - int columnId, - const Glib::ustring & newText) throw(); - - /** - * Signal handler for the playlist being modified outside the window. - */ - void - onPlaylistModified(void) throw(); - - /** - * Signal handler for the mouse clicked on one of the entries. - * This is used to pop up the right-click context menu. - * - * @param event the button event recieved - */ - void - onEntryClicked(GdkEventButton * event) throw (); - - /** - * Signal handler for a key pressed at one of the entries. - * The keys can be customized by the keyboardShortcutContainer - * element in the gLiveSupport configuration file. - * - * The actions handled are: moveItemUp, moveItemDown and removeItem. - * - * @param event the button event received - * @return true if the key press was fully handled, false if not - */ - bool - onKeyPressed(GdkEventKey * event) throw (); - - /** - * Signal handler for a click on the save button. - */ - void - onSaveButtonClicked(void) throw (); - - /** - * Signal handler for a click on the close button at the bottom - * right corner. - * This cancels the edited playlist; the normal close button (X) - * at the upper right corner hides the window only. - * If the playlist has been modified, a confirmation message will - * be displayed. - */ - void - onBottomCloseButtonClicked(void) throw (); - - /** - * Signal handler for the "lock fades" check button toggled. - */ - void - onLockFadesCheckButtonClicked(void) throw (); - - /** - * Signal handler for the "up" menu item selected from - * the right-click context menu. - */ - void - onUpItem(void) throw (); - - /** - * Signal handler for the "down" menu item selected from - * the right-click context menu. - */ - void - onDownItem(void) throw (); - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - PlaylistWindow(Gtk::ToggleButton * windowOpenerButton) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~PlaylistWindow(void) throw (); - - /** - * Show / update the contents of the playlist management window. - */ - virtual void - showContents(void) throw (); - - /** - * Cancel the edited playlist, after asking for confirmation. - * - * Displays a "Save playlist?" dialog, with "yes", "no" and - * "cancel" buttons. - * - * @return true if the window was closed (the user selected "yes" - * or "no"); false if not (the user selected "cancel"). - * @see GLiveSupport::cancelEditedPlaylist() - * @see closeWindow() - */ - virtual bool - cancelPlaylist(void) throw(); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // PlaylistWindow_h - diff --git a/src/products/gLiveSupport/src/RdsEntry.cxx b/src/products/gLiveSupport/src/RdsEntry.cxx deleted file mode 100644 index f17995b0c..000000000 --- a/src/products/gLiveSupport/src/RdsEntry.cxx +++ /dev/null @@ -1,116 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - - -#include "RdsEntry.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -RdsEntry :: RdsEntry(GuiObject * parent, - int index, - const Glib::ustring & type, - int width) - throw () - : GuiComponent(parent) -{ - this->type.reset(new const Glib::ustring(type)); - - glade->get_widget(addIndex("rdsCheckButton", index), checkButton); - checkButton->set_label(*getResourceUstring(type + "rdsLabel")); - - glade->get_widget(addIndex("rdsEntry", index), entry); - entry->set_width_chars(width); -} - - -/*------------------------------------------------------------------------------ - * Set the state of the widget. - *----------------------------------------------------------------------------*/ -void -RdsEntry :: setOptions(bool enabled, - Ptr::Ref value) throw () -{ - checkButton->set_active(enabled); - entry->set_text(*value); - - checkButtonSaved = enabled; - entrySaved = value; -} - - -/*------------------------------------------------------------------------------ - * Save the changes made by the user. - *----------------------------------------------------------------------------*/ -bool -RdsEntry :: saveChanges(void) throw () -{ - bool checkButtonNow = checkButton->get_active(); - Ptr::Ref - entryNow(new const Glib::ustring(entry->get_text())); - - if (!entrySaved || checkButtonNow != checkButtonSaved - || *entryNow != *entrySaved) { - Ptr::Ref optionsContainer = - gLiveSupport->getOptionsContainer(); - optionsContainer->setRdsOptions(type, entryNow, checkButtonNow); - checkButtonSaved = checkButtonNow; - entrySaved = entryNow; - return true; - } else { - return false; - } -} - - -/*------------------------------------------------------------------------------ - * Clear the entries of the widget. - *----------------------------------------------------------------------------*/ -void -RdsEntry :: reset(void) throw () -{ - Ptr::Ref empty(new const Glib::ustring("")); - setOptions(false, empty); -} - diff --git a/src/products/gLiveSupport/src/RdsEntry.h b/src/products/gLiveSupport/src/RdsEntry.h deleted file mode 100644 index ff71e951b..000000000 --- a/src/products/gLiveSupport/src/RdsEntry.h +++ /dev/null @@ -1,170 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RdsEntry_h -#define RdsEntry_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/NumericTools.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A single RDS input field. - * - */ -class RdsEntry : public GuiComponent, - private NumericTools -{ - private: - - /** - * The RDS type of the object (PS, PI, RT, etc). - */ - Ptr::Ref type; - - /** - * The saved state of the check button. - */ - bool checkButtonSaved; - - /** - * The saved contents of the entry. - */ - Ptr::Ref entrySaved; - - - protected: - - /** - * The enable/disable checkbox. - */ - Gtk::CheckButton * checkButton; - - /** - * The entry field. - */ - Gtk::Entry * entry; - - - public: - - /** - * Constructor. - * The type parameter is a string of 2 or 3 upper-case characters, - * see http://en.wikipedia.org/wiki/Radio_Data_System. - * - * @param parent the GuiObject which contains this one. - * @param index the position of this item in the list of - * RDS entries. - * @param type the type of RDS data (PS, PI, RT, etc). - * @param width the width of the entry, in characters. - */ - RdsEntry(GuiObject * parent, - int index, - const Glib::ustring & type, - int width) throw (); - - /** - * A virtual destructor. - */ - virtual - ~RdsEntry(void) throw () - { - } - - /** - * Get the type of the widget. - * Returns the RDS option type (PS, PI, RT, ...). - * - * @return the "type" parameter passed to the constructor. - */ - Ptr::Ref - getType(void) throw () - { - return type; - } - - /** - * Set the state of the widget. - * - * @param enabled the new state of the checkBox. - * @param value the new contents of the entryBin. - */ - void - setOptions(bool enabled, - Ptr::Ref value) throw (); - - /** - * Save the changes made by the user. - * - * @return true if any changes were saved; false otherwise. - */ - bool - saveChanges(void) throw (); - - /** - * Clear the entries of the widget. - */ - void - reset(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // RdsEntry_h - diff --git a/src/products/gLiveSupport/src/RdsView.cxx b/src/products/gLiveSupport/src/RdsView.cxx deleted file mode 100644 index 98a7a5cc9..000000000 --- a/src/products/gLiveSupport/src/RdsView.cxx +++ /dev/null @@ -1,147 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "RdsView.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "rdsView"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -RdsView :: RdsView (GuiObject * parent) - throw () - : GuiComponent(parent, - bundleName) -{ - Gtk::Label * deviceLabel; - glade->get_widget("rdsDeviceLabel1", deviceLabel); - deviceLabel->set_label(*getResourceUstring("deviceLabel")); - - glade->get_widget("rdsDeviceEntry1", deviceEntry); - - Ptr::Ref psEntry(new RdsEntry(this, 0, "PS", 8)); - Ptr::Ref piEntry(new RdsEntry(this, 1, "PI", 4)); - Ptr::Ref rtEntry(new RdsEntry(this, 2, "RT", 32)); - - rdsEntryList.push_back(psEntry); - rdsEntryList.push_back(piEntry); - rdsEntryList.push_back(rtEntry); - - reset(); -} - - -/*------------------------------------------------------------------------------ - * Save the changes made by the user. - *----------------------------------------------------------------------------*/ -bool -RdsView :: saveChanges(void) throw () -{ - bool touched = false; - - Ptr::Ref options = gLiveSupport->getOptionsContainer(); - Ptr::Ref oldDevice = options->getOptionItem( - OptionsContainer::serialDeviceName); - Ptr::Ref newDevice(new const Glib::ustring( - deviceEntry->get_text() )); - if (*oldDevice != *newDevice) { - options->setOptionItem(OptionsContainer::serialDeviceName, newDevice); - touched = true; - } - - RdsEntryListType::const_iterator it; - for (it = rdsEntryList.begin(); it != rdsEntryList.end(); ++it) { - Ptr::Ref rdsEntry = *it; - touched |= rdsEntry->saveChanges(); - } - - return touched; -} - - -/*------------------------------------------------------------------------------ - * Reset the widget to its saved state. - *----------------------------------------------------------------------------*/ -void -RdsView :: reset(void) throw () -{ - Ptr::Ref options = gLiveSupport->getOptionsContainer(); - deviceEntry->set_text(*options->getOptionItem( - OptionsContainer::serialDeviceName)); - - RdsEntryListType::const_iterator it; - for (it = rdsEntryList.begin(); it != rdsEntryList.end(); ++it) { - fillEntry(*it); - } -} - - -/*------------------------------------------------------------------------------ - * Fill in the entry from the OptionsContainer. - *----------------------------------------------------------------------------*/ -void -RdsView :: fillEntry(Ptr::Ref entry) throw () -{ - Ptr::Ref options = gLiveSupport->getOptionsContainer(); - - if (options) { - Ptr::Ref type = entry->getType(); - try { - bool enabled = options->getRdsEnabled(type); - Ptr::Ref - value = options->getRdsValue(type); - entry->setOptions(enabled, value); - } catch (std::invalid_argument &e) { - entry->reset(); - } - } -} - diff --git a/src/products/gLiveSupport/src/RdsView.h b/src/products/gLiveSupport/src/RdsView.h deleted file mode 100644 index ada97ba90..000000000 --- a/src/products/gLiveSupport/src/RdsView.h +++ /dev/null @@ -1,157 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RdsView_h -#define RdsView_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "RdsEntry.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The RDS view, a subclass of Gtk::VBox. - * This will be contained in another window, currently in the OptionsWindow. - * - * The layout of the view is roughly the following: - *

- *  +--- RDS view -----------------------------------+
- *  |                    ___________                 |
- *  | [x] Station name: |___________|                |
- *  |                  ________                      |
- *  | [x] Station ID: |________|                     |
- *  |                  ___________________________   |
- *  | [ ] Clip info:  |___________________________|  |
- *  |                                                |
- *  +------------------------------------------------+
- *  
- * where each item has a checkbox [x] with which one can enable or disable it. - * - * On construction, the entries are filled in using the OptionsContainer - * object found in the GLiveSupport object. The OptionsContainer can be - * updated to the new contents of the entries using saveChanges(), and the - * entries can be re-initialized from the OptionsContainer using reset(). - * - */ -class RdsView : public GuiComponent -{ - private: - - /** - * The type for the list of entry widgets. - */ - typedef std::vector::Ref> RdsEntryListType; - - /** - * The list of the entry widgets. - */ - RdsEntryListType rdsEntryList; - - /** - * Fill in the entry from the OptionsContainer. - * - * @param entry the RdsEntry to be filled in. - */ - void - fillEntry(Ptr::Ref entry) throw (); - - - protected: - - /** - * The entry field for the serial device. - */ - Gtk::Entry * deviceEntry; - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - */ - RdsView(GuiObject * parent) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~RdsView(void) throw () - { - } - - /** - * Save the changes made by the user. - * - * @return true if any changes were saved; false otherwise. - */ - bool - saveChanges(void) throw (); - - /** - * Reset the widget to its saved state. - */ - void - reset(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // RdsView_h - diff --git a/src/products/gLiveSupport/src/RestoreBackupWindow.cxx b/src/products/gLiveSupport/src/RestoreBackupWindow.cxx deleted file mode 100644 index b7c043d9a..000000000 --- a/src/products/gLiveSupport/src/RestoreBackupWindow.cxx +++ /dev/null @@ -1,281 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "RestoreBackupWindow.h" - - -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "restoreBackupWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "RestoreBackupWindow.glade"; - -/*------------------------------------------------------------------------------ - * The interval between two calls to restoreBackupCheck(), in milliseconds. - *----------------------------------------------------------------------------*/ -const unsigned int timerInterval = 10000; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -RestoreBackupWindow :: RestoreBackupWindow ( - Ptr::Ref fileName) - throw () - : GuiWindow(bundleName, - gladeFileName), - fileName(fileName), - currentState(AsyncState::pendingState) -{ - Gtk::Button * cancelButton; - glade->get_widget("restoreBackupMessageLabel1", messageLabel); - glade->get_widget("restoreBackupCancelButton1", cancelButton); - glade->get_widget("restoreBackupOkButton1", okButton); - - cancelButton->signal_clicked().connect(sigc::mem_fun(*this, - &RestoreBackupWindow::onCancelButtonClicked)); - okButton->signal_clicked().connect(sigc::mem_fun(*this, - &RestoreBackupWindow::onOkButtonClicked)); - - restoreBackupOpen(); -} - - -/*------------------------------------------------------------------------------ - * The event when the cancel button has been clicked. - *----------------------------------------------------------------------------*/ -void -RestoreBackupWindow :: onCancelButtonClicked(void) throw () -{ - // TODO: add confirmation dialog - hide(); -} - - -/*------------------------------------------------------------------------------ - * The event when the OK button has been clicked. - *----------------------------------------------------------------------------*/ -void -RestoreBackupWindow :: onOkButtonClicked(void) throw () -{ - hide(); -} - - -/*------------------------------------------------------------------------------ - * Display a localized message in the window. - *----------------------------------------------------------------------------*/ -inline void -RestoreBackupWindow :: displayMessage(const Glib::ustring & messageKey) - throw () -{ - setLabelText(*getResourceUstring(messageKey)); -} - - -/*------------------------------------------------------------------------------ - * Display a localized message in the window, with one argument. - *----------------------------------------------------------------------------*/ -inline void -RestoreBackupWindow :: displayMessage(const Glib::ustring & messageKey, - const Glib::ustring & argument) - throw () -{ - setLabelText(*formatMessage(messageKey, argument)); -} - - -/*------------------------------------------------------------------------------ - * Display an error message in the window. - *----------------------------------------------------------------------------*/ -inline void -RestoreBackupWindow :: signalError(const Glib::ustring & errorMessage) - throw () -{ - currentState = AsyncState::failedState; - displayMessage("errorMessage", errorMessage); - restoreBackupClose(); -} - - -/*------------------------------------------------------------------------------ - * Start the upload. - *----------------------------------------------------------------------------*/ -void -RestoreBackupWindow :: restoreBackupOpen(void) throw () -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - try { - token = storage->restoreBackupOpen(sessionId, fileName); - - } catch (XmlRpcException &e) { - signalError(e.what()); - return; - } - - currentState = AsyncState::pendingState; - displayMessage("pendingMessage", *fileName); - setTimer(); -} - - -/*------------------------------------------------------------------------------ - * Check on the upload. - *----------------------------------------------------------------------------*/ -void -RestoreBackupWindow :: restoreBackupCheck(void) throw () -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - - Ptr::Ref errorMessage; - try { - currentState = storage->restoreBackupCheck(*token, errorMessage); - - } catch (XmlRpcException &e) { - signalError(e.what()); - return; - } - - if (currentState == AsyncState::finishedState) { - displayMessage("finishedMessage"); - restoreBackupClose(); - - } else if (currentState == AsyncState::failedState) { - displayMessage("errorMessage", - *errorMessage); - restoreBackupClose(); - } -} - - -/*------------------------------------------------------------------------------ - * Close the upload. - *----------------------------------------------------------------------------*/ -void -RestoreBackupWindow :: restoreBackupClose(void) throw () -{ - if (token) { - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - - try { - storage->restoreBackupClose(*token); - token.reset(); - - } catch (XmlRpcException &e) { - signalError(e.what()); - return; - } - } - - resetTimer(); - okButton->set_sensitive(true); -} - - -/*------------------------------------------------------------------------------ - * The function which is called regularly when the timer is set. - *----------------------------------------------------------------------------*/ -bool -RestoreBackupWindow :: onUpdateTime(void) throw () -{ - if (currentState == AsyncState::pendingState) { - restoreBackupCheck(); - } - return true; -} - - -/*------------------------------------------------------------------------------ - * Connect the timer. - *----------------------------------------------------------------------------*/ -inline void -RestoreBackupWindow :: setTimer(void) throw () -{ - timer.reset(new sigc::connection(Glib::signal_timeout().connect( - sigc::mem_fun( - *this, - &RestoreBackupWindow::onUpdateTime), - timerInterval))); -} - - -/*------------------------------------------------------------------------------ - * Disconnect the timer. - *----------------------------------------------------------------------------*/ -inline void -RestoreBackupWindow :: resetTimer(void) throw () -{ - timer->disconnect(); -} - - -/*------------------------------------------------------------------------------ - * Close the connection and hide the window. - *----------------------------------------------------------------------------*/ -void -RestoreBackupWindow :: hide(void) throw () -{ - restoreBackupClose(); - GuiWindow::hide(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for closing the window from the window manager. - *----------------------------------------------------------------------------*/ -bool -RestoreBackupWindow :: onDeleteEvent(GdkEventAny * event) throw () -{ - restoreBackupClose(); - return false; -} - diff --git a/src/products/gLiveSupport/src/RestoreBackupWindow.h b/src/products/gLiveSupport/src/RestoreBackupWindow.h deleted file mode 100644 index e4e49af1a..000000000 --- a/src/products/gLiveSupport/src/RestoreBackupWindow.h +++ /dev/null @@ -1,242 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RestoreBackupWindow_h -#define RestoreBackupWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "GLiveSupport.h" - -#include "GuiWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A pop-up window displaying the progress of a restore backup task. - * - */ -class RestoreBackupWindow : public GuiWindow -{ - private: - - /** - * The label holding the current message displayed by the window. - */ - Gtk::Label * messageLabel; - - /** - * The OK button. - */ - Gtk::Button * okButton; - - /** - * The file name of the backup file to be uploaded. - */ - Ptr::Ref fileName; - - /** - * The current state of the upload task. - */ - AsyncState currentState; - - /** - * The token of the upload task. - */ - Ptr::Ref token; - - /** - * The connection object to the timer signal. - */ - Ptr::Ref timer; - - - protected: - - /** - * Event handler for the cancel button being clicked. - */ - virtual void - onCancelButtonClicked(void) throw (); - - /** - * Event handler for the ok button being clicked. - */ - virtual void - onOkButtonClicked(void) throw (); - - /** - * Event handler for closing the window from the window manager. - * Calls StorageClientInterface::restoreBackupClose(). - * - * Overrides GuiWindow::onDeleteEvent(). - * - * @param event attributes of the event. - * @return true if handled the event, false to continue deleting. - */ - virtual bool - onDeleteEvent(GdkEventAny * event) throw (); - - /** - * Set the text of the label. - * - * @param text the new text of the label. - */ - virtual void - setLabelText(const Glib::ustring & text) throw () - { - messageLabel->set_text(text); - } - - /** - * Display a localized message in the window. - * - * @param messageKey the localization key of the message. - */ - virtual void - displayMessage(const Glib::ustring & messageKey) throw (); - - /** - * Display a localized message in the window, with one argument. - * - * @param messageKey the localization key of the message. - * @param argument the string to substitute for {0}. - */ - virtual void - displayMessage(const Glib::ustring & messageKey, - const Glib::ustring & argument) throw (); - - /** - * Signal an error. - * Prints the error message, sets the internal state to failedState, - * and re-sensitizes the OK button. - * - * @param errorMessage the error message to be displayed. - */ - virtual void - signalError(const Glib::ustring & errorMessage) throw (); - - /** - * Call the restoreBackupOpen function in the storage client. - */ - virtual void - restoreBackupOpen(void) throw (); - - /** - * Call the restoreBackupCheck function in the storage client. - */ - virtual void - restoreBackupCheck(void) throw (); - - /** - * Call the restoreBackupClose function in the storage client. - */ - virtual void - restoreBackupClose(void) throw (); - - /** - * The function which is called regularly when the timer is set. - * - * This is just a wrapper for restoreBackupCheck(), with a bool - * return value (always true), because Glib::signal_timeout expects - * a sigc::slot0. - * TODO: figure out what this return value does. - */ - virtual bool - onUpdateTime(void) throw (); - - /** - * Connect the timer. - */ - virtual void - setTimer(void) throw (); - - /** - * Disconnect the timer. - */ - virtual void - resetTimer(void) throw (); - - - public: - - /** - * Constructor. - * - * @param fileName the file name of the backup to be restored. - */ - RestoreBackupWindow(Ptr::Ref fileName) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~RestoreBackupWindow(void) throw () - { - } - - /** - * Close the connection and hide the window. - * Calls StorageClientInterface::restoreBackupClose(). - * - * Overrides GuiWindow::hide(). - */ - virtual void - hide(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // RestoreBackupWindow_h - diff --git a/src/products/gLiveSupport/src/SchedulePlaylistWindow.cxx b/src/products/gLiveSupport/src/SchedulePlaylistWindow.cxx deleted file mode 100644 index 8834669dd..000000000 --- a/src/products/gLiveSupport/src/SchedulePlaylistWindow.cxx +++ /dev/null @@ -1,137 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include "boost/date_time/posix_time/posix_time.hpp" - -#include "LiveSupport/Core/TimeConversion.h" - -#include "SchedulePlaylistWindow.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "schedulePlaylistWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "SchedulePlaylistWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -SchedulePlaylistWindow :: SchedulePlaylistWindow (Ptr::Ref playlist) - throw () - : GuiWindow(bundleName, - gladeFileName), - playlist(playlist) -{ - Gtk::Label * playlistLabel; - glade->get_widget("playlistLabel1", playlistLabel); - playlistLabel->set_label(*playlist->getTitle()); - - Gtk::Label * hourLabel; - Gtk::Label * minuteLabel; - Gtk::Label * secondLabel; - glade->get_widget("hourLabel1", hourLabel); - glade->get_widget("minuteLabel1", minuteLabel); - glade->get_widget("secondLabel1", secondLabel); - hourLabel->set_label(*getResourceUstring("hourLabel")); - minuteLabel->set_label(*getResourceUstring("minuteLabel")); - secondLabel->set_label(*getResourceUstring("secondLabel")); - - glade->get_widget("calendar1", calendar); - - glade->get_widget("hourSpinButton1", hourEntry); - glade->get_widget("minuteSpinButton1", minuteEntry); - glade->get_widget("secondSpinButton1", secondEntry); - Ptr::Ref now = TimeConversion::now(); - boost::posix_time::time_duration time = now->time_of_day(); - hourEntry->set_value(time.hours()); - minuteEntry->set_value(time.minutes() + 1); - secondEntry->set_value(0); - - Gtk::Button * scheduleButton; - glade->get_widget("scheduleButton1", scheduleButton); - scheduleButton->set_label(*getResourceUstring("scheduleButtonLabel")); - scheduleButton->signal_clicked().connect(sigc::mem_fun(*this, - &SchedulePlaylistWindow::onScheduleButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the schedule button getting clicked. - *----------------------------------------------------------------------------*/ -void -SchedulePlaylistWindow :: onScheduleButtonClicked (void) throw () -{ - unsigned int year; - unsigned int month; - unsigned int day; - calendar->get_date(year, month, day); - ++month; // Gtk+ months are 0-based, Boost months are 1-based - - int hours = hourEntry->get_value_as_int(); - int minutes = minuteEntry->get_value_as_int(); - int seconds = secondEntry->get_value_as_int(); - - Ptr::Ref dateTime(new boost::posix_time::ptime( - boost::gregorian::date(year, month, day), - boost::posix_time::time_duration(hours, minutes, seconds) )); - - try { - gLiveSupport->schedulePlaylist(playlist, dateTime); - } catch (XmlRpcException &e) { - // TODO: notify user - std::cerr << "scheduling problem: " << e.what() << std::endl; - return; - } - - mainWindow->hide(); -} - diff --git a/src/products/gLiveSupport/src/SchedulePlaylistWindow.h b/src/products/gLiveSupport/src/SchedulePlaylistWindow.h deleted file mode 100644 index 6b15058fc..000000000 --- a/src/products/gLiveSupport/src/SchedulePlaylistWindow.h +++ /dev/null @@ -1,145 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SchedulePlaylistWindow_h -#define SchedulePlaylistWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "GLiveSupport.h" - -#include "GuiWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The window, for scheduling a specific playlist. - * - * The rough layout of the window is: - *
- *  +--- scheduler window ----------------------------+
- *  | +--- plalyist name ---------------------------+ |
- *  | +--- calendar --------------------------------+ |
- *  | |                                             | |
- *  | +---------------------------------------------+ |
- *  | +--- time input ------------------------------+ |
- *  | | hour: +- hour -+  minute: +- minute -+      | |
- *  | +---------------------------------------------+ |
- *  | +-- schedule button --------------------------+ |
- *  | +-- close button -----------------------------+ |
- *  +-------------------------------------------------+
- *  
- * - */ -class SchedulePlaylistWindow : public GuiWindow -{ - private: - - /** - * The playlist to schedule. - */ - Ptr::Ref playlist; - - /** - * The calendar to select a specific date from. - */ - Gtk::Calendar * calendar; - - /** - * The entry field for hours. - */ - Gtk::SpinButton * hourEntry; - - /** - * The entry field for minutes. - */ - Gtk::SpinButton * minuteEntry; - - /** - * The entry field for seconds. - */ - Gtk::SpinButton * secondEntry; - - - protected: - - /** - * Event handler for the schedule button clicked. - */ - virtual void - onScheduleButtonClicked(void) throw (); - - - public: - - /** - * Constructor. - * - * @param playlist the playlist to schedule. - */ - SchedulePlaylistWindow(Ptr::Ref playlist) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~SchedulePlaylistWindow(void) throw () - { - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // SchedulePlaylistWindow_h - diff --git a/src/products/gLiveSupport/src/SchedulerWindow.cxx b/src/products/gLiveSupport/src/SchedulerWindow.cxx deleted file mode 100644 index 72b070fa0..000000000 --- a/src/products/gLiveSupport/src/SchedulerWindow.cxx +++ /dev/null @@ -1,369 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "SchedulerWindow.h" - - -using namespace boost; -using namespace Glib; - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "schedulerWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "SchedulerWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -SchedulerWindow :: SchedulerWindow ( - Gtk::ToggleButton * windowOpenerButton) - throw (XmlRpcException) - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton) -{ - constructScheduleView(); - constructStatusView(); - - Gtk::Label * scheduleTabLabel; - Gtk::Label * statusTabLabel; - glade->get_widget("scheduleTabLabel1", scheduleTabLabel); - glade->get_widget("statusTabLabel1", statusTabLabel); - scheduleTabLabel->set_label(*getResourceUstring("scheduleTab")); - statusTabLabel->set_label(*getResourceUstring("statusTab")); - - glade->connect_clicked("closeButton1", sigc::mem_fun(*this, - &SchedulerWindow::hide)); - - showContents(); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -SchedulerWindow :: ~SchedulerWindow (void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Construct the Schedule view. - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: constructScheduleView(void) throw () -{ - glade->get_widget("calendar1", calendar); - glade->get_widget("dateLabel1", dateLabel); - - // create the tree view for the entries - entriesModel = Gtk::ListStore::create(entryColumns); - glade->get_widget_derived("entriesTreeView1", entriesTreeView); - entriesTreeView->set_model(entriesModel); - entriesTreeView->connectModelSignals(entriesModel); - - entriesTreeView->append_column(*getResourceUstring("startColumnLabel"), - entryColumns.startColumn); - entriesTreeView->append_column(*getResourceUstring("titleColumnLabel"), - entryColumns.titleColumn); - entriesTreeView->append_column(*getResourceUstring("endColumnLabel"), - entryColumns.endColumn); - - // register the signal handler for entries view entries being clicked - entriesTreeView->signal_button_press_event().connect_notify( - sigc::mem_fun(*this, - &SchedulerWindow::onEntryClicked)); - - // create the right-click entry context menu - entryMenu.reset(new Gtk::Menu()); - Gtk::Menu::MenuList& menuList = entryMenu->items(); - menuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("deleteMenuItem"), - sigc::mem_fun(*this, - &SchedulerWindow::onDeleteItem))); - entryMenu->accelerate(*mainWindow); - - // register the signal handle for when a date is selected in the calendar - calendar->signal_day_selected().connect(sigc::mem_fun(*this, - &SchedulerWindow::onDateSelected)); - - // initialize the selected date for today - selectedDate.reset(new gregorian::date(TimeConversion::now()->date())); -} - - -/*------------------------------------------------------------------------------ - * Construct the Status view. - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: constructStatusView(void) throw () -{ - Gtk::Label * stopCurrentlyPlayingLabel; - Gtk::Button * stopCurrentlyPlayingButton; - glade->get_widget("stopCurrentlyPlayingLabel1", stopCurrentlyPlayingLabel); - glade->get_widget("stopCurrentlyPlayingButton1", - stopCurrentlyPlayingButton); - stopCurrentlyPlayingLabel->set_label( - *getResourceUstring("stopCurrentlyPlayingText")); - stopCurrentlyPlayingButton->set_label( - *getResourceUstring("stopCurrentlyPlayingButtonLabel")); - stopCurrentlyPlayingButton->signal_clicked().connect(sigc::mem_fun(*this, - &SchedulerWindow::onStopCurrentlyPlayingButtonClicked)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for a date being selected on the calendar - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: onDateSelected (void) throw () -{ - guint year; - guint month; - guint day; - - calendar->get_date(year, month, day); - - try { - Ptr::Ref date(new gregorian::date(year, month+1, day)); - if (*date != *selectedDate) { - selectedDate = date; - showContents(); - } - } catch (std::out_of_range &e) { - // TODO: report date out of range error - std::cerr << e.what() << std::endl; - } catch (XmlRpcException &e) { - // TODO: report storage server error - std::cerr << e.what() << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Move the time to be displayed to the specified time. - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: setTime(Ptr::Ref time) - throw () -{ - selectedDate.reset(new gregorian::date(time->date())); -} - - -/*------------------------------------------------------------------------------ - * Update the contents of the display, with regards to the currently selected - * date - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: showContents(void) throw (XmlRpcException) -{ - calendar->select_month(selectedDate->month() - 1, selectedDate->year()); - calendar->select_day(selectedDate->day()); - - dateLabel->set_text(to_simple_string(*selectedDate)); - - Ptr::Ref> >::Ref entries; - std::vector::Ref>::iterator it; - std::vector::Ref>::iterator end; - Ptr::Ref from; - Ptr::Ref to; - Ptr::Ref midnight; - - // we're interested from midnight, selectedDate, to midnight, the next day - midnight.reset(new posix_time::time_duration(0, 0, 0, 0)); - from.reset(new posix_time::ptime(*selectedDate, *midnight)); - to.reset(new posix_time::ptime(*selectedDate + gregorian::date_duration(1), - *midnight)); - - entries = gLiveSupport->displaySchedule(from, to); - - it = entries->begin(); - end = entries->end(); - entriesModel->clear(); - while (it != end) { - Ptr::Ref playlist; - Ptr::Ref entry = *it; - Ptr::Ref playlistId(new UniqueId( - entry->getPlaylistId()->getId())); - - if (!gLiveSupport->existsPlaylist(playlistId)) { - ++it; - continue; - } - - playlist = gLiveSupport->getPlaylist(playlistId); - - Gtk::TreeModel::Row row = *(entriesModel->append()); - - row[entryColumns.idColumn] = entry->getId(); - row[entryColumns.startColumn] = - to_simple_string(*entry->getStartTime()); - row[entryColumns.titleColumn] = *playlist->getTitle(); - row[entryColumns.endColumn] = to_simple_string(*entry->getEndTime()); - - ++it; - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for an entry being clicked in the list - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: onEntryClicked (GdkEventButton * event) throw () -{ - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - // only show the context menu, if something is already selected - Glib::RefPtr refSelection = - entriesTreeView->get_selection(); - if (refSelection) { - Gtk::TreeModel::iterator iter = refSelection->get_selected(); - if (iter) { - entryMenu->popup(event->button, event->time); - } - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Delete menu item selected from the entry context menu - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: onDeleteItem(void) throw () -{ - Glib::RefPtr refSelection = - entriesTreeView->get_selection(); - - if (refSelection) { - Gtk::TreeModel::iterator iter = refSelection->get_selected(); - if (iter) { - Ptr::Ref entryId = (*iter)[entryColumns.idColumn]; - - try { - gLiveSupport->removeFromSchedule(entryId); - } catch (XmlRpcException &e) { - // TODO: signal error here - } - - try { - showContents(); - } catch (XmlRpcException &e) { - // TODO: signal error here - } - } - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the "stop currently playing" button getting clicked. - *----------------------------------------------------------------------------*/ -void -SchedulerWindow :: onStopCurrentlyPlayingButtonClicked(void) throw () -{ - Gtk::ResponseType result = runConfirmationDialog(); - switch (result) { - case Gtk::RESPONSE_YES: - break; - - case Gtk::RESPONSE_NO: - return; - break; - - default : // can happen if the window - return; // is closed with Alt-F4 - break; // -- treated as No - } - - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - Ptr::Ref - scheduler = gLiveSupport->getScheduler(); - - try { - scheduler->stopCurrentlyPlaying(sessionId); - - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(e.what()); - } - - showContents(); -} - - -/*------------------------------------------------------------------------------ - * Run the confirmation window. - *----------------------------------------------------------------------------*/ -Gtk::ResponseType -SchedulerWindow :: runConfirmationDialog(void) throw () -{ - Gtk::Dialog * confirmationDialog; - Gtk::Label * confirmationDialogLabel; - glade->get_widget("confirmationDialog1", confirmationDialog); - glade->get_widget("confirmationDialogLabel1", confirmationDialogLabel); - - Glib::ustring message = ""; - message += *getResourceUstring("stopCurrentlyPlayingDialogMsg"); - message += ""; - confirmationDialogLabel->set_label(message); - - Gtk::ResponseType response = Gtk::ResponseType( - confirmationDialog->run()); - confirmationDialog->hide(); - return response; -} - diff --git a/src/products/gLiveSupport/src/SchedulerWindow.h b/src/products/gLiveSupport/src/SchedulerWindow.h deleted file mode 100644 index 5a0954182..000000000 --- a/src/products/gLiveSupport/src/SchedulerWindow.h +++ /dev/null @@ -1,266 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SchedulerWindow_h -#define SchedulerWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "GuiWindow.h" -#include "GLiveSupport.h" - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The Scheduler window, showing and allowing scheduling of playlists. - * - * The window is tabbed, with a main Schedule tab, and a Status tab showing - * the status of the scheduler daemon (running/stopped). In the Status tab, - * one can send a Stop signal to the Scheduler, to stop the audio player. - * - * The rough layout of the Schedule tab: - *
- *  +--- scheduler window ----------------------------+
- *  | +--- calendar --------------------------------+ |
- *  | |                                             | |
- *  | +---------------------------------------------+ |
- *  | +--- the selected day ------------------------+ |
- *  | +--- entires for the selected day ------------+ |
- *  | | +--- entry 1 -----------------------------+ | |
- *  | | | +-- start --+ +-- title --+ +-- end --+ | | |
- *  | | +-----------------------------------------+ | |
- *  | | +--- entry 2 -----------------------------+ | |
- *  | | | +-- start --+ +-- title --+ +-- end --+ | | |
- *  | | +-----------------------------------------+ | |
- *  | +---------------------------------------------+ |
- *  | +-- close button -----------------------------+ |
- *  +-------------------------------------------------+
- *  
- * - */ -class SchedulerWindow : public GuiWindow -{ - private: - - /** - * Construct the Schedule view. - * This displays the list of scheduled playlists. - */ - void - constructScheduleView(void) throw (); - - /** - * Construct the Status view. - * This shows the status of the scheduler daemon. - */ - void - constructStatusView(void) throw (); - - /** - * Run the confirmation dialog. - * - * @return the response ID returned by the dialog. - */ - Gtk::ResponseType - runConfirmationDialog(void) throw (); - - - protected: - - /** - * The columns model needed by Gtk::TreeView. - * Lists one scheduled item per row. - * - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - /** - * The column for the id of the playlist. - */ - Gtk::TreeModelColumn::Ref> idColumn; - - /** - * The column for the start of the playlist. - */ - Gtk::TreeModelColumn startColumn; - - /** - * The column for the title of the playlist. - */ - Gtk::TreeModelColumn titleColumn; - - /** - * The column for the end of the playlist. - */ - Gtk::TreeModelColumn endColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(idColumn); - add(startColumn); - add(titleColumn); - add(endColumn); - } - }; - - - /** - * The date selected for display. - */ - Ptr::Ref selectedDate; - - /** - * The calendar to select a specific date from. - */ - Gtk::Calendar * calendar; - - /** - * The label saying which day is being displayed. - */ - Gtk::Label * dateLabel; - - /** - * The column model. - */ - ModelColumns entryColumns; - - /** - * The tree view, now only showing rows, each scheduled entry for a - * specific day. - */ - ZebraTreeView * entriesTreeView; - - /** - * The tree model, as a GTK reference. - */ - Glib::RefPtr entriesModel; - - /** - * The right-click context menu for schedule entries. - */ - Ptr::Ref entryMenu; - - /** - * Signal handler for when a date is selected in the calendar. - */ - virtual void - onDateSelected(void) throw (); - - /** - * Signal handler for the mouse clicked on one of the entries. - * - * @param event the button event recieved - */ - virtual void - onEntryClicked(GdkEventButton * event) throw (); - - /** - * Signal handler for the "delete" menu item selected from - * the entry context menu. - */ - virtual void - onDeleteItem(void) throw (); - - /** - * Signal handler for the "stop currently playing" button - * getting clicked. - */ - virtual void - onStopCurrentlyPlayingButtonClicked(void) throw (); - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - SchedulerWindow(Gtk::ToggleButton * windowOpenerButton) - throw (XmlRpcException); - - /** - * Virtual destructor. - */ - virtual - ~SchedulerWindow(void) throw (); - - /** - * Select a specific timepoint to display. - * Call showContents() after this call. - * - * @param time display the schedule around this timepoint. - * @see #showContents - */ - virtual void - setTime(Ptr::Ref time) throw (); - - /** - * Update the display, with regards to the currently selected day. - */ - virtual void - showContents(void) throw (XmlRpcException); - -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // SchedulerWindow_h - diff --git a/src/products/gLiveSupport/src/ScratchpadWindow.cxx b/src/products/gLiveSupport/src/ScratchpadWindow.cxx deleted file mode 100644 index 6cdbdf0ad..000000000 --- a/src/products/gLiveSupport/src/ScratchpadWindow.cxx +++ /dev/null @@ -1,673 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Widgets/WidgetFactory.h" - -#include "ScratchpadWindow.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "scratchpadWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "ScratchpadWindow.glade"; - -/*------------------------------------------------------------------------------ - * The name of the user preference for storing Scratchpad contents - *----------------------------------------------------------------------------*/ -const Glib::ustring userPreferencesKeyName = "scratchpadContents"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -ScratchpadWindow :: ScratchpadWindow ( - Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton) -{ - // create the tree view - glade->get_widget_derived("treeView1", treeView); - treeView->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); - - treeView->appendColumn("", - modelColumns.typeColumn); - treeView->appendColumn(*getResourceUstring("creatorColumnLabel"), - modelColumns.creatorColumn); - treeView->appendColumn(*getResourceUstring("titleColumnLabel"), - modelColumns.titleColumn); - - treeModel = Gtk::ListStore::create(modelColumns); - treeView->set_model(treeModel); - treeView->connectModelSignals(treeModel); - setupDndCallbacks(); - - // register the signal handlers for treeview - treeView->signal_button_press_event().connect(sigc::mem_fun(*this, - &ScratchpadWindow::onEntryClicked), - false /* call this first */); - treeView->signal_row_activated().connect(sigc::mem_fun(*this, - &ScratchpadWindow::onDoubleClick)); - treeView->signal_key_press_event().connect(sigc::mem_fun(*this, - &ScratchpadWindow::onKeyPressed)); - - // create the cue player widget - cuePlayer.reset(new CuePlayer(this, - treeView, - modelColumns)); - - // create the right-click entry context menu for audio clips - audioClipContextMenu.reset(new Gtk::Menu()); - audioClipContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("cueMenuItem"), - sigc::mem_fun(*cuePlayer, - &CuePlayer::onPlayItem))); - audioClipContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToLiveModeMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onAddToLiveMode))); - audioClipContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToPlaylistMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onAddToPlaylist))); - audioClipContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("removeMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onRemoveMenuOption))); - audioClipContextMenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - audioClipContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("uploadToHubMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onUploadToHub))); - audioClipContextMenu->accelerate(*mainWindow); - - // create the right-click entry context menu for playlists - playlistContextMenu.reset(new Gtk::Menu()); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("cueMenuItem"), - sigc::mem_fun(*cuePlayer, - &CuePlayer::onPlayItem))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToLiveModeMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onAddToLiveMode))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToPlaylistMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onAddToPlaylist))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("removeMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onRemoveMenuOption))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("editPlaylistMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onEditPlaylist))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("schedulePlaylistMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onSchedulePlaylist))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("exportPlaylistMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onExportPlaylist))); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - playlistContextMenu->items().push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("uploadToHubMenuItem"), - sigc::mem_fun(*this, - &ScratchpadWindow::onUploadToHub))); - playlistContextMenu->accelerate(*mainWindow); - - // set the user preferences key - userPreferencesKey.reset(new const Glib::ustring(userPreferencesKeyName)); -} - - -/*------------------------------------------------------------------------------ - * Event handler for an entry being clicked in the list - *----------------------------------------------------------------------------*/ -bool -ScratchpadWindow :: onEntryClicked (GdkEventButton * event) throw () -{ - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - Ptr::Ref playable = getFirstSelectedPlayable(); - - if (selectedPaths->size() == 1) { - if (playable->getType() == Playable::AudioClipType) { - audioClipContextMenu->popup(event->button, event->time); - return true; - - } else if (playable->getType() == Playable::PlaylistType) { - playlistContextMenu->popup(event->button, event->time); - return true; - } - - } else if (selectedPaths->size() > 1) { - audioClipContextMenu->popup(event->button, event->time); - return true; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Return the first selected playable item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -ScratchpadWindow :: getFirstSelectedPlayable(void) throw () -{ - Ptr::Ref playable; - - Glib::RefPtr - selection = treeView->get_selection(); - selectedPaths.reset(new std::vector( - selection->get_selected_rows())); - - if (selectedPaths->size() > 0) { - selectedIter = selectedPaths->begin(); - Gtk::TreeRow row = *(treeModel->get_iter(*selectedIter)); - playable = row[modelColumns.playableColumn]; - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Return the next selected playable item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -ScratchpadWindow :: getNextSelectedPlayable(void) throw () -{ - Ptr::Ref playable; - - if (selectedPaths) { - if (selectedIter != selectedPaths->end()) { - Gtk::TreeRow row = *(treeModel->get_iter(*selectedIter)); - playable = row[modelColumns.playableColumn]; - ++selectedIter; - } else { - selectedPaths.reset(); - } - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Remove an item from the Scratchpad - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: removeItem(Ptr::Ref id) throw () -{ - Gtk::TreeModel::const_iterator it; - - for (it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - - Gtk::TreeRow row = *it; - Ptr::Ref currentPlayable = row[modelColumns.playableColumn]; - - if (*id == *currentPlayable->getId()) { - treeModel->erase(it); - return; - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Edit Playlist menu item selected from the - * entry context menu - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onEditPlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - - try { - gLiveSupport->openPlaylistForEditing(playable->getId()); - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(*getResourceUstring( - "cannotEditPlaylistMsg" )); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Schedule Playlist menu item selected from the - * entry context menu - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onSchedulePlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - schedulePlaylistWindow.reset(new SchedulePlaylistWindow(playlist)); - schedulePlaylistWindow->getWindow()->set_transient_for(*mainWindow); - Gtk::Main::run(*schedulePlaylistWindow->getWindow()); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "export playlist" in the context menu. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onExportPlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - exportPlaylistWindow.reset(new ExportPlaylistWindow(playlist)); - exportPlaylistWindow->getWindow()->set_transient_for(*mainWindow); - Gtk::Main::run(*exportPlaylistWindow->getWindow()); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Add To Playlist menu item selected from the - * entry context menu - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onAddToPlaylist(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - try { - gLiveSupport->addToPlaylist(playable->getId()); - } catch (XmlRpcException &e) { - std::cerr << "error in ScratchpadWindow::onAddToPlaylist(): " - << e.what() << std::endl; - return; - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Add To Live Mode menu item selected from the - * entry context menu - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onAddToLiveMode(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - gLiveSupport->addToLiveMode(playable); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "upload to hub" in the context menu. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onUploadToHub(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - gLiveSupport->uploadToHub(playable); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Remove menu item selected from the context menu. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onRemoveMenuOption(void) throw () -{ - Glib::RefPtr selection - = treeView->get_selection(); - std::vector selectedPaths - = selection->get_selected_rows(); - - std::vector selectedIters; - for (std::vector::iterator pathIt = selectedPaths.begin(); - pathIt != selectedPaths.end(); - ++pathIt) { - selectedIters.push_back(treeModel->get_iter(*pathIt)); - } - - Gtk::TreeModel::iterator newSelection; - for (std::vector::iterator - iterIt = selectedIters.begin(); - iterIt != selectedIters.end(); - ++iterIt) { - newSelection = *iterIt; - ++newSelection; - treeModel->erase(*iterIt); - } - - if (newSelection) { - selection->select(newSelection); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the user double-clicking or pressing Enter. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: onDoubleClick(const Gtk::TreeModel::Path & path, - const Gtk::TreeViewColumn * column) - throw () -{ - Ptr::Ref playable = getFirstSelectedPlayable(); - - if (playable) { - onAddToLiveMode(); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for a key pressed. - *----------------------------------------------------------------------------*/ -bool -ScratchpadWindow :: onKeyPressed(GdkEventKey * event) throw () -{ - if (event->type == GDK_KEY_PRESS) { - KeyboardShortcut::Action action = gLiveSupport->findAction( - "scratchpadWindow", - Gdk::ModifierType(event->state), - event->keyval); - switch (action) { - case KeyboardShortcut::moveItemUp : - if (selectionIsSingle()) { - treeView->onUpMenuOption(); - return true; - } - break; - - case KeyboardShortcut::moveItemDown : - if (selectionIsSingle()) { - treeView->onDownMenuOption(); - return true; - } - break; - - case KeyboardShortcut::removeItem : - onRemoveMenuOption(); - return true; - break; - - default : break; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Check whether exactly one row is selected. - *----------------------------------------------------------------------------*/ -bool -ScratchpadWindow :: selectionIsSingle(void) throw () -{ - getFirstSelectedPlayable(); - - return (selectedPaths->size() == 1); -} - - -/*------------------------------------------------------------------------------ - * Add an item to the Scratchpad. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: addItem(Ptr::Ref playable) - throw () -{ - // cache the item if it hasn't been cached yet - if (!playable->getToken()) { - try { - playable = gLiveSupport->acquirePlayable(playable->getId()); - } catch (XmlRpcException &e) { - std::cerr << "could not acquire playable in ScratchpadWindow: " - << e.what() << std::endl; - return; - } - } - - removeItem(playable->getId()); - - Gtk::TreeModel::Row row = *(treeModel->prepend()); - - row[modelColumns.playableColumn] = playable; - - Ptr::Ref widgetFactory = WidgetFactory::getInstance(); - - switch (playable->getType()) { - case Playable::AudioClipType: - row[modelColumns.typeColumn] = widgetFactory->getPixbuf( - WidgetConstants::audioClipIconImage); - break; - - case Playable::PlaylistType: - row[modelColumns.typeColumn] = widgetFactory->getPixbuf( - WidgetConstants::playlistIconImage); - break; - } - - Ptr::Ref creator = playable->getMetadata( - "dc:creator"); - if (creator) { - row[modelColumns.creatorColumn] = Glib::Markup::escape_text( - *creator); - } - row[modelColumns.titleColumn] = Glib::Markup::escape_text( - *playable->getTitle()); -} - - -/*------------------------------------------------------------------------------ - * Add an item to the Scratchpad. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: addItem(Ptr::Ref id) - throw () -{ - Ptr::Ref playable; - try { - playable = gLiveSupport->acquirePlayable(id); - } catch (XmlRpcException &e) { - std::cerr << "could not acquire playable in ScratchpadWindow: " - << e.what() << std::endl; - return; - } - - addItem(playable); -} - - -/*------------------------------------------------------------------------------ - * Return the contents of the Scratchpad. - *----------------------------------------------------------------------------*/ -Ptr::Ref -ScratchpadWindow :: getContents(void) throw () -{ - std::ostringstream contentsStream; - Gtk::TreeModel::const_iterator it; - - for (it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - Gtk::TreeRow row = *it; - Ptr::Ref playable = row[modelColumns.playableColumn]; - contentsStream << playable->getId()->getId() << " "; - } - - Ptr::Ref contents(new Glib::ustring( - contentsStream.str() )); - return contents; -} - - -/*------------------------------------------------------------------------------ - * Restore the contents of the Scratchpad. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: setContents(Ptr::Ref contents) - throw () -{ - std::vector contentsVector; - std::istringstream contentsStream(*contents); - while (!contentsStream.eof()) { - UniqueId::IdType nextItem; - contentsStream >> nextItem; - if (contentsStream.fail()) { - contentsStream.clear(); - contentsStream.ignore(); - } else { - contentsVector.push_back(nextItem); - } - } - - treeModel->clear(); - std::vector::reverse_iterator it; - - for (it = contentsVector.rbegin(); it != contentsVector.rend(); ++it) { - Ptr::Ref id(new const UniqueId(*it)); - addItem(id); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler called when the the window gets hidden. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: hide(void) throw () -{ - if (exportPlaylistWindow) { - exportPlaylistWindow->getWindow()->hide(); - } - if (schedulePlaylistWindow) { - schedulePlaylistWindow->getWindow()->hide(); - } - - GuiWindow::hide(); -} - - -/*------------------------------------------------------------------------------ - * The name of the window for the d'n'd methods. - *----------------------------------------------------------------------------*/ -Glib::ustring -ScratchpadWindow :: getWindowNameForDnd (void) throw () -{ - return bundleName; -} - - -/*------------------------------------------------------------------------------ - * Add an item to the Scratchpad at the given position. - *----------------------------------------------------------------------------*/ -void -ScratchpadWindow :: addItem(Gtk::TreeIter iter, - Ptr::Ref id) - throw () -{ - Ptr::Ref playable; - try { - playable = gLiveSupport->acquirePlayable(id); - } catch (XmlRpcException &e) { - std::cerr << "could not acquire playable in ScratchpadWindow: " - << e.what() << std::endl; - return; - } - - Gtk::TreeModel::Row row = *iter; - - row[modelColumns.playableColumn] = playable; - - Ptr::Ref widgetFactory = WidgetFactory::getInstance(); - - switch (playable->getType()) { - case Playable::AudioClipType: - row[modelColumns.typeColumn] = widgetFactory->getPixbuf( - WidgetConstants::audioClipIconImage); - break; - - case Playable::PlaylistType: - row[modelColumns.typeColumn] = widgetFactory->getPixbuf( - WidgetConstants::playlistIconImage); - break; - } - - Ptr::Ref creator = playable->getMetadata( - "dc:creator"); - if (creator) { - row[modelColumns.creatorColumn] = Glib::Markup::escape_text( - *creator); - } - row[modelColumns.titleColumn] = Glib::Markup::escape_text( - *playable->getTitle()); -} - - diff --git a/src/products/gLiveSupport/src/ScratchpadWindow.h b/src/products/gLiveSupport/src/ScratchpadWindow.h deleted file mode 100644 index aef23d991..000000000 --- a/src/products/gLiveSupport/src/ScratchpadWindow.h +++ /dev/null @@ -1,424 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ScratchpadWindow_h -#define ScratchpadWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "GuiWindow.h" -#include "ContentsStorable.h" -#include "DndMethods.h" - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "CuePlayer.h" -#include "ExportPlaylistWindow.h" -#include "SchedulePlaylistWindow.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The Scratchpad window, showing recent and relevant audio clips and - * playlists. - * - */ -class ScratchpadWindow : public GuiWindow, - public ContentsStorable, - public DndMethods -{ - private: - - /** - * The user preferences key. - */ - Ptr::Ref userPreferencesKey; - - /** - * The Export Playlist pop-up window. - */ - Ptr::Ref exportPlaylistWindow; - - /** - * The Schedule Playlist pop-up window. - */ - Ptr::Ref schedulePlaylistWindow; - - /** - * The list of selected rows, as path references (row numbers). - * Reset by onEntryClicked(). - */ - Ptr >::Ref selectedPaths; - /** - * One of the selected rows, set to the first one by onEntryClicked(). - * Incremented by getNextSelectedPlayable(). - */ - std::vector::const_iterator selectedIter; - - /** - * Check whether exactly one row is selected. - * - * This is an auxilliary function used by onKeyPressed(). - * - * @return true if a single row is selected, false if not. - */ - bool - selectionIsSingle(void) throw (); - - /** - * Remove an item from the Scratchpad. - * If an item with the specified unique ID is found, it is removed. - * (There should never be more than one entry with the same ID; - * if there are, then only the first one is removed.) - * If no such item is found, the function does nothing. - * - * @param id the id of the item to remove. - */ - void - removeItem(Ptr::Ref id) throw (); - - - protected: - - /** - * The columns model needed by Gtk::TreeView. - * Lists one clip per row. - * - */ - class ModelColumns : public PlayableTreeModelColumnRecord - { - public: - - /** - * The column for the type of the entry in the list - */ - Gtk::TreeModelColumn > - typeColumn; - - /** - * The column for the creator of the audio clip or playlist. - */ - Gtk::TreeModelColumn creatorColumn; - - /** - * The column for the title of the audio clip or playlist. - */ - Gtk::TreeModelColumn titleColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(typeColumn); - add(creatorColumn); - add(titleColumn); - } - }; - - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * The tree model, as a GTK reference. - */ - Glib::RefPtr treeModel; - - /** - * The tree view, now only showing rows. - */ - ZebraTreeView * treeView; - - /** - * The cue player widget controlling the audio buttons. - */ - Ptr::Ref cuePlayer; - - /** - * The right-click context menu for audio clips, - * that comes up when right-clicking an entry in the entry list. - */ - Ptr::Ref audioClipContextMenu; - - /** - * The right-click context menu for playlists, - * that comes up when right-clicking an entry in the entry list. - */ - Ptr::Ref playlistContextMenu; - - /** - * Signal handler for the mouse clicked on one of the entries. - * This is used to pop up the right-click context menu. - * - * @param event the button event recieved - * @return true if the event has been handled (a popup displayed), - * false otherwise - */ - virtual bool - onEntryClicked(GdkEventButton * event) throw (); - - /** - * Signal handler for the user double-clicking, or pressing Enter - * on one of the entries. - * - * @param path the TreePath of the row clicked on (ignored). - * @param column the TreeViewColumn clicked on (ignored). - */ - void - onDoubleClick(const Gtk::TreeModel::Path & path, - const Gtk::TreeViewColumn * column) - throw (); - - /** - * Signal handler for a key pressed at one of the entries. - * The keys can be customized by the keyboardShortcutContainer - * element in the gLiveSupport configuration file. - * - * The actions handled are: moveItemUp, moveItemDown and removeItem. - * - * @param event the button event received - * @return true if the key press was fully handled, false if not - */ - bool - onKeyPressed(GdkEventKey * event) throw (); - - /** - * Signal handler for the "edit playlist" menu item selected from - * the entry context menu. For playlists only. - */ - virtual void - onEditPlaylist(void) throw (); - - /** - * Signal handler for the "schedule playlist" menu item selected - * from the entry context menu. For playlists only. - */ - virtual void - onSchedulePlaylist(void) throw (); - - /** - * Signal handler for the "export playlist" menu item selected from - * the entry context menu. For playlists only. - */ - virtual void - onExportPlaylist(void) throw (); - - /** - * Signal handler for the "add to playlist" menu item selected from - * the entry context menu. - */ - virtual void - onAddToPlaylist(void) throw (); - - /** - * Signal handler for the "add to live mode" menu item selected from - * the entry context menu. - */ - virtual void - onAddToLiveMode(void) throw (); - - /** - * Signal handler for the "upload to hub" menu item selected from - * the entry context menu. - */ - virtual void - onUploadToHub(void) throw (); - - /** - * Event handler for the Remove menu item selected from - * the entry conext menu. - */ - virtual void - onRemoveMenuOption(void) throw (); - - /** - * The tree view we want to implement d'n'd on. - */ - virtual Gtk::TreeView * - getTreeViewForDnd (void) throw () - { - return treeView; - } - - /** - * The name of the window for the d'n'd methods. - */ - virtual Glib::ustring - getWindowNameForDnd (void) throw (); - - /** - * Return the topmost selected row. - * Sets selectedPaths and selectedIter; does not increment it. - * - * @return the first selected playable item. - */ - virtual Ptr::Ref - getFirstSelectedPlayable (void) throw (); - - /** - * Used to iterate over the selected rows. - * Reset to the first row by onEntryClicked(). - * Returns a 0 pointer if nothing is selected or we have reached - * the end of the list of selected rows. - * - * @return the next selected playable item. - */ - virtual Ptr::Ref - getNextSelectedPlayable (void) throw (); - - /** - * Add an item to the d'n'd tree view at the given position. - * - * @param iter the iterator pointing to the row to be filled in. - * @param id the ID of the item to add. - */ - virtual void - addItem (Gtk::TreeIter iter, - Ptr::Ref id) throw (); - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - ScratchpadWindow(Gtk::ToggleButton * windowOpenerButton) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~ScratchpadWindow(void) throw () - { - } - - /** - * Add an item to the Scratchpad. - * If it was already in the Scratchpad, move it to the top. - * - * @param playable the Playable object to add. - */ - void - addItem(Ptr::Ref playable) throw (); - - /** - * Add an item to the Scratchpad. - * If it was already in the Scratchpad, move it to the top. - * - * @param id the id of the item to add. - */ - void - addItem(Ptr::Ref id) throw (); - - /** - * Return the contents of the Scratchpad. - * - * @return a space-separated list of the unique IDs, in base 10. - */ - Ptr::Ref - getContents(void) throw (); - - /** - * Restore the contents of the Scratchpad. - * The current contents are discarded, and replaced with the items - * listed in the 'contents' parameter. - * - * @param contents a space-separated list of unique IDs, in base 10. - */ - void - setContents(Ptr::Ref contents) throw (); - - /** - * Return the user preferences key. - * The contents of the window will be stored in the user preferences - * under this key. - * - * @return the user preference key. - */ - Ptr::Ref - getUserPreferencesKey(void) throw () - { - return userPreferencesKey; - } - - /** - * Update the cue player display to show a stopped state. - */ - void - showCuePlayerStopped(void) throw () - { - cuePlayer->onStop(); - } - - /** - * Hide the window. - * - * This overrides GuiWindow::hide(), and closes the Export Playlist - * and Schedule Playlist pop-up windows, if they are still open. - */ - virtual void - hide(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // ScratchpadWindow_h - diff --git a/src/products/gLiveSupport/src/SearchWindow.cxx b/src/products/gLiveSupport/src/SearchWindow.cxx deleted file mode 100644 index 2080b0c2b..000000000 --- a/src/products/gLiveSupport/src/SearchWindow.cxx +++ /dev/null @@ -1,1128 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Widgets/WidgetFactory.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" - -#include "SearchWindow.h" - - -using namespace Glib; -using namespace boost::posix_time; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "searchWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "SearchWindow.glade"; - -/*------------------------------------------------------------------------------ - * The number of items which can be shown in the search results. - *----------------------------------------------------------------------------*/ -const int searchResultsSize = 25; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -SearchWindow :: SearchWindow (Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton) -{ - glade->get_widget("searchInputNoteBook1", searchInput); - - Gtk::Label * simpleSearchTabLabel; - Gtk::Label * advancedSearchTabLabel; - Gtk::Label * browseTabLabel; - Gtk::Label * transportsTabLabel; - glade->get_widget("simpleSearchTabLabel1", simpleSearchTabLabel); - glade->get_widget("advancedSearchTabLabel1", advancedSearchTabLabel); - glade->get_widget("browseTabLabel1", browseTabLabel); - glade->get_widget("transportsTabLabel1", transportsTabLabel); - simpleSearchTabLabel->set_label(*getResourceUstring("simpleSearchTab")); - advancedSearchTabLabel->set_label(*getResourceUstring("advancedSearchTab")); - browseTabLabel->set_label(*getResourceUstring("browseTab")); - transportsTabLabel->set_label(*getResourceUstring("transportsTab")); - - constructSearchWhereBox(); - - constructSimpleSearchView(); - constructAdvancedSearchView(); - constructBrowseView(); - constructTransportsView(); - - constructSearchResultsView(); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -SearchWindow :: ~SearchWindow (void) throw () -{ -} - - -/*------------------------------------------------------------------------------ - * Construct the transport type selection box. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: constructSearchWhereBox(void) throw () -{ - Gtk::Label * searchWhereLabel; - glade->get_widget("searchWhereLabel1", searchWhereLabel); - searchWhereLabel->set_label(*getResourceUstring("searchWhereLabel")); - - glade->get_widget_derived("searchWhereEntry1", searchWhereEntry); - searchWhereEntry->append_text(*getResourceUstring("searchWhereLocal")); - searchWhereEntry->append_text(*getResourceUstring("searchWhereRemote")); - searchWhereEntry->set_active(0); - searchWhereEntry->signal_changed().connect(sigc::mem_fun(*this, - &SearchWindow::onSearchWhereChanged)); -} - - -/*------------------------------------------------------------------------------ - * Construct the simple search view. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: constructSimpleSearchView(void) throw () -{ - glade->get_widget("simpleSearchEntry1", simpleSearchEntry); - simpleSearchEntry->signal_activate().connect(sigc::mem_fun(*this, - &SearchWindow::onSimpleSearch)); - - Gtk::Button * simpleSearchButton; - glade->get_widget("simpleSearchButton1", simpleSearchButton); - simpleSearchButton->set_label(*getResourceUstring("searchButtonLabel")); - simpleSearchButton->signal_clicked().connect(sigc::mem_fun(*this, - &SearchWindow::onSimpleSearch)); -} - - -/*------------------------------------------------------------------------------ - * Construct the advanced search view. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: constructAdvancedSearchView(void) throw () -{ - advancedSearchEntry.reset(new AdvancedSearchEntry(this)); - advancedSearchEntry->connectCallback(sigc::mem_fun(*this, - &SearchWindow::onAdvancedSearch )); - - Gtk::Button * advancedSearchButton; - glade->get_widget("advancedSearchButton1", advancedSearchButton); - advancedSearchButton->set_label(*getResourceUstring("searchButtonLabel")); - advancedSearchButton->signal_clicked().connect(sigc::mem_fun(*this, - &SearchWindow::onAdvancedSearch)); -} - - -/*------------------------------------------------------------------------------ - * Construct the browse view. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: constructBrowseView(void) throw () -{ - browseEntry.reset(new BrowseEntry(this)); - browseEntry->signalChanged().connect(sigc::mem_fun(*this, - &SearchWindow::onBrowse)); -} - - -/*------------------------------------------------------------------------------ - * Construct the transports view. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: constructTransportsView(void) throw () -{ - transportList.reset(new TransportList(this)); -} - - -/*------------------------------------------------------------------------------ - * Construct the search results display. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: constructSearchResultsView(void) throw () -{ - localSearchResults = Gtk::ListStore::create(modelColumns); - remoteSearchResults = Gtk::ListStore::create(modelColumns); - - glade->get_widget_derived("searchResultsTreeView1", searchResultsTreeView); - searchResultsTreeView->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); - searchResultsTreeView->set_model(localSearchResults); - searchResultsTreeView->connectModelSignals(localSearchResults); - searchResultsTreeView->connectModelSignals(remoteSearchResults); - - searchResultsTreeView->appendColumn( - *getResourceUstring("typeColumnLabel"), - modelColumns.typeColumn, 20); - searchResultsTreeView->appendColumn( - *getResourceUstring("titleColumnLabel"), - modelColumns.titleColumn, 300); - searchResultsTreeView->appendColumn( - *getResourceUstring("creatorColumnLabel"), - modelColumns.creatorColumn, 200); - searchResultsTreeView->appendColumn( - *getResourceUstring("sourceColumnLabel"), - modelColumns.sourceColumn, 145); - searchResultsTreeView->appendCenteredColumn( - *getResourceUstring("lengthColumnLabel"), - modelColumns.lengthColumn, 55); - - searchResultsTreeView->signal_button_press_event().connect( - sigc::mem_fun(*this, - &SearchWindow::onEntryClicked), - false /* call this first */); - searchResultsTreeView->signal_row_activated().connect(sigc::mem_fun(*this, - &SearchWindow::onDoubleClick)); - setupDndCallbacks(DND_SOURCE); - - audioClipContextMenu = constructAudioClipContextMenu(); - playlistContextMenu = constructPlaylistContextMenu(); - remoteContextMenu = constructRemoteContextMenu(); - - glade->get_widget("searchResultsCountLabel1", searchResultsCountLabel); - glade->get_widget("backwardButton1", backwardButton); - glade->get_widget("forwardButton1", forwardButton); - backwardButton->signal_clicked().connect(sigc::mem_fun(*this, - &SearchWindow::onBackwardButtonClicked)); - forwardButton->signal_clicked().connect(sigc::mem_fun(*this, - &SearchWindow::onForwardButtonClicked)); - - updatePagingToolbar(); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the simple Search button getting clicked. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onSimpleSearch(void) throw () -{ - Glib::ustring value = simpleSearchEntry->get_text(); - - Ptr::Ref metadataTypes - = gLiveSupport->getMetadataTypeContainer(); - MetadataTypeContainer::Vector::const_iterator - it = metadataTypes->begin(); - - Ptr::Ref criteria(new SearchCriteria("all", "or")); - Ptr::Ref metadata; - - if (it != metadataTypes->end()) { - metadata = *it; - criteria->addCondition(*metadata->getDcName(), "partial", value); - } - - if (++it != metadataTypes->end()) { - metadata = *it; - criteria->addCondition(*metadata->getDcName(), "partial", value); - } - - if (++it != metadataTypes->end()) { - metadata = *it; - criteria->addCondition(*metadata->getDcName(), "partial", value); - } - - onInitialSearch(criteria); -} - - -/*------------------------------------------------------------------------------ - * Event handler for the advanced Search button getting clicked. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onAdvancedSearch(void) throw () -{ - onInitialSearch(advancedSearchEntry->getSearchCriteria()); -} - - -/*------------------------------------------------------------------------------ - * Event handler for changed selection in the Browse view. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onBrowse(void) throw () -{ - onInitialSearch(browseEntry->getSearchCriteria()); -} - - -/*------------------------------------------------------------------------------ - * Do the searching (first set of results). - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onInitialSearch(Ptr::Ref criteria) - throw () -{ - criteria->setOffset(0); - criteria->setLimit(getSearchResultsSize()); - onSearch(criteria); -} - - -/*------------------------------------------------------------------------------ - * Do the searching (after paging backward or forward). - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onContinuedSearch(int offset) - throw () -{ - Ptr::Ref criteria = getSearchCriteria(); - criteria->setOffset(offset); - onSearch(criteria); -} - - -/*------------------------------------------------------------------------------ - * Do the searching. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onSearch(Ptr::Ref criteria) - throw () -{ - if (searchIsLocal()) { - localSearch(criteria); - } else { - remoteSearchOpen(criteria); - } -} - - -/*------------------------------------------------------------------------------ - * Search in the local storage. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: localSearch(Ptr::Ref criteria) - throw () -{ - displayMessage("pleaseWaitMsg", localSearchResults); - gLiveSupport->runMainLoop(); - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr::Ref searchResults; - try { - localSearchResultsCount = storage->search(sessionId, criteria); - searchResults = storage->getLocalSearchResults(); - } catch (XmlRpcException &e) { - displayLocalSearchError(e); - return; - } - - localSearchCriteria = criteria; - - displaySearchResults(searchResults, localSearchResults); -} - - -/*------------------------------------------------------------------------------ - * Display the search results. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: displaySearchResults( - Ptr::Ref searchResults, - Glib::RefPtr treeModel) - throw () -{ - treeModel->clear(); - searchResultsTreeView->set_model(treeModel); - updatePagingToolbar(); - - Ptr::Ref widgetFactory = WidgetFactory::getInstance(); - - SearchResultsType::const_iterator it = searchResults->begin(); - - if (it == searchResults->end()) { - displayMessage("nothingFoundMsg", treeModel); - return; - } - - for ( ; it != searchResults->end(); ++it) { - Ptr::Ref playable = *it; - Gtk::TreeModel::Row row = *treeModel->append(); - - row[modelColumns.playableColumn] = playable; - - switch (playable->getType()) { - case Playable::AudioClipType: - row[modelColumns.typeColumn] = widgetFactory->getPixbuf( - WidgetConstants::audioClipIconImage); - break; - case Playable::PlaylistType: - row[modelColumns.typeColumn] = widgetFactory->getPixbuf( - WidgetConstants::playlistIconImage); - break; - default: - break; - } - - Ptr::Ref - title = playable->getTitle(); - row[modelColumns.titleColumn] - = title ? Glib::Markup::escape_text(*title) - : ""; - - Ptr::Ref - creator = playable->getMetadata("dc:creator"); - row[modelColumns.creatorColumn] - = creator ? Glib::Markup::escape_text(*creator) - : ""; - - Ptr::Ref - source = playable->getMetadata("dc:source"); - row[modelColumns.sourceColumn] - = source ? Glib::Markup::escape_text(*source) - : ""; - - Ptr::Ref length = playable->getPlaylength(); - row[modelColumns.lengthColumn] = length ? - *TimeConversion::timeDurationToHhMmSsString(length) : ""; - } -} - - -/*------------------------------------------------------------------------------ - * Search on the network hub (initiate the async operation). - *----------------------------------------------------------------------------*/ -void -SearchWindow :: remoteSearchOpen(Ptr::Ref criteria) - throw () -{ - displayMessage("pleaseWaitMsg", remoteSearchResults); - remoteSearchCriteria.reset(); - updatePagingToolbar(); - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - if (remoteSearchToken) { - try { - storage->cancelTransport(sessionId, remoteSearchToken); - } catch (XmlRpcException &e) { - displayRemoteSearchError(e); - return; - } - } - - try { - remoteSearchToken = storage->remoteSearchOpen(sessionId, criteria); - } catch (XmlRpcException &e) { - displayRemoteSearchError(e); - } - - remoteSearchCriteria = criteria; -} - - -/*------------------------------------------------------------------------------ - * Search on the network hub (finish the async operation). - *----------------------------------------------------------------------------*/ -void -SearchWindow :: remoteSearchClose(void) - throw () -{ - if (remoteSearchToken) { - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - AsyncState state; - Ptr::Ref errorMessage(new Glib::ustring()); - try { - state = storage->checkTransport(remoteSearchToken, errorMessage); - } catch (XmlRpcException &e) { - displayRemoteSearchError(e); - return; - } - - Ptr::Ref results; - - if (state == AsyncState::finishedState) { - try { - remoteSearchResultsCount = - storage->remoteSearchClose(remoteSearchToken); - } catch (XmlRpcException &e) { - displayRemoteSearchError(e); - return; - } - remoteSearchToken.reset(); - - try { - results = storage->getRemoteSearchResults(); - } catch (XmlRpcException &e) { - displayRemoteSearchError(e); - return; - } - - displaySearchResults(results, remoteSearchResults); - - } else if (state == AsyncState::closedState) { - remoteSearchToken.reset(); - displayMessage("shortErrorMsg", remoteSearchResults); - - } else if (state == AsyncState::failedState) { - remoteSearchToken.reset(); - gLiveSupport->displayMessageWindow(*formatMessage("longErrorMsg", - *errorMessage )); - displayMessage("shortErrorMsg", remoteSearchResults); - } - } -} - - -/*------------------------------------------------------------------------------ - * Display a (usually error) message in the search results tree view. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: displayMessage(const Glib::ustring & messageKey, - Glib::RefPtr treeModel) - throw () -{ - treeModel->clear(); - - Gtk::TreeModel::Row row = *treeModel->append(); - row[modelColumns.titleColumn] = *getResourceUstring(messageKey); - - searchResultsTreeView->set_model(treeModel); -} - - -/*------------------------------------------------------------------------------ - * Display an error message which occurred during a search. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: displayError(const XmlRpcException & error, - Glib::RefPtr treeModel) - throw () -{ - gLiveSupport->displayMessageWindow(*formatMessage("longErrorMsg", - error.what() )); - displayMessage("shortErrorMsg", treeModel); -} - - -/*------------------------------------------------------------------------------ - * Display an error message which occurred during a local search. - *----------------------------------------------------------------------------*/ -inline void -SearchWindow :: displayLocalSearchError(const XmlRpcException & error) - throw () -{ - displayError(error, localSearchResults); -} - - -/*------------------------------------------------------------------------------ - * Display an error message which occurred during a remote search. - *----------------------------------------------------------------------------*/ -inline void -SearchWindow :: displayRemoteSearchError(const XmlRpcException & error) - throw () -{ - displayError(error, remoteSearchResults); -} - - -/*------------------------------------------------------------------------------ - * Event handler for an entry being clicked in the list - *----------------------------------------------------------------------------*/ -bool -SearchWindow :: onEntryClicked (GdkEventButton * event) throw () -{ - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - Ptr::Ref playable = getFirstSelectedPlayable(); - - if (selectedPaths->size() == 1) { - if (playable->getType() == Playable::AudioClipType) { - audioClipContextMenu->popup(event->button, event->time); - return true; - - } else if (playable->getType() == Playable::PlaylistType) { - playlistContextMenu->popup(event->button, event->time); - return true; - } - - } else if (selectedPaths->size() > 1) { - audioClipContextMenu->popup(event->button, event->time); - return true; - } - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Return the first selected playable item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SearchWindow :: getFirstSelectedPlayable(void) throw () -{ - Ptr::Ref playable; - - Glib::RefPtr - selection = searchResultsTreeView->get_selection(); - selectedPaths.reset(new std::vector( - selection->get_selected_rows())); - - if (selectedPaths->size() > 0) { - selectedIter = selectedPaths->begin(); - Glib::RefPtr - treeModel = searchResultsTreeView->get_model(); - Gtk::TreeRow row = *(treeModel->get_iter(*selectedIter)); - playable = row[modelColumns.playableColumn]; - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Return the next selected playable item. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SearchWindow :: getNextSelectedPlayable(void) throw () -{ - Ptr::Ref playable; - - if (selectedPaths) { - if (selectedIter != selectedPaths->end()) { - Glib::RefPtr - treeModel = searchResultsTreeView->get_model(); - Gtk::TreeRow row = *(treeModel->get_iter(*selectedIter)); - playable = row[modelColumns.playableColumn]; - ++selectedIter; - } else { - selectedPaths.reset(); - } - } - - return playable; -} - - -/*------------------------------------------------------------------------------ - * Add a playable to the scratchpad. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onAddToScratchpad(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - try { - gLiveSupport->addToScratchpad(playable); - } catch (XmlRpcException &e) { - Ptr::Ref errorMessage(new Glib::ustring( - "error in SearchWindow::onAddToScratchpad(): ")); - errorMessage->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMessage); - } - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the Add To Playlist menu item selected from the - * entry context menu - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onAddToPlaylist(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - try { - gLiveSupport->addToPlaylist(playable->getId()); - } catch (XmlRpcException &e) { - Ptr::Ref errorMessage(new Glib::ustring( - "error in SearchWindow::onAddToPlaylist(): ")); - errorMessage->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMessage); - } - } -} - - -/*------------------------------------------------------------------------------ - * Add a playable to the live mode. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onAddToLiveMode(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - try { - gLiveSupport->addToScratchpad(playable); - playable = gLiveSupport->getPlayable(playable->getId()); - gLiveSupport->addToLiveMode(playable); - } catch (XmlRpcException &e) { - Ptr::Ref errorMessage(new Glib::ustring( - "error in SearchWindow::onAddToLiveMode(): ")); - errorMessage->append(e.what()); - gLiveSupport->displayMessageWindow(*errorMessage); - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Edit Playlist menu item selected from the - * entry context menu. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onEditPlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - try { - gLiveSupport->openPlaylistForEditing(playlist->getId()); - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(*getResourceUstring( - "cannotEditPlaylistMsg" )); - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for the Schedule Playlist menu item selected from the - * entry context menu. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onSchedulePlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - schedulePlaylistWindow.reset(new SchedulePlaylistWindow(playlist)); - schedulePlaylistWindow->getWindow()->set_transient_for(*mainWindow); - Gtk::Main::run(*schedulePlaylistWindow->getWindow()); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "export playlist" in the context menu. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onExportPlaylist(void) throw () -{ - Ptr::Ref playable = getNextSelectedPlayable(); - Ptr::Ref playlist = playable->getPlaylist(); - - if (playlist) { - exportPlaylistWindow.reset(new ExportPlaylistWindow(playlist)); - exportPlaylistWindow->getWindow()->set_transient_for(*mainWindow); - Gtk::Main::run(*exportPlaylistWindow->getWindow()); - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "upload to hub" in the context menu. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onUploadToHub(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - uploadToHub(playable); - } -} - - -/*------------------------------------------------------------------------------ - * Add the Playable object to the list of pending "upload to hub" - * tasks displayed in the Transports tab. - *----------------------------------------------------------------------------*/ -bool -SearchWindow :: uploadToHub(Ptr::Ref playable) throw () -{ - try { - searchInput->set_current_page(3); - transportList->addUpload(playable); - - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(*formatMessage("uploadToHubErrorMsg", - e.what() )); - return false; - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * Signal handler for "download from hub" in the context menu. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onDownloadFromHub(void) throw () -{ - Ptr::Ref playable; - - while ((playable = getNextSelectedPlayable())) { - if (!gLiveSupport->existsPlayable(playable->getId())) { - try { - searchInput->set_current_page(3); - transportList->addDownload(playable); - - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(*formatMessage( - "downloadFromHubErrorMsg", e.what() )); - return; - } - } else { - onAddToScratchpad(); - } - } -} - - -/*------------------------------------------------------------------------------ - * Signal handler for the user double-clicking or pressing Enter. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onDoubleClick(const Gtk::TreeModel::Path & path, - const Gtk::TreeViewColumn * column) - throw () -{ - Ptr::Ref playable = getFirstSelectedPlayable(); - - if (playable) { - if (searchIsLocal()) { - onAddToScratchpad(); - } else { - onDownloadFromHub(); - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler called when the the window gets hidden. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: hide(void) throw () -{ - if (exportPlaylistWindow) { - exportPlaylistWindow->getWindow()->hide(); - } - if (schedulePlaylistWindow) { - schedulePlaylistWindow->getWindow()->hide(); - } - - GuiWindow::hide(); -} - - -/*------------------------------------------------------------------------------ - * Check the status of the "search where" input box. - *----------------------------------------------------------------------------*/ -bool -SearchWindow :: searchIsLocal(void) throw () -{ - int searchWhere = searchWhereEntry->get_active_row_number(); - - switch (searchWhere) { - case 0: return true; - break; - - case 1: return false; - break; - - default: - std::cerr << "impossible value in SearchWindow::searchIsLocal()" - << std::endl; - std::exit(1); - break; - } -} - - -/*------------------------------------------------------------------------------ - * Change the displayed search results (local or remote). - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onSearchWhereChanged(void) throw () -{ - if (searchIsLocal()) { - searchInput->get_nth_page(2)->set_sensitive(true); - searchResultsTreeView->set_model(localSearchResults); - } else { - if (searchInput->get_current_page() == 2) { - searchInput->set_current_page(0); - } - searchInput->get_nth_page(2)->set_sensitive(false); - searchResultsTreeView->set_model(remoteSearchResults); - } - - updatePagingToolbar(); -} - - -/*------------------------------------------------------------------------------ - * Perform the periodic checks on the asynchronous methods. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onTimer(void) throw () -{ - remoteSearchClose(); - transportList->updateSilently(); -} - - -/*------------------------------------------------------------------------------ - * Construct the right-click context menu for local audio clips. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SearchWindow :: constructAudioClipContextMenu(void) throw () -{ - Ptr::Ref contextMenu(new Gtk::Menu()); - Gtk::Menu::MenuList & contextMenuList = contextMenu->items(); - - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToLiveModeMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onAddToLiveMode))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToPlaylistMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onAddToPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToScratchpadMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onAddToScratchpad))); - contextMenuList.push_back(Gtk::Menu_Helpers::SeparatorElem()); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("uploadToHubMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onUploadToHub))); - - contextMenu->accelerate(*mainWindow); - return contextMenu; -} - - -/*------------------------------------------------------------------------------ - * Construct the right-click context menu for local playlists. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SearchWindow :: constructPlaylistContextMenu(void) throw () -{ - Ptr::Ref contextMenu(new Gtk::Menu()); - Gtk::Menu::MenuList & contextMenuList = contextMenu->items(); - - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToLiveModeMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onAddToLiveMode))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToPlaylistMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onAddToPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("addToScratchpadMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onAddToScratchpad))); - contextMenuList.push_back(Gtk::Menu_Helpers::SeparatorElem()); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("editPlaylistMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onEditPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("schedulePlaylistMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onSchedulePlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("exportPlaylistMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onExportPlaylist))); - contextMenuList.push_back(Gtk::Menu_Helpers::SeparatorElem()); - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("uploadToHubMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onUploadToHub))); - - contextMenu->accelerate(*mainWindow); - return contextMenu; -} - - -/*------------------------------------------------------------------------------ - * Construct the right-click context menu for remote audio clips & playlists. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SearchWindow :: constructRemoteContextMenu(void) throw () -{ - Ptr::Ref contextMenu(new Gtk::Menu()); - Gtk::Menu::MenuList & contextMenuList = contextMenu->items(); - - contextMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("downloadFromHubMenuItem"), - sigc::mem_fun(*this, - &SearchWindow::onDownloadFromHub))); - - contextMenu->accelerate(*mainWindow); - return contextMenu; -} - - -/*------------------------------------------------------------------------------ - * Return the number of search results which can be displayed. - *----------------------------------------------------------------------------*/ -int -SearchWindow :: getSearchResultsSize(void) throw () -{ - return searchResultsSize; -} - - -/*------------------------------------------------------------------------------ - * Event handler for a click on the Backward button. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onBackwardButtonClicked(void) throw () -{ - Ptr::Ref criteria = getSearchCriteria(); - int offset = criteria->getOffset(); - - if (offset > 0) { - int newOffset = offset - getSearchResultsSize(); - if (newOffset < 0) { - newOffset = 0; - } - onContinuedSearch(newOffset); - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for a click on the Forward button. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: onForwardButtonClicked(void) throw () -{ - Ptr::Ref criteria = getSearchCriteria(); - int offset = criteria->getOffset(); - int count = getSearchResultsCount(); - - int newOffset = offset + getSearchResultsSize(); - if (newOffset < count) { - onContinuedSearch(newOffset); - } -} - - -/*------------------------------------------------------------------------------ - * Enable or disable the Backward and Forward buttons. - *----------------------------------------------------------------------------*/ -void -SearchWindow :: updatePagingToolbar(void) throw () -{ - Ptr::Ref criteria = getSearchCriteria(); - - if (criteria) { - int offset = criteria->getOffset(); - int count = getSearchResultsCount(); - int lastNumber = std::min(offset + getSearchResultsSize(), count); - - try { - if (count > 0) { - searchResultsCountLabel->set_text(*formatMessage( - "searchResultsCountLabel", - itoa(offset + 1), - itoa(lastNumber), - itoa(count) )); - } else { - searchResultsCountLabel->set_text(""); - } - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - std::exit(1); - } - backwardButton->set_sensitive(offset != 0); - forwardButton->set_sensitive(offset + getSearchResultsSize() < count); - } else { - searchResultsCountLabel->set_text(""); - backwardButton->set_sensitive(false); - forwardButton->set_sensitive(false); - } -} - - -/*------------------------------------------------------------------------------ - * The name of the window for the d'n'd methods. - *----------------------------------------------------------------------------*/ -Glib::ustring -SearchWindow :: getWindowNameForDnd (void) throw () -{ - return bundleName; -} - - diff --git a/src/products/gLiveSupport/src/SearchWindow.h b/src/products/gLiveSupport/src/SearchWindow.h deleted file mode 100644 index c88785876..000000000 --- a/src/products/gLiveSupport/src/SearchWindow.h +++ /dev/null @@ -1,697 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SearchWindow_h -#define SearchWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "GuiWindow.h" -#include "DndMethods.h" -#include "LiveSupport/Core/NumericTools.h" - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/LocalizedObject.h" -#include "LiveSupport/Widgets/PlayableTreeModelColumnRecord.h" -#include "AdvancedSearchEntry.h" -#include "BrowseEntry.h" -#include "GLiveSupport.h" -#include "SchedulePlaylistWindow.h" -#include "ExportPlaylistWindow.h" -#include "TransportList.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The Search/Browse window. - * - */ -class SearchWindow : public GuiWindow, - public DndMethods, - private NumericTools -{ - private: - - /** - * The criteria for the last local search. - */ - Ptr::Ref localSearchCriteria; - - /** - * The criteria for the last remote search. - */ - Ptr::Ref remoteSearchCriteria; - - /** - * The number of items found by the last local search. - */ - int localSearchResultsCount; - - /** - * The number of items found by the last remote search. - */ - int remoteSearchResultsCount; - - /** - * The list of selected rows, as path references (row numbers). - * Reset by onEntryClicked(). - */ - Ptr >::Ref selectedPaths; - /** - * One of the selected rows, set to the first one by onEntryClicked(). - * Incremented by getNextSelectedPlayable(). - */ - std::vector::const_iterator selectedIter; - - /** - * The "search where" input field. - */ - ComboBoxText * searchWhereEntry; - - /** - * The simple search input field. - */ - Gtk::Entry * simpleSearchEntry; - - /** - * The box containing the advanced search input fields. - */ - Ptr::Ref advancedSearchEntry; - - /** - * The box containing the browse input fields. - */ - Ptr::Ref browseEntry; - - /** - * The list of transports in progress. - */ - Ptr::Ref transportList; - - /** - * The button for paging in the search results backward. - */ - Gtk::Button * backwardButton; - - /** - * The button for paging in the search results forward. - */ - Gtk::Button * forwardButton; - - /** - * The Schedule Playlist pop-up window. - */ - Ptr::Ref schedulePlaylistWindow; - - /** - * The Export Playlist pop-up window. - */ - Ptr::Ref exportPlaylistWindow; - - /** - * The tree model, as a GTK reference, for the local search results. - */ - Glib::RefPtr localSearchResults; - - /** - * The tree model, as a GTK reference, for the remote search results. - */ - Glib::RefPtr remoteSearchResults; - - /** - * The tree view showing the search results. - */ - ZebraTreeView * searchResultsTreeView; - - /** - * The label showing the number of search results. - */ - Gtk::Label * searchResultsCountLabel; - - /** - * The notebook for the various tabs in the window. - */ - Gtk::Notebook * searchInput; - - /** - * The transport token used when a remote search is pending. - */ - Ptr::Ref remoteSearchToken; - - /** - * The pop-up context menu for local audio clips. - */ - Ptr::Ref audioClipContextMenu; - - /** - * The pop-up context menu for local playlists. - */ - Ptr::Ref playlistContextMenu; - - /** - * The pop-up context menu for remote audio clips and playlists. - */ - Ptr::Ref remoteContextMenu; - - /** - * Construct the "search where" box. - * This contains a combo box, where the user can choose between - * local search or hub search. - */ - void - constructSearchWhereBox(void) throw (); - - /** - * Construct the simple search view. - * If you enter a string in theGtk::VBox simple search view and - * press Enter - * (or the Search button), the local storage will be searched for - * items (both audio clips and playlists) where either the title - * (dc:title), the creator (dc:creator) or the album (dc:source) - * metadata fields contain this string. - */ - void - constructSimpleSearchView(void) throw (); - - /** - * Construct the advanced search view. - */ - void - constructAdvancedSearchView(void) throw (); - - /** - * Construct the browse view. - */ - void - constructBrowseView(void) throw (); - - /** - * Construct the advanced search view. - */ - void - constructTransportsView(void) throw (); - - /** - * Construct the search results display. - */ - void - constructSearchResultsView(void) throw (); - - /** - * Construct the right-click context menu for local audio clips. - * - * @return the context menu created. - */ - Ptr::Ref - constructAudioClipContextMenu(void) throw (); - - /** - * Construct the right-click context menu for local playlists. - * - * @return the context menu created. - */ - Ptr::Ref - constructPlaylistContextMenu(void) throw (); - - /** - * Construct the right-click context menu for remote audio clips - * and playlists. - * - * @return the context menu created. - */ - Ptr::Ref - constructRemoteContextMenu(void) throw (); - - /** - * Check the status of the "search where" input box. - */ - bool - searchIsLocal(void) throw (); - - /** - * Get the search criteria used for the last search - * of the currently selected kind. - * Returns either localSearchCriteria or remoteSearchCriteria - * depending on the value of searchIsLocal(). - * - * @return the saved search criteria of the appropriate kind; - * or a 0 pointer if nothing has been saved yet. - */ - Ptr::Ref - getSearchCriteria(void) throw () - { - return searchIsLocal() ? localSearchCriteria - : remoteSearchCriteria; - } - - /** - * Get the number of search results found by the last search - * of the currently selected kind. - * Returns either localSearchResultsCount or remoteSearchResultsCount - * depending on the value of searchIsLocal(). - * - * @return the saved search result count of the appropriate kind; - * undefined if nothing has been saved yet. - */ - int - getSearchResultsCount(void) throw () - { - return searchIsLocal() ? localSearchResultsCount - : remoteSearchResultsCount; - } - - /** - * Change the displayed search results (local or remote). - */ - void - onSearchWhereChanged(void) throw (); - - /** - * Search in the local storage. - * - * @param criteria the search criteria. - */ - void - localSearch(Ptr::Ref criteria) throw (); - - /** - * Search on the network hub (initiate the async operation). - * - * @param criteria the search criteria. - */ - void - remoteSearchOpen(Ptr::Ref criteria) throw (); - - /** - * Search on the network hub (finish the async operation). - */ - void - remoteSearchClose(void) throw (); - - /** - * Typedef to save some typing. - */ - typedef StorageClientInterface::SearchResultsType - SearchResultsType; - - /** - * Display the search results. - * The most important metadata are shown in the rows of the given - * tree model. - */ - void - displaySearchResults( - Ptr::Ref searchResults, - Glib::RefPtr treeModel) - throw (); - - /** - * Update the paging portion of the search results view. - * Prints the number of results, and enables or disables - * the Backward and Forward buttons. - */ - void - updatePagingToolbar(void) throw (); - - /** - * Display a (usually error) message in the search results tree view. - * - * @param messageKey the localization key for the message. - * @param treeModel the tree model to display the message in. - */ - void - displayMessage(const Glib::ustring & messageKey, - Glib::RefPtr treeModel) - throw (); - - /** - * Display an error message which occurred during a search. - * - * @param error the error which occurred. - * @param treeModel the tree model to display the message in. - */ - void - displayError(const XmlRpcException & error, - Glib::RefPtr treeModel) - throw (); - - /** - * Display an error message which occurred during a local search. - * - * @param error the error which occurred. - */ - void - displayLocalSearchError(const XmlRpcException & error) - throw (); - - /** - * Display an error message which occurred during a remote search. - * - * @param error the error which occurred. - */ - void - displayRemoteSearchError(const XmlRpcException & error) - throw (); - - - protected: - - /** - * The columns model needed by Gtk::TreeView. - * Lists one clip per row. - * - */ - class ModelColumns : public PlayableTreeModelColumnRecord - { - public: - /** - * The column for the type of the entry in the list - */ - Gtk::TreeModelColumn > - typeColumn; - - /** - * The column for the title of the audio clip or playlist. - */ - Gtk::TreeModelColumn titleColumn; - - /** - * The column for the creator of the audio clip or playlist. - */ - Gtk::TreeModelColumn creatorColumn; - - /** - * The column for the album of the audio clip or playlist. - */ - Gtk::TreeModelColumn sourceColumn; - - /** - * The column for the length of the audio clip or playlist. - */ - Gtk::TreeModelColumn lengthColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(typeColumn); - add(titleColumn); - add(creatorColumn); - add(sourceColumn); - add(lengthColumn); - } - }; - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * Return the number of search results which can be displayed. - * As currently implemented, this returns a constant 10. - * - * @return the number of rows which can be displayed in the - * search results section of the window. - */ - int - getSearchResultsSize(void) throw (); - - /** - * Event handler for the simple Search button getting clicked. - */ - void - onSimpleSearch(void) throw (); - - /** - * Event handler for the advanced Search button getting clicked. - */ - void - onAdvancedSearch(void) throw (); - - /** - * Event handler for changed selection in the Browse view. - */ - void - onBrowse(void) throw (); - - /** - * Do the searching (first set of results). - * Sets the offset to 0, and calls onSearch(). - * - * @param criteria the search criteria. - */ - void - onInitialSearch(Ptr::Ref criteria) throw (); - - /** - * Do the searching (after paging backward or forward). - * Sets the offset to the given value, and calls onSearch(). - * - * @param offset the new offset to use for this search. - */ - void - onContinuedSearch(int offset) throw (); - - /** - * Do the searching. - * Calls either localSearch() or remoteSearch(). - * - * @param criteria the search criteria. - */ - void - onSearch(Ptr::Ref criteria) throw (); - - /** - * Signal handler for the mouse clicked on one of the entries. - * - * @param event the button event received - * @return true if the event has been handled (a popup displayed), - * false otherwise - */ - bool - onEntryClicked(GdkEventButton * event) throw (); - - /** - * Signal handler for the user double-clicking, or pressing Enter - * on one of the entries. - * - * @param path the TreePath of the row clicked on (ignored). - * @param column the TreeViewColumn clicked on (ignored). - */ - void - onDoubleClick(const Gtk::TreeModel::Path & path, - const Gtk::TreeViewColumn * column) - throw (); - - /** - * Add a playable to the scratchpad. - */ - void - onAddToScratchpad(void) throw (); - - /** - * Signal handler for the "add to playlist" menu item selected from - * the entry context menu. - */ - void - onAddToPlaylist(void) throw (); - - /** - * Add a playable to the live mode. - */ - void - onAddToLiveMode(void) throw (); - - /** - * Signal handler for the "edit playlist" menu item selected from - * the entry context menu. - */ - void - onEditPlaylist(void) throw (); - - /** - * Signal handler for the "schedule playlist" menu item selected - * from the entry context menu. - */ - void - onSchedulePlaylist(void) throw (); - - /** - * Signal handler for the "export playlist" menu item selected from - * the entry context menu. - */ - void - onExportPlaylist(void) throw (); - - /** - * Signal handler for "upload to hub" in the context menu. - */ - void - onUploadToHub(void) throw (); - - /** - * Signal handler for "download from hub" in the context menu. - */ - void - onDownloadFromHub(void) throw (); - - /** - * Event handler for a click on the Backward button. - */ - void - onBackwardButtonClicked(void) throw (); - - /** - * Event handler for a click on the Forward button. - */ - void - onForwardButtonClicked(void) throw (); - - /** - * The tree view we want to implement d'n'd on. - */ - virtual Gtk::TreeView * - getTreeViewForDnd (void) throw () - { - return searchResultsTreeView; - } - - /** - * The name of the window for the d'n'd methods. - */ - virtual Glib::ustring - getWindowNameForDnd (void) throw (); - - /** - * Return the topmost selected row. - * Sets selectedPaths and selectedIter; does not increment it. - * - * @return the first selected playable item. - */ - virtual Ptr::Ref - getFirstSelectedPlayable(void) throw (); - - /** - * Used to iterate over the selected rows. - * Reset to the first row by onEntryClicked(). - * Returns a 0 pointer if nothing is selected or we have reached - * the end of the list of selected rows. - * - * @return the next selected playable item. - */ - virtual Ptr::Ref - getNextSelectedPlayable(void) throw (); - - /** - * Add an item to the tree view at the given position. - * Required to implement by DndMethods, does not do anything here. - * - * @param iter the iterator pointing to the row to be filled in. - * @param id the ID of the item to add. - */ - virtual void - addItem(Gtk::TreeIter iter, - Ptr::Ref id) throw () - { - } - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - SearchWindow(Gtk::ToggleButton * windowOpenerButton) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~SearchWindow(void) throw (); - - /** - * Perform the periodic checks on the asynchronous methods. - * This is called every few seconds by the onUpdateTime() function - * in the MasterPanelWindow. - */ - void - onTimer(void) throw (); - - /** - * Add the Playable object to the list of pending "upload to hub" - * tasks displayed in the Transports tab. - * - * @param playable the object to be uploaded to the hub. - * @return true on success. - */ - bool - uploadToHub(Ptr::Ref playable) throw (); - - /** - * Hide the window. - * - * This overrides GuiWindow::hide(), and closes the Export Playlist - * and Schedule Playlist windows, if they are still open. - */ - virtual void - hide(void) throw (); -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // SearchWindow_h - diff --git a/src/products/gLiveSupport/src/TaskbarIcons.cxx b/src/products/gLiveSupport/src/TaskbarIcons.cxx deleted file mode 100644 index 675545dc8..000000000 --- a/src/products/gLiveSupport/src/TaskbarIcons.cxx +++ /dev/null @@ -1,106 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "TaskbarIcons.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * The name of the config element for this class - */ -const std::string TaskbarIcons::configElementName = "taskbarIcons"; - -namespace { - -/** - * The name of the icon sub-element. - */ -const std::string iconElementName = "icon"; - -/** - * The name of the path attribute. - */ -const std::string pathAttributeName = "path"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Create a taskbar icons object based on an XML element. - *----------------------------------------------------------------------------*/ -void -TaskbarIcons :: configure(const xmlpp::Element & element) - throw (std::invalid_argument) -{ - if (element.get_name() != configElementName) { - throw std::invalid_argument("bad coniguration element " - + element.get_name()); - } - - xmlpp::Node::NodeList childNodes = element.get_children(iconElementName); - xmlpp::Node::NodeList::const_iterator it; - - for (it = childNodes.begin(); it != childNodes.end(); ++it) { - const xmlpp::Element * iconElement - = dynamic_cast (*it); - xmlpp::Attribute * pathAttr = iconElement->get_attribute( - pathAttributeName ); - if (pathAttr) { - Glib::ustring path = pathAttr->get_value(); - try { - Glib::RefPtr - image = Gdk::Pixbuf::create_from_file(path); - taskbarIconList.push_back(image); - - } catch (Glib::FileError &e) { - Glib::ustring errorMsg = "could not open icon image file: "; - errorMsg += e.what(); - throw std::invalid_argument(errorMsg); - } catch (Gdk::PixbufError &e) { - Glib::ustring errorMsg = "could not create icon image: "; - errorMsg += e.what(); - throw std::invalid_argument(errorMsg); - } - } else { - throw std::invalid_argument("missing path attribute in " - "taskbarIcons/icon"); - } - } -} diff --git a/src/products/gLiveSupport/src/TaskbarIcons.h b/src/products/gLiveSupport/src/TaskbarIcons.h deleted file mode 100644 index be40f03d7..000000000 --- a/src/products/gLiveSupport/src/TaskbarIcons.h +++ /dev/null @@ -1,163 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef TaskbarIcons_h -#define TaskbarIcons_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Container holding taskbar icon images. - * - * This object has to be configured with an XML configuration element - * called taskbarIcons. This may look like the following: - * - *

- *  <taskbarIcons>
- *      <icon path="..." />
- *      <icon path="..." />
- *      ...
- *      <icon path="..." />
- *  </taskbarIcons>
- *  
- * - * The DTD for the expected XML element is the following: - * - *

- *  
- *  
- *  
- *  
- * - * @see TaskbarIcon - */ -class TaskbarIcons : public Configurable -{ - private: - /** - * The name of the configuration XML element used by TaskbarIcons. - */ - static const std::string configElementName; - - /** - * A vector type holding the taskbar icon images. - */ - typedef std::vector > - PixbufListType; - - /** - * The list of all taskbar icon images. - */ - PixbufListType taskbarIconList; - - - public: - /** - * Constructor. - */ - TaskbarIcons() throw () - { - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~TaskbarIcons(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementName; - } - - /** - * Configure the metadata object based on an XML configuration element. - * - * @param elemen the XML configuration element. - * @exception std::invalid_argument of the supplied XML element - * contains bad configuration information - */ - virtual void - configure(const xmlpp::Element &element) - throw (std::invalid_argument); - - /** - * Return a Glib::ListHandle to the list of taskbar icon images. - */ - const Glib::ListHandle > - getIconList(void) const throw () - { - return taskbarIconList; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // TaskbarIcons_h - diff --git a/src/products/gLiveSupport/src/TestRunner.cxx b/src/products/gLiveSupport/src/TestRunner.cxx deleted file mode 100644 index 6b3abb0b9..000000000 --- a/src/products/gLiveSupport/src/TestRunner.cxx +++ /dev/null @@ -1,279 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -using namespace LiveSupport::Core; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/** - * Our copyright notice, should be at most 80 columns - */ -const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -const char options[] = "ho:s:v"; - -/** - * Structure describing the long options - */ -const struct option longOptions[] = - { - { "help", no_argument, 0, 'h' }, - { "output", required_argument, 0, 'o' }, - { "stylesheet", required_argument, 0, 's' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } - }; - -/** - * The encoding to use for the output file. - */ -const std::string encoding = "utf-8"; - -/** - * The output XML file name. - */ -Ptr::Ref xmlOutFileName; - -/** - * The XSLT attached to the output file. - */ -Ptr::Ref xsltFileName; - -} - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -void -printUsage ( const char invocation[], - std::ostream & os ); - -/** - * Process command line arguments. - * - * @param argc the number of arguments. - * @param argv the arguments themselves. - * @return true of all went well, false in case the program should exit - * after this call. - */ -bool -processArguments(int argc, char *argv[]); - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Run all tests - *----------------------------------------------------------------------------*/ -int -main( int argc, - char * argv[] ) throw () -{ - if (!processArguments(argc, argv)) { - return 0; - } - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as test run. - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - // Add the top suite to the test runner - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - runner.run( controller ); - - // Print test in a compiler compatible format. - CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr ); - outputter.setLocationFormat("%p:%l:"); - outputter.write(); - - // also generate an XML document as an output - std::ofstream xmlOutFile(xmlOutFileName->c_str()); - CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); - xmlOutputter.setStandalone(false); - if (xsltFileName) { - xmlOutputter.setStyleSheet(*xsltFileName); - } - xmlOutputter.write(); - xmlOutFile.flush(); - xmlOutFile.close(); - - return result.wasSuccessful() ? 0 : 1; -} - - -/*------------------------------------------------------------------------------ - * Process command line arguments. - *----------------------------------------------------------------------------*/ -bool -processArguments(int argc, char *argv[]) -{ - int i; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'h': - printUsage(argv[0], std::cout); - return false; - - case 'o': - xmlOutFileName.reset(new std::string(optarg)); - break; - - case 's': - xsltFileName.reset(new std::string(optarg)); - break; - - case 'v': - printVersion(std::cout); - return false; - - default: - printUsage(argv[0], std::cout); - return false; - } - } - - if (optind < argc) { - std::cerr << "error processing command line arguments" << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - if (!xmlOutFileName) { - std::cerr << "mandatory option output file name not specified" - << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; - if (xsltFileName) { - std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION]" - << std::endl - << " mandatory options:" << std::endl - << " -o, --output=file.name write test results into this XML file" - << std::endl - << " optional options:" << std::endl - << " -s, --stylesheet specify this XSLT for the output file" - << std::endl - << " this is either an absolute URI, or a" - << std::endl - << " relative path for the output document" - << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/products/gLiveSupport/src/TransportList.cxx b/src/products/gLiveSupport/src/TransportList.cxx deleted file mode 100644 index b3d73ce1d..000000000 --- a/src/products/gLiveSupport/src/TransportList.cxx +++ /dev/null @@ -1,494 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/TimeConversion.h" -#include "TransportList.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "transportList"; - -/*------------------------------------------------------------------------------ - * The localization key for the 'working' status. - *----------------------------------------------------------------------------*/ -const Glib::ustring workingStatusKey = "workingStatus"; - -/*------------------------------------------------------------------------------ - * The localization key for the 'success' status. - *----------------------------------------------------------------------------*/ -const Glib::ustring successStatusKey = "successStatus"; - -/*------------------------------------------------------------------------------ - * The localization key for the 'fault' status. - *----------------------------------------------------------------------------*/ -const Glib::ustring faultStatusKey = "faultStatus"; - -/*------------------------------------------------------------------------------ - * The name of the user preference for storing the list of transports. - *----------------------------------------------------------------------------*/ -const Glib::ustring userPreferencesKeyName = "activeTransports"; - -/*------------------------------------------------------------------------------ - * The symbol for an upload. - *----------------------------------------------------------------------------*/ -const Glib::ustring uploadSymbol = "⇧"; - -/*------------------------------------------------------------------------------ - * The symbol for a download. - *----------------------------------------------------------------------------*/ -const Glib::ustring downloadSymbol = "⇩"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -TransportList :: TransportList(GuiObject * parent) - throw () - : GuiComponent(parent, - bundleName) -{ - // create the tree view - treeModel = Gtk::ListStore::create(modelColumns); - glade->get_widget_derived("transportsTreeView1", treeView); - treeView->set_model(treeModel); - treeView->connectModelSignals(treeModel); - - // Add the TreeView's view columns: - treeView->appendColumn("", - modelColumns.directionColumn, 20); - treeView->appendColumn(*getResourceUstring("titleColumnLabel"), - modelColumns.titleColumn, 300); - treeView->appendColumn(*getResourceUstring("dateColumnLabel"), - modelColumns.dateColumn, 180); - treeView->appendColumn(*getResourceUstring("statusColumnLabel"), - modelColumns.statusDisplayColumn, 50); - - // register the signal handler for treeview entries being clicked - treeView->signal_button_press_event().connect_notify(sigc::mem_fun(*this, - &TransportList::onEntryClicked)); - - // create the right-click entry context menu - uploadMenu.reset(new Gtk::Menu()); - downloadMenu.reset(new Gtk::Menu()); - Gtk::Menu::MenuList& uploadMenuList = uploadMenu->items(); - Gtk::Menu::MenuList& downloadMenuList = downloadMenu->items(); - - uploadMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("cancelUploadMenuItem"), - sigc::mem_fun(*this, - &TransportList::onCancelTransport))); - downloadMenuList.push_back(Gtk::Menu_Helpers::MenuElem( - *getResourceUstring("cancelDownloadMenuItem"), - sigc::mem_fun(*this, - &TransportList::onCancelTransport))); - - Gtk::Window * mainWindow; - glade->get_widget("mainWindow1", mainWindow); - uploadMenu->accelerate(*mainWindow); - downloadMenu->accelerate(*mainWindow); - - userPreferencesKey.reset(new const Glib::ustring(userPreferencesKeyName)); -} - - -/*------------------------------------------------------------------------------ - * Add a new upload task to the list. - *----------------------------------------------------------------------------*/ -void -TransportList :: addUpload(Ptr::Ref playable) - throw (XmlRpcException) -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr::Ref token = storage->uploadToHub(sessionId, - playable->getId()); - - Gtk::TreeRow row = *treeModel->append(); - row[modelColumns.directionColumn] = uploadSymbol; - row[modelColumns.titleColumn] = *playable->getTitle(); - row[modelColumns.dateColumn] = *TimeConversion::nowString(); - row[modelColumns.statusColumn] = workingStatusKey; - row[modelColumns.statusDisplayColumn] - = *getResourceUstring(workingStatusKey); - row[modelColumns.tokenColumn] = token; -} - - -/*------------------------------------------------------------------------------ - * Add a new download task to the list. - *----------------------------------------------------------------------------*/ -void -TransportList :: addDownload(Ptr::Ref playable) - throw (XmlRpcException) -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr::Ref token = storage->downloadFromHub( - sessionId, - playable->getId()); - - Gtk::TreeRow row = *treeModel->append(); - row[modelColumns.directionColumn] = downloadSymbol; - row[modelColumns.titleColumn] = *playable->getTitle(); - row[modelColumns.dateColumn] = *TimeConversion::nowString(); - row[modelColumns.statusColumn] = workingStatusKey; - row[modelColumns.statusDisplayColumn] - = *getResourceUstring(workingStatusKey); - row[modelColumns.tokenColumn] = token; -} - - -/*------------------------------------------------------------------------------ - * Add an item with an already existing token to the list. - *----------------------------------------------------------------------------*/ -void -TransportList :: add(const Glib::ustring & title, - const Glib::ustring & date, - const Glib::ustring & token, - bool isUpload) - throw (XmlRpcException) -{ - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - Ptr::Ref tokenPtr(new Glib::ustring(token)); - Ptr::Ref errorMsg(new Glib::ustring); - AsyncState state = storage->checkTransport(tokenPtr, - errorMsg); - - Gtk::TreeRow row = *treeModel->append(); - row[modelColumns.directionColumn] = isUpload ? uploadSymbol - : downloadSymbol; - row[modelColumns.titleColumn] = title; - row[modelColumns.dateColumn] = date; - row[modelColumns.tokenColumn] = tokenPtr; - setStatus(row, state, errorMsg); -} - - -/*------------------------------------------------------------------------------ - * Remove the currently selected item from the list. - *----------------------------------------------------------------------------*/ -void -TransportList :: removeSelected(void) throw (XmlRpcException) -{ - Glib::RefPtr selection = treeView->get_selection(); - Gtk::TreeIter iter = selection->get_selected(); - if (!iter) { - return; - } - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref sessionId = gLiveSupport->getSessionId(); - - storage->cancelTransport(sessionId, - iter->get_value(modelColumns.tokenColumn)); - - treeModel->erase(iter); -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending transport. - *----------------------------------------------------------------------------*/ -bool -TransportList :: updateSelected(void) throw (XmlRpcException) -{ - Glib::RefPtr selection = treeView->get_selection(); - Gtk::TreeIter iter = selection->get_selected(); - if (!iter) { - return false; - } else { - return update(iter); - } -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending transport. - *----------------------------------------------------------------------------*/ -bool -TransportList :: update(void) throw (XmlRpcException) -{ - bool didSomething = false; - - for (Gtk::TreeIter it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - didSomething |= update(it); - } - - return didSomething; -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending transport. - *----------------------------------------------------------------------------*/ -bool -TransportList :: updateSilently(void) throw () -{ - bool didSomething = false; - - for (Gtk::TreeIter it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - try { - didSomething |= update(it); - } catch (XmlRpcException &e) { - } - } - - return didSomething; -} - - -/*------------------------------------------------------------------------------ - * Query the storage server about the status of the pending transport. - *----------------------------------------------------------------------------*/ -bool -TransportList :: update(Gtk::TreeIter iter) throw (XmlRpcException) -{ - if (iter->get_value(modelColumns.statusColumn) != workingStatusKey) { - return false; - } - - Ptr::Ref - storage = gLiveSupport->getStorageClient(); - Ptr::Ref errorMsg(new Glib::ustring); - AsyncState status = storage->checkTransport( - iter->get_value(modelColumns.tokenColumn), - errorMsg); - - return setStatus(iter, status, errorMsg); -} - - -/*------------------------------------------------------------------------------ - * Set the status of the row pointed to by an iterator. - *----------------------------------------------------------------------------*/ -bool -TransportList :: setStatus(Gtk::TreeIter iter, - AsyncState status, - Ptr::Ref errorMsg) - throw () -{ - if (status == AsyncState::initState - || status == AsyncState::pendingState) { - iter->set_value(modelColumns.statusColumn, - workingStatusKey); - iter->set_value(modelColumns.statusDisplayColumn, - *getResourceUstring(workingStatusKey)); - return false; - - } else if (status == AsyncState::finishedState - || status == AsyncState::closedState) { - iter->set_value(modelColumns.statusColumn, - successStatusKey); - iter->set_value(modelColumns.statusDisplayColumn, - *getResourceUstring(successStatusKey)); - return true; - - } else if (status == AsyncState::failedState) { - iter->set_value(modelColumns.statusColumn, - faultStatusKey); - iter->set_value(modelColumns.statusDisplayColumn, - *formatMessage(faultStatusKey, - *processException(errorMsg))); - return false; - - } else { - std::cerr << "Impossible status: '" << status - << "' in TransportList::setStatus()." - << std::endl; - } - - return false; -} - - -/*------------------------------------------------------------------------------ - * Return the contents of the transport list. - *----------------------------------------------------------------------------*/ -Ptr::Ref -TransportList :: getContents(void) throw () -{ - std::ostringstream contentsStream; - Gtk::TreeModel::const_iterator it; - Ptr::Ref token; - - for (it = treeModel->children().begin(); - it != treeModel->children().end(); ++it) { - Gtk::TreeRow row = *it; - if (row[modelColumns.statusColumn] == workingStatusKey) { - if (row[modelColumns.directionColumn] == uploadSymbol) { - contentsStream << "up\n"; - } else { - contentsStream << "down\n"; - } - contentsStream << row[modelColumns.titleColumn] << '\n'; - contentsStream << row[modelColumns.dateColumn] << '\n'; - token = row[modelColumns.tokenColumn]; - contentsStream << *token << '\n'; - } - } - - Ptr::Ref contents(new Glib::ustring( - contentsStream.str() )); - return contents; -} - - -/*------------------------------------------------------------------------------ - * Restore the contents of the transport list. - *----------------------------------------------------------------------------*/ -void -TransportList :: setContents(Ptr::Ref contents) - throw () -{ - std::istringstream contentsStream(contents->raw()); - - treeModel->clear(); - while (!contentsStream.eof()) { - std::string direction; - std::string title; - std::string date; - std::string token; - - std::getline(contentsStream, direction); - if (contentsStream.fail()) { - break; - } - std::getline(contentsStream, title); - if (contentsStream.fail()) { - break; - } - std::getline(contentsStream, date); - if (contentsStream.fail()) { - break; - } - std::getline(contentsStream, token); - if (contentsStream.fail()) { - break; - } - - try { - add(title, date, token, (direction == "up")); - - } catch (XmlRpcException &e) { - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for an entry being clicked in the list. - *----------------------------------------------------------------------------*/ -void -TransportList :: onEntryClicked(GdkEventButton * event) throw () -{ - if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - Gtk::TreePath currentPath; - Gtk::TreeViewColumn * column; - int cell_x, - cell_y; - bool foundValidRow = treeView->get_path_at_pos( - int(event->x), int(event->y), - currentPath, column, - cell_x, cell_y); - - if (foundValidRow) { - Gtk::TreeIter iter = treeModel->get_iter(currentPath); - if (iter) { - Gtk::TreeRow row = *iter; - if (row[modelColumns.directionColumn] == uploadSymbol) { - uploadMenu->popup(event->button, event->time); - } else { - downloadMenu->popup(event->button, event->time); - } - } - } - } -} - - -/*------------------------------------------------------------------------------ - * Event handler for "cancel" selected from the pop-up menu. - *----------------------------------------------------------------------------*/ -void -TransportList :: onCancelTransport(void) throw () -{ - try { - removeSelected(); - - } catch (XmlRpcException &e) { - gLiveSupport->displayMessageWindow(*formatMessage( - "cannotCancelTransportMsg", - e.what() )); - } -} - - -/*------------------------------------------------------------------------------ - * Handle some known exception types. - *----------------------------------------------------------------------------*/ -Ptr::Ref -TransportList :: processException(Ptr::Ref rawMessage) - throw () -{ - if (rawMessage->find("[888]") != Glib::ustring::npos) { - return getResourceUstring("duplicateFileMsg"); - } else { - return rawMessage; - } -} - diff --git a/src/products/gLiveSupport/src/TransportList.h b/src/products/gLiveSupport/src/TransportList.h deleted file mode 100644 index c46cae537..000000000 --- a/src/products/gLiveSupport/src/TransportList.h +++ /dev/null @@ -1,395 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef TransportList_h -#define TransportList_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "LiveSupport/Widgets/ZebraTreeModelColumnRecord.h" -#include "LiveSupport/Widgets/ZebraTreeView.h" -#include "GLiveSupport.h" - -#include "GuiComponent.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The list of pending transports. - * - * This is a Gtk::VBox containing a TreeView with the following columns: - *
    - *
  • shown: - *
      - *
    • the direction of the transfer (upload or download)
    • - *
    • the title of the transported file
    • - *
    • transport date
    • - *
    • transport status (localized; contains the fault string, if any)
    • - *
  • - *
  • hidden: - *
      - *
    • token
    • - *
    • transport status (not localized: - * "working" / "success" / "fault")
    • - *
  • - *
- * - * The TransportList is contained in the SearchWindow. - * - */ -class TransportList : public GuiComponent, - public ContentsStorable -{ - private: - - /** - * The user preferences key. - */ - Ptr::Ref userPreferencesKey; - - /** - * Set the status of the row pointed to by an iterator. - * - * @param iter points to the row we want to set the status of. - * @param status the new status ("working", "success" or "fault"). - * @param errorMessage the error message (for status "fault"); - * optional - * @return true if the status is "success", false otherwise. - */ - bool - setStatus(Gtk::TreeIter iter, - AsyncState status, - Ptr::Ref errorMsg - = Ptr::Ref()) - throw (); - - /** - * Add an item with an already existing token to the list. - * - * @param title the title of the transport. - * @param date the date of the transport. - * @param token the token for this transport. - * @param isUpload true if this is an upload transfer; - * false if this is a download transfer. - * @exception XmlRpcException thrown by the storage client. - */ - void - add(const Glib::ustring & title, - const Glib::ustring & date, - const Glib::ustring & token, - bool isUpload) - throw (XmlRpcException); - - /** - * Query the storage server about the status of the given row. - * If its status is 'working', call getTransportInfo - * on it, and change its displayed status, if needed. - * - * @param iter points to the row to be updated. - * @return true if getTransportInfo was called, and it returned - * 'success'; false in all other cases. - * @exception XmlRpcException thrown by the storage client. - */ - bool - update(Gtk::TreeIter iter) throw (XmlRpcException); - - /** - * Handle some known exception types. - * - * @param rawMessage the error message to be processed. - * @return a localized error message if rawMessage contains - * [xxx], where xxx is a recognized error code. - */ - Ptr::Ref - processException(Ptr::Ref rawMessage) - throw (); - - - protected: - - /** - * The columns model needed by ZebraTreeView. - * - */ - class ModelColumns : public ZebraTreeModelColumnRecord - { - public: - /** - * The column for the direction of the transport (up/down). - */ - Gtk::TreeModelColumn directionColumn; - - /** - * The column for the title of the transported file. - */ - Gtk::TreeModelColumn titleColumn; - - /** - * The column for the date of the transport. - */ - Gtk::TreeModelColumn dateColumn; - - /** - * The column for the status of the transport (not localized). - */ - Gtk::TreeModelColumn statusColumn; - - /** - * The column for the status of the transport (localized). - */ - Gtk::TreeModelColumn statusDisplayColumn; - - /** - * The column for the token corresponding to the transport. - */ - Gtk::TreeModelColumn::Ref> - tokenColumn; - - /** - * Constructor. - */ - ModelColumns(void) throw () - { - add(directionColumn); - add(titleColumn); - add(dateColumn); - add(statusColumn); - add(statusDisplayColumn); - add(tokenColumn); - } - }; - - - /** - * The column model. - */ - ModelColumns modelColumns; - - /** - * The tree model, as a GTK reference. - */ - Glib::RefPtr treeModel; - - /** - * The tree view. - */ - ZebraTreeView * treeView; - - /** - * The pop-up menu for uploads. - */ - Ptr::Ref uploadMenu; - - /** - * The pop-up menu for downloads. - */ - Ptr::Ref downloadMenu; - - /** - * Event handler for an entry being clicked in the list. - * This is used to pop up the right-click context menu. - * - * @param event the button event recieved - */ - void - onEntryClicked(GdkEventButton * event) throw (); - - /** - * Event handler for "cancel" selected from the pop-up menu. - */ - void - onCancelTransport(void) throw (); - - - public: - - /** - * Constructor. - * - * @param parent the GuiObject which contains this one. - */ - TransportList(GuiObject * parent) throw (); - - /** - * Virtual destructor. - */ - virtual - ~TransportList(void) throw () - { - } - - /** - * Add a new upload task to the list. - * - * @param playable the playable object to be uploaded to the - * network hub. - * @exception XmlRpcException thrown by the storage client. - */ - void - addUpload(Ptr::Ref playable) - throw (XmlRpcException); - - /** - * Add a new download task to the list. - * - * The playable parameter can be an incomplete object; - * all it needs to have is a unique ID, a type (audio clip or - * playlist), and a title. - * - * @param playable the playable object to be downloaded from the - * network hub. - * @exception XmlRpcException thrown by the storage client. - */ - void - addDownload(Ptr::Ref playable) - throw (XmlRpcException); - - /** - * Remove the currently selected item from the list. - * - * The doTransportAction storage function is - * called on the transport task with the cancel parameter, - * and it is removed from the tree model. - * - * @exception XmlRpcException thrown by the storage client. - */ - void - removeSelected(void) throw (XmlRpcException); - - /** - * Query the storage server about the status of the selected row. - * - * If its status is 'working', call getTransportInfo - * on it, and change its displayed status, if needed. - * - * @return true if getTransportInfo was called, and it returned - * 'success'; false in all other cases. - * @exception XmlRpcException thrown by the storage client. - */ - bool - updateSelected(void) throw (XmlRpcException); - - /** - * Query the storage server about the status of the pending transport. - * - * If there is a transport with status 'working', call getTransportInfo - * on it, and change its displayed status, if needed. - * - * @return true if getTransportInfo was called, and it returned - * at least one 'success'; false in all other cases. - * @exception XmlRpcException thrown by the storage client. - */ - bool - update(void) throw (XmlRpcException); - - /** - * Query the storage server about the status of the pending transport. - * - * If there is a transport with status 'working', call getTransportInfo - * on it, and change its displayed status, if needed. - * - * This is the same as update(), except it does not throw any - * exceptions (just ignores them). - * - * @return true if getTransportInfo was called, and it returned - * at least one 'success'; false in all other cases. - */ - bool - updateSilently(void) throw (); - - /** - * Return the contents of the transport list. - * - * The format is a newline-separated list of transport directions, - * titles, dates and tokens. - * E.g.: "up title1 date1 token1 down title2 date2 token2". - * - * @return the contents of the transport list as a string. - */ - Ptr::Ref - getContents(void) throw (); - - /** - * Restore the contents of the transport list. - * - * The current contents are discarded, and replaced with the items - * listed in the 'contents' parameter. - * The format is a newline-separated list of transport directions, - * titles, dates and tokens. - * E.g.: "up title1 date1 token1 down title2 date2 token2". - * - * @param contents the new contents of the transport list as a string. - */ - void - setContents(Ptr::Ref contents) throw (); - - /** - * Return the user preferences key. - * - * The contents of the window will be stored in the user preferences - * under this key. - * - * @return the user preference key. - */ - Ptr::Ref - getUserPreferencesKey(void) throw () - { - return userPreferencesKey; - } -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // TransportList_h - diff --git a/src/products/gLiveSupport/src/UploadFileWindow.cxx b/src/products/gLiveSupport/src/UploadFileWindow.cxx deleted file mode 100644 index 988b70a68..000000000 --- a/src/products/gLiveSupport/src/UploadFileWindow.cxx +++ /dev/null @@ -1,567 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include // for ICU -#include // for TagLib -#include // for TagLib - -#include "LiveSupport/Core/Debug.h" -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Core/FileTools.h" - -#include "UploadFileWindow.h" - - -using namespace LiveSupport::GLiveSupport; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the localization resource bundle. - *----------------------------------------------------------------------------*/ -const Glib::ustring bundleName = "uploadFileWindow"; - -/*------------------------------------------------------------------------------ - * The name of the glade file. - *----------------------------------------------------------------------------*/ -const Glib::ustring gladeFileName = "UploadFileWindow.glade"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -UploadFileWindow :: UploadFileWindow ( - Gtk::ToggleButton * windowOpenerButton) - throw () - : GuiWindow(bundleName, - gladeFileName, - windowOpenerButton), - fileType(invalidType) -{ - Gtk::Label * fileNameLabel; - glade->get_widget("fileNameLabel1", fileNameLabel); - glade->get_widget("fileNameEntry1", fileNameEntry); - glade->get_widget("browseButton1", browseButton); - fileNameLabel->set_label(*getResourceUstring("chooseFileLabel")); - browseButton->set_label(*getResourceUstring("chooseFileButtonLabel")); - fileNameEntry->signal_focus_out_event().connect(sigc::mem_fun(*this, - &UploadFileWindow::onFileNameEntryLeave)); - browseButton->signal_clicked().connect(sigc::mem_fun(*this, - &UploadFileWindow::onBrowseButtonClicked)); - - Gtk::Label * mainTabLabel; - Gtk::Label * musicTabLabel; - Gtk::Label * voiceTabLabel; - glade->get_widget("mainTabLabel1", mainTabLabel); - glade->get_widget("musicTabLabel1", musicTabLabel); - glade->get_widget("voiceTabLabel1", voiceTabLabel); - mainTabLabel->set_label(*getResourceUstring("mainSectionLabel")); - musicTabLabel->set_label(*getResourceUstring("musicSectionLabel")); - voiceTabLabel->set_label(*getResourceUstring("voiceSectionLabel")); - - Ptr::Ref - metadataTypes = gLiveSupport->getMetadataTypeContainer(); - - mainCounter = 0; - musicCounter = 0; - voiceCounter = 0; - MetadataTypeContainer::Vector::const_iterator it; - for (it = metadataTypes->begin(); it != metadataTypes->end(); ++it) { - Ptr::Ref metadata = *it; - Gtk::Entry * metadataEntry = constructMetadataItem(metadata); - if (metadataEntry) { - metadataKeys.push_back(metadata->getDcName()); - metadataEntries.push_back(metadataEntry); - } - } - - Gtk::Label * lengthLabel; - glade->get_widget("lengthLabel1", lengthLabel); - glade->get_widget("lengthValueLabel1", lengthValueLabel); - lengthLabel->set_label(*getResourceUstring("lengthLabel")); - lengthValueLabel->set_label("00:00:00"); - - glade->get_widget("statusBar1", statusBar); - statusBar->set_text(""); - - glade->connect_clicked("uploadButton1", sigc::mem_fun(*this, - &UploadFileWindow::onUploadButtonClicked)); - glade->connect_clicked("cancelButton1", sigc::mem_fun(*this, - &UploadFileWindow::onCancelButtonClicked)); - - fileChooserFolder = Glib::get_home_dir(); -} - - -/*------------------------------------------------------------------------------ - * Display the given metadata entry field in the appropriate tab. - *----------------------------------------------------------------------------*/ -Gtk::Entry * -UploadFileWindow :: constructMetadataItem( - Ptr::Ref metadata) - throw () -{ - Gtk::Entry * entry = 0; - - MetadataType::TabType tab = metadata->getTab(); - - switch (tab) { - case MetadataType::mainTab : - entry = constructMetadataItem(metadata, "main", mainCounter); - ++mainCounter; - break; - - case MetadataType::musicTab : - entry = constructMetadataItem(metadata, "music", musicCounter); - ++musicCounter; - break; - - case MetadataType::voiceTab : - entry = constructMetadataItem(metadata, "voice", voiceCounter); - ++voiceCounter; - break; - - case MetadataType::noTab : // added to prevent compiler - break; // warning about missing case - } - - return entry; -} - - -/*------------------------------------------------------------------------------ - * Display the given metadata entry field in the appropriate tab. - *----------------------------------------------------------------------------*/ -Gtk::Entry * -UploadFileWindow :: constructMetadataItem( - Ptr::Ref metadata, - const Glib::ustring & tabName, - int index) - throw () -{ - Gtk::Box * metadataBox; - Gtk::Label * metadataLabel; - Gtk::Entry * metadataEntry; - - glade->get_widget(tabName + "Box" + itoa(index + 1), metadataBox); - glade->get_widget(tabName + "MetadataLabel" + itoa(index + 1), - metadataLabel); - glade->get_widget(tabName + "MetadataEntry" + itoa(index + 1), - metadataEntry); - - metadataBox->show(); - metadataLabel->set_label(*metadata->getLocalizedName()); - return metadataEntry; -} - - -/*------------------------------------------------------------------------------ - * The event when the choose file button has been clicked. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: onBrowseButtonClicked(void) throw () -{ - Ptr::Ref dialog(new Gtk::FileChooserDialog( - *getResourceUstring("fileChooserDialogTitle"), - Gtk::FILE_CHOOSER_ACTION_OPEN)); - dialog->set_name("uploadFileChooserDialog"); - - dialog->set_current_folder(fileChooserFolder); - dialog->set_transient_for(*mainWindow); - - //Add response buttons the the dialog: - dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - dialog->add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); - - int result = dialog->run(); - - if (result == Gtk::RESPONSE_OK) { - clearEverything(); - fileNameEntry->set_text(dialog->get_filename()); - updateFileInfo(); - fileChooserFolder = dialog->get_current_folder(); - } -} - - -/*------------------------------------------------------------------------------ - * Update the file information to upload. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: updateFileInfo(void) throw () -{ - Glib::ustring fileName = fileNameEntry->get_text(); - - // do not display bogus error msg for point-to-focus users - if (fileName == "") { - return; - } - - // see if the file exists, and is readable - std::ifstream file(fileName.c_str()); - if (!file.good()) { - file.close(); - statusBar->set_text(*getResourceUstring("couldNotOpenFileMsg")); - fileType = invalidType; - return; - } - file.close(); - - fileType = determineFileType(fileName); - - switch (fileType) { - case audioClipType: readAudioClipInfo(fileName); - break; - - case playlistArchiveType: statusBar->set_text(""); - break; - - case storageArchiveType: statusBar->set_text(""); - break; - - case invalidType: statusBar->set_text(*getResourceUstring( - "unsupportedFileTypeMsg")); - break; - } -} - - -/*------------------------------------------------------------------------------ - * Read the playlength and metadata info from the binary audio file. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: readAudioClipInfo(const Glib::ustring & fileName) - throw () -{ - Ptr::Ref newUri(new std::string("file://")); - newUri->append(fileName); - - Ptr::Ref playlength; - try { - playlength = readPlaylength(fileName); - } catch (std::invalid_argument &e) { - statusBar->set_text(*getResourceUstring("unsupportedFileTypeMsg")); - fileType = invalidType; - return; - } - if (!playlength) { - statusBar->set_text(*getResourceUstring("couldNotReadLengthMsg")); - playlength.reset(new time_duration(0,0,0,0)); - } - - // display the new play length - Ptr::Ref lengthStr - = TimeConversion::timeDurationToHhMmSsString( - playlength); - lengthValueLabel->set_text(*lengthStr); - - // read the id3 tags - Ptr::Ref tempTitle(new const Glib::ustring); - audioClip.reset(new AudioClip(tempTitle, playlength, newUri)); - - try { - audioClip->readTag(gLiveSupport->getMetadataTypeContainer()); - } catch (std::invalid_argument &e) { - statusBar->set_text(e.what()); - fileType = invalidType; - return; - } - - for (unsigned int i=0; i < metadataKeys.size(); ++i) { - Ptr::Ref metadataKey = metadataKeys[i]; - Gtk::Entry * metadataEntry = metadataEntries[i]; - - Ptr::Ref metadataValue - = audioClip->getMetadata(*metadataKey); - if (metadataValue) { - metadataEntry->set_text(*metadataValue); - } - } - - statusBar->set_text(""); -} - - -/*------------------------------------------------------------------------------ - * The event when the user has left the file name entry box. - *----------------------------------------------------------------------------*/ -bool -UploadFileWindow :: onFileNameEntryLeave(GdkEventFocus * event) - throw () -{ - updateFileInfo(); - return false; -} - - -/*------------------------------------------------------------------------------ - * The event when the upload button has been clicked. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: onUploadButtonClicked(void) throw () -{ - switch (fileType) { - case audioClipType: uploadAudioClip(); - break; - - case playlistArchiveType: uploadPlaylistArchive(); - break; - - case storageArchiveType: uploadStorageArchive(); - break; - - case invalidType: break; - } -} - - -/*------------------------------------------------------------------------------ - * Upload an audio clip to the storage. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: uploadAudioClip(void) throw () -{ - Ptr::Ref - metadataTypes = gLiveSupport->getMetadataTypeContainer(); - - for (unsigned int i=0; i < metadataKeys.size(); ++i) { - Ptr::Ref metadataKey = metadataKeys[i]; - Gtk::Entry * metadataEntry = metadataEntries[i]; - - Ptr::Ref metadataValue(new Glib::ustring( - metadataEntry->get_text() )); - if (*metadataValue != "") { - if (metadataTypes->check(metadataValue, *metadataKey)) { - audioClip->setMetadata(metadataValue, *metadataKey); - } else { - Ptr::Ref - metadata = metadataTypes->getByDcName(*metadataKey); - Ptr::Ref - localizedName = metadata->getLocalizedName(); - statusBar->set_text(*formatMessage("badMetadataMsg", - *localizedName)); - return; - } - } - } - - Ptr::Ref title = audioClip->getTitle(); - if (!title || *title == "") { - statusBar->set_text(*getResourceUstring("missingTitleMsg")); - return; - } - - try { - gLiveSupport->uploadAudioClip(audioClip); - - } catch (XmlRpcMethodFaultException &e) { - statusBar->set_text(*processException(e)); - return; - - } catch (XmlRpcException &e) { - statusBar->set_text(e.what()); - std::cerr << e.what(); - return; - } - - clearEverything(); - statusBar->set_text(*formatMessage("fileUploadedMsg", - *audioClip->getTitle() )); - hide(); -} - - -/*------------------------------------------------------------------------------ - * Upload a playlist archive to the storage. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: uploadPlaylistArchive(void) throw () -{ - Ptr::Ref path(new const Glib::ustring( - fileNameEntry->get_text() )); - - Ptr::Ref playlist; - try { - playlist = gLiveSupport->uploadPlaylistArchive(path); - - } catch (XmlRpcMethodFaultException &e) { - statusBar->set_text(*processException(e)); - return; - - } catch (XmlRpcException &e) { - statusBar->set_text(e.what()); - return; - } - - clearEverything(); - statusBar->set_text(*formatMessage("fileUploadedMsg", - *playlist->getTitle() )); - hide(); -} - - -/*------------------------------------------------------------------------------ - * Upload a storage archive to the storage. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: uploadStorageArchive(void) throw () -{ - Ptr::Ref path(new const Glib::ustring( - fileNameEntry->get_text() )); - - Ptr::Ref restoreBackupWindow( - new RestoreBackupWindow(path)); - restoreBackupWindow->show(); - restoreBackupWindowList.push_back(restoreBackupWindow); - - clearEverything(); - hide(); -} - - -/*------------------------------------------------------------------------------ - * The event when the close button has been clicked. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: onCancelButtonClicked(void) throw () -{ - clearEverything(); - hide(); -} - - -/*------------------------------------------------------------------------------ - * Determine the length of an audio file - *----------------------------------------------------------------------------*/ -Ptr::Ref -UploadFileWindow :: readPlaylength(const Glib::ustring & fileName) - throw (std::invalid_argument) -{ - // TODO: use the appropriate TagLib::X::File subclass constructors, - // once we find some way of determining the MIME type. - TagLib::FileRef fileRef(fileName.c_str()); - if (fileRef.isNull()) { - throw std::invalid_argument("unsupported file type"); - } - - TagLib::AudioProperties * audioProperties = fileRef.audioProperties(); - Ptr::Ref length; - if (audioProperties) { - length.reset(new time_duration( - seconds( audioProperties->length() ) - + microseconds(audioProperties->length_microseconds()) )); - } - return length; -} - - -/*------------------------------------------------------------------------------ - * Determine the type of the given file. - *----------------------------------------------------------------------------*/ -UploadFileWindow::FileType -UploadFileWindow :: determineFileType(const Glib::ustring & fileName) - throw () -{ - unsigned int dotPosition = fileName.rfind('.'); - if (dotPosition == std::string::npos) { - return invalidType; - } - - Glib::ustring extension = fileName.substr(dotPosition).lowercase(); - if (extension == ".mp3" || extension == ".ogg") { - return audioClipType; - - } else if (extension == ".tar") { - if (FileTools::existsInTarball(fileName, "exportedPlaylist.lspl")) { - return playlistArchiveType; - } else if (FileTools::existsInTarball( - fileName, "meta-inf/storage.xml")) { - return storageArchiveType; - } else { - return invalidType; - } - - } else { - return invalidType; - } -} - - -/*------------------------------------------------------------------------------ - * Clear all the input fields and set the fileType to 'invalidType'. - *----------------------------------------------------------------------------*/ -void -UploadFileWindow :: clearEverything(void) throw () -{ - fileNameEntry->set_text(""); - for (unsigned int i = 0; i < metadataEntries.size(); ++i) { - Gtk::Entry * metadataEntry = metadataEntries[i]; - metadataEntry->set_text(""); - } - statusBar->set_text(""); - fileType = invalidType; -} - - -/*------------------------------------------------------------------------------ - * Handle some known exception types. - *----------------------------------------------------------------------------*/ -Ptr::Ref -UploadFileWindow :: processException(const XmlRpcMethodFaultException & e) - throw () -{ - Ptr::Ref message; - - if (e.getFaultCode() == 888) { - message = getResourceUstring("duplicateFileMsg"); - - } else { - message.reset(new const Glib::ustring(e.what())); - } - - std::cerr << e.what() << std::endl; - - return message; -} - - diff --git a/src/products/gLiveSupport/src/UploadFileWindow.h b/src/products/gLiveSupport/src/UploadFileWindow.h deleted file mode 100644 index ba1376c3e..000000000 --- a/src/products/gLiveSupport/src/UploadFileWindow.h +++ /dev/null @@ -1,328 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef UploadFileWindow_h -#define UploadFileWindow_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Widgets/ComboBoxText.h" -#include "RestoreBackupWindow.h" -#include "GLiveSupport.h" - -#include "GuiWindow.h" -#include "LiveSupport/Core/NumericTools.h" - - -namespace LiveSupport { -namespace GLiveSupport { - -using namespace LiveSupport::Core; -using namespace LiveSupport::Widgets; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The upload file window. - * - * It allows one to select a file from the file system, add metadata, - * and upload it to the storage server. - * - */ -class UploadFileWindow : public GuiWindow, - private NumericTools -{ - private: - - /** - * The text entry for selecting a file name - */ - Gtk::Entry * fileNameEntry; - - /** - * The file browser button. - */ - Gtk::Button * browseButton; - - /** - * A list of the Dublin Core names of the metadata fields. - */ - std::vector::Ref> - metadataKeys; - - /** - * A list of the metadata entry fields. - */ - std::vector metadataEntries; - - /** - * A counter for the metadata entries in the Main tab. - */ - int mainCounter; - - /** - * A counter for the metadata entries in the Music tab. - */ - int musicCounter; - - /** - * A counter for the metadata entries in the Voice tab. - */ - int voiceCounter; - - /** - * The length value label. - */ - Gtk::Label * lengthValueLabel; - - /** - * The upload button. - */ - Gtk::Button * uploadButton; - - /** - * The cancel button. - */ - Gtk::Button * cancelButton; - - /** - * The status bar. - */ - Gtk::Label * statusBar; - - /** - * The audio clip to be uploaded. - */ - Ptr::Ref audioClip; - - /** - * The restore backup windows opened by this window. - */ - std::vector::Ref> - restoreBackupWindowList; - - /** - * The possible file types. - */ - typedef enum { audioClipType, - playlistArchiveType, - storageArchiveType, - invalidType } - FileType; - - /** - * The type of the currently selected file. - */ - FileType fileType; - - /** - * The starting folder for the file chooser dialog. - */ - Glib::ustring fileChooserFolder; - - /** - * Construct the metadata entry item. - * - * @param metadata the metadata to display in the entry. - * @return the entry field for the metadata. - */ - Gtk::Entry * - constructMetadataItem(Ptr::Ref metadata) - throw (); - - /** - * Construct the metadata entry item. - * This is an auxiliary method, called by the other method with - * the same name. - * - * @param metadata the metadata to display in the entry. - * @param tabName the name of the tab: "main", "music" or "voice". - * @param index the index of the item in its tab. - * @return the entry field for the metadata. - */ - Gtk::Entry * - constructMetadataItem(Ptr::Ref metadata, - const Glib::ustring & tabName, - int index) - throw (); - - /** - * Update the information for the file to upload, based on the - * value of the fileNameEntry text entry field. - */ - void - updateFileInfo(void) throw (); - - /** - * Read the playlength and metadata info from the binary audio file. - * - * @param fileName the local file name (with path) for the - * binary audio file. - */ - void - readAudioClipInfo(const Glib::ustring & fileName) - throw (); - - /** - * Determine the length of an audio file on disk. - * - * @param fileName a binary audio file (e.g., /tmp/some_clip.mp3) - * @return the length of the file; a null pointer if the - * length could not be read (see bug #1426) - * @exception std::invalid_argument if the file is not found, or its - * format is not supported by TagLib - */ - Ptr::Ref - readPlaylength(const Glib::ustring & fileName) - throw (std::invalid_argument); - - /** - * Upload an audio clip to the storage. - */ - void - uploadAudioClip(void) throw (); - - /** - * Upload a playlist archive to the storage. - */ - void - uploadPlaylistArchive(void) throw (); - - /** - * Upload a storage archive to the storage. - */ - void - uploadStorageArchive(void) throw (); - - /** - * Determine the type of the given file. - * - * This method looks at the extension only. - * TODO: replace this with proper mime-type detection - * (gnomevfs, system("file fileName"), or ...?) - * - * @param fileName the name (with path) of the local file. - * @return the type of the file. - */ - FileType - determineFileType(const Glib::ustring & fileName) - throw (); - - /** - * Clear all the input fields and set the fileType to 'invalidType'. - */ - void - clearEverything(void) throw (); - - /** - * Handle some known exception types. - * - * @param e the exception to be processed. - * @return a localized error message if e has one of the recognized - * faultCode values; e.what() if not. - */ - Ptr::Ref - processException(const XmlRpcMethodFaultException & e) - throw (); - - - protected: - - /** - * Function to catch the event of the choose file button being - * pressed. - */ - virtual void - onBrowseButtonClicked(void) throw (); - - /** - * Function to catch the event of the upload button being - * pressed. - */ - virtual void - onUploadButtonClicked(void) throw (); - - /** - * Signal handler for the user leaving the filename entry box, - * where persumably he may have types in a new filename. - * - * @param event the event recieved. - * @return true if the event has been processed, false otherwise. - */ - virtual bool - onFileNameEntryLeave(GdkEventFocus * event) throw (); - - /** - * Function to catch the event of the cancel button being pressed. - */ - virtual void - onCancelButtonClicked(void) throw (); - - - public: - - /** - * Constructor. - * - * @param windowOpenerButton the button which was pressed to open - * this window. - */ - UploadFileWindow(Gtk::ToggleButton * windowOpenerButton) - throw (); - - /** - * Virtual destructor. - */ - virtual - ~UploadFileWindow(void) throw () - { - } - -}; - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace GLiveSupport -} // namespace LiveSupport - -#endif // UploadFileWindow_h - diff --git a/src/products/gLiveSupport/src/main.cxx b/src/products/gLiveSupport/src/main.cxx deleted file mode 100644 index f7c0a6add..000000000 --- a/src/products/gLiveSupport/src/main.cxx +++ /dev/null @@ -1,214 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/** @file - * This file contains the main entry point to the Studio client. - */ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/LocalizedObject.h" - -#include "GLiveSupport.h" - -using namespace LiveSupport::Core; -using namespace LiveSupport::GLiveSupport; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -namespace { - -/** - * Our copyright notice, should be at most 80 columns - */ -const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -const char options[] = "c:hv"; - -/** - * Structure describing the long options - */ -const struct option longOptions[] = - { - { "config", required_argument, 0, 'c' }, - { "help", no_argument, 0, 'h' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } - }; - -} - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -void -printUsage ( const char invocation[], - std::ostream & os ); - - -/* ============================================================= module code */ - -/** - * Program entry point. - * - * @param argc the number of command line arguments passed by the user. - * @param argv the command line arguments passed by the user. - * @return 0 on success, non-0 on failure. - */ -int main ( int argc, - char * argv[] ) -{ - // initialize the Gtk library, with the Gtk options first - Gtk::Main kit(argc, argv); - - // take a look at our options - int i; - std::string configFileName; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'c': - configFileName = optarg; - break; - - case 'h': - printUsage(argv[0], std::cout); - return 0; - - case 'v': - printVersion(std::cout); - return 0; - - default: - printUsage(argv[0], std::cout); - return 1; - } - } - - if (optind != argc) { - printUsage(argv[0], std::cout); - return 1; - } - - Ptr::Ref - gLiveSupport = LiveSupport::GLiveSupport::GLiveSupport::getInstance(); - - try { - std::auto_ptr - parser(new xmlpp::DomParser(configFileName, false)); - const xmlpp::Document * document = parser->get_document(); - gLiveSupport->configure(*(document->get_root_node())); - } catch (std::invalid_argument &e) { - std::cerr << "error in configuration file: " - << e.what() << std::endl; - return 1; - } catch (xmlpp::exception &e) { - std::cerr << "error parsing configuration file: " - << e.what() << std::endl; - return 1; - } catch (std::logic_error &e) { - std::cerr << "error while configuring: " - << e.what() << std::endl; - return 1; - } - - if (!gLiveSupport->checkConfiguration()) { - std::cerr << "error; please check your configuration file" << std::endl; - return 1; - } - - gLiveSupport->show(); - return 0; -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION]" - << std::endl - << " mandatory options:" << std::endl - << " -c, --config=file.name scheduler configuration file" << std::endl - << " optional options:" << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/products/gLiveSupport/tmp/.keepme b/src/products/gLiveSupport/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/products/gLiveSupport/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/products/gLiveSupport/var/.keepme b/src/products/gLiveSupport/var/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/products/gLiveSupport/var/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/products/gLiveSupport/var/campcaster.png b/src/products/gLiveSupport/var/campcaster.png deleted file mode 100644 index bb405bcc7e3f35792abe49b1eaf996ce4a30268e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1081 zcmV-91jhS`P)?$L%Qlp2rs0dE(+{#NJI(@`kkkCnK|b?d+#oeY2+x92wlv+eJ*}`?PssG>F&6nCAiNu1DFBadnI>x zGr-;8Bph*yW0z4J18I%TGOHbF-r)cVlKd|KxT9L;sUPs|M;QFcwTv`?1Vq!k&+p;7 z7ueJ5Sw7&l08Z;DgZ-n;FI|1CC zq*~vXZ&HIt1<{9i+M^?h0`!Ue&=PHgJd+29r&%de1t7MhTn_ z0KiUtuX|pT73+QdHkq@4l-eJ9rKA^s;mCQ!Xf18_aJRIy1qwh15i54#1P<==#VeCF zo5?`oO~Bv1s~tOF``-^+b|wp#yNH>=;KKv{44D_*MfyJs*LVdHD zAxSY+;$#t(l4-Q(cVw%ca|VD8$DczO8Rnv8WJX?BU~y=W#R+yV7tjHt^7K)A?{&#% z*0qWYmnA)`y=gW85^w{=Cdd5r5j%6-jvesM$C7Ptv9X092$;d0Ny^%Ys^yYQmAttS zOk6-y?fcmG?~&fk{`f|jH3xu5QWI)sW)@>~)ru*dS{e;U_viZi!b@-B!R{mk05_~h zcdr?;W?H!ES9|@^`DD{}79MgiTGX;uieo%;)Q5g`Aa-_P;nI+AAPfW{<_Hrba`^L7 z*K*8TlFR2B>gtmu`PUY~tZd(XB28_+bbZvQ=BCD}$?)}F`SG(Pm$9w^4lhk0t&hu| zo?5%b>Y7C)%d#|0orbd~y|qId3)N~2A>{MDeR4wT8w3K%KeytR z!1Y?NhuVVPCBPj7ZlA&Td~nE_n>+*f9|8UX_MABsN9z1T00000NkvXXu0mjfd4mAC diff --git a/src/products/gLiveSupport/var/en.txt b/src/products/gLiveSupport/var/en.txt deleted file mode 100644 index d59f768a0..000000000 --- a/src/products/gLiveSupport/var/en.txt +++ /dev/null @@ -1,3 +0,0 @@ -en:table -{ -} diff --git a/src/products/gLiveSupport/var/es.txt b/src/products/gLiveSupport/var/es.txt deleted file mode 100644 index a3e986632..000000000 --- a/src/products/gLiveSupport/var/es.txt +++ /dev/null @@ -1,466 +0,0 @@ -es:table -{ - cancelButtonLabel:string { "Cancel" } - noButtonLabel:string { "No" } - yesButtonLabel:string { "Yes" } - okButtonLabel:string { "OK" } - - localeNotAvailableMsg:string { "Ubicación {0} no disponible" } - schedulerNotReachableMsg:string { "El servidor del programador no está disponible" } - storageNotReachableMsg:string { "El servidor de almacenamiento no está disponible" } - authenticationNotReachableMsg:string - { "El servidor de autenticación no está " - "disponible.\n" - "Would you like to edit the server " - "settings?" } - audioErrorMsg { "Error del reproductor de audio: " } - - masterPanelWindow:table - { - windowTitle:string { "Panel maestro" } - - notLoggedInMsg:string { "No ha ingresado al sistema" } - loggedInMsg:string { "Ingresó: {0}" } - loginButtonLabel:string { "Accesar" } - logoutButtonLabel:string { "Salir" } - liveModeButtonLabel:string { "En vivo" } - uploadFileButtonLabel:string { "Cargar archivo" } - scratchpadButtonLabel:string { "Scratchpad" } - playlistButtonLabel:string { "Lista de repr." } - schedulerButtonLabel:string { "Programador" } - searchButtonLabel:string { "Búsqueda" } - optionsButtonLabel:string { "Options" } - - elapsedTimeLabel:string { "elapsed" } - remainingTimeLabel:string { "remaining" } - - sureToExitMsg:string { "Are you sure you want to exit?" } - } - - loginWindow:table - { - windowTitle:string { "INGRESO" } - - userNameLabel:string { "Identificador" } - passwordLabel:string { "Clave de acceso" } - languageLabel:string { "#Language#" } - - pleaseWaitMsg:string { "Logging in, please wait." } - } - - audioClipListWindow:table - { - windowTitle:string { "Audio clip" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "duración" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "muestra" } - - closeButtonLabel:string { "cerrar" } - } - - scratchpadWindow:table - { - windowTitle:string { "Scratchpad" } - - creatorColumnLabel:string { "Creador" } - titleColumnLabel:string { "Título" } - addToPlaylistButtonLabel:string { "Añadir a lista de reproducción" } - clearListButtonLabel:string { "Limpiar la lista" } - removeButtonLabel:string { "Eliminar elemento(s)" } - - cueMenuItem:string { "Previsualizar" } - addToLiveModeMenuItem:string { "Añadir a modo en vivo" } - addToPlaylistMenuItem:string { "Añadir a lista de reproducción" } - removeMenuItem:string { "Eliminar" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "Programar lista de reproducción" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - playlistListWindow:table - { - windowTitle:string { "Lista de reproducción" } - - listBoxLabel { "Listas de reproducción" } - detailBoxLabel { "Detalles de las listas de reproducción" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "duración" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "muestra" } - - closeButtonLabel:string { "cerrar" } - } - - uploadFileWindow:table - { - windowTitle:string { "Cargar archivo" } - - chooseFileLabel:string { "Nombre del archivo" } - chooseFileButtonLabel:string { "Navegar" } - - mainSectionLabel:string { "Principal" } - musicSectionLabel:string { "Music" } - voiceSectionLabel:string { "Voice" } - - lengthLabel:string { "Duración" } - - uploadButtonLabel:string { "Cargar" } - closeButtonLabel:string { "Cancelar" } - - fileChooserDialogTitle:string { "Seleccione un archivo" } - fileUploadedMsg:string { "File ''{0}'' cargado." } - couldNotOpenFileMsg:string { "#The file could not be opened.#" } - couldNotReadLengthMsg:string { "#Could not determine audio clip " - "length.#" } - unsupportedFileTypeMsg:string { "#Unsupported file type.#" } - missingTitleMsg:string { "#Please enter a title.#" } - badMetadataMsg:string { "#Invalid data for {0}.#" } - duplicateFileMsg:string { "#Error: the file is in the storage " - "already.#" } - } - - playlistWindow:table - { - windowTitle:string { "Lista de reproducción" } - - startColumnLabel:string { "inicio" } - titleColumnLabel:string { "título" } - lengthColumnLabel:string { "duración" } - fadeInColumnLabel:string { "Fade in" } - fadeOutColumnLabel:string { "Fade out" } - - nameLabel:string { "nombre" } - lengthLabel:string { "Duration:" } - saveButtonLabel:string { "guardar" } - closeButtonLabel:string { "cerrar" } - lockFadesCheckButtonLabel:string - { "Lock fade-out to following fade-in" } - - upMenuItem:string { "Move _Up" } - downMenuItem:string { "Move D_own" } - removeMenuItem:string { "_Remove" } - - playlistSavedMsg:string { "lista de reproducción guardada {0}" } - savePlaylistDialogMsg:string { "Do you want to save the playlist?" } - closeWithoutSavingButtonLabel:string - { "#Close without Saving#" } - emptyTitleErrorMsg:string { "Please enter a title." } - } - - schedulerWindow:table - { - windowTitle:string { "Programador" } - - scheduleTab:string { "Schedule" } - statusTab:string { "Status" } - - startColumnLabel:string { "inicio" } - titleColumnLabel:string { "título" } - endColumnLabel:string { "fin" } - deleteMenuItem:string { "eliminar" } - - stopCurrentlyPlayingButtonLabel:string { "Stop" } - stopCurrentlyPlayingText:string { "what is currently playing " - "in the scheduler." } - stopCurrentlyPlayingDialogMsg:string { "Are you sure?" } - - closeButtonLabel:string { "cerrar" } - - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Listas de reproducción programadas" } - - hourLabel:string { "hora: " } - minuteLabel:string { "minuto: " } - secondLabel:string { "seconds: " } - scheduleButtonLabel:string { "programado" } - closeButtonLabel:string { "cerrar" } - } - - searchWindow:table - { - windowTitle:string { "Búsqueda/Navegación" } - - searchWhereLabel:string { "Search or browse on: " } - searchWhereLocal:string { "local storage" } - searchWhereRemote:string { "network hub" } - - simpleSearchTab:string { "Búsqueda" } - advancedSearchTab:string { "Búsqueda avanzada" } - browseTab:string { "Navegar" } - transportsTab:string { "Transfers" } - - searchButtonLabel:string { "Buscar" } - backwardButtonLabel:string { "⇦ Previous" } - forwardButtonLabel:string { "Next ⇨" } - searchResultsCountLabel:string { "{0}-{1} of {2} results" } - - typeColumnLabel:string { "Tipo" } - titleColumnLabel:string { "Título" } - creatorColumnLabel:string { "Creador" } - sourceColumnLabel:string { "Album" } - lengthColumnLabel:string { "Duración" } - - allStringForBrowse { "--- todo ---" } - - addToScratchpadMenuItem:string { "_Añadir a Scratchpad" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - addToLiveModeMenuItem:string { "Añadir a Modo en vivo" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to the network hub" } - downloadFromHubMenuItem:string { "Download from the network hub" } - - pleaseWaitMsg:string { "Please wait..." } - shortErrorMsg:string { "Search failed." } - longErrorMsg:string { "Search failed: {0}." } - uploadToHubErrorMsg:string { "Uploading to hub failed: {0}." } - downloadFromHubErrorMsg:string { "Downloading from hub failed: {0}." } - nothingFoundMsg:string { "No files found." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "File types" } - allFileType:string { "all" } - audioClipFileType:string { "audio clips" } - playlistFileType:string { "playlists" } - - searchByTextLabel:string { "Buscar por" } - - partialOperatorDisplay:string { "contiene" } - prefixOperatorDisplay:string { "empieza con" } - =OperatorDisplay:string { "equivale" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Modo en vivo" } - - playMenuItem:string { "Reproduccir" } - cueMenuItem:string { "Previsualizar" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - removeMenuItem:string { "Eliminar" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cuePlayerLabel:string { "Previsualizar" } - autoPlayNextLabel:string { "#Play the next item automatically#" } - - clearListButtonLabel:string { "Clear list" } - removeButtonLabel:string { "Remove item(s)" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - optionsWindow:table - { - windowTitle:string { "Options" } - - needToRestartMsg:string { "You will need to restart the " - "application\nfor the new settings " - "to take effect." } - errorMsg:string { "Could not save the options: " } - - soundSectionLabel:string { "Sound" } - keyBindingsSectionLabel:string { "Keyboard Shortcuts" } - serversSectionLabel:string { "Servers" } - schedulerSectionLabel:string { "Scheduler" } - backupSectionLabel:string { "Backup" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "About" } - - cancelButtonLabel:string { "Cancel" } - applyButtonLabel:string { "Apply" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Cue audio device:" } - outputDeviceLabel:string { "Live Mode audio device:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Press a key..." } - keyBindingsInstructionsText:string - { "Double-click on the shortcut you want " - "to change, \n" - "then press the key for the new " - "shortcut\n" - "(or press the Escape key to cancel " - "the operation)." } - - authenticationLabel:string { "Authentication server" } - storageLabel:string { "Storage server" } - schedulerLabel:string { "Scheduler server" } - serverLabel:string { "address:" } - portLabel:string { "port:" } - pathLabel:string { "path:" } - - schedulerStatusText:string { "The scheduler is" } - schedulerRunningStatus:string { "running." } - schedulerStoppedStatus:string { "stopped." } - schedulerStartButtonLabel:string { "Start" } - schedulerStopButtonLabel:string { "Stop" } - - reportBugsToText:string { "Report bugs to: {0}" } - } - - backupView:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - mtimeTextLabel:string { "#Modified since:#" } - chooseTimeButtonLabel:string { "#Choose time#" } - resetTimeButtonLabel:string { "#Reset#" } - - backupButtonLabel:string { "#Backup#" } - deleteButtonLabel:string { "#Delete#" } - saveButtonLabel:string { "#Save#" } - - backupTitleLabel:string { "#Title:#" } - defaultBackupTitle:string { "#new backup#" } - - fileChooserDialogTitle:string { "#Save File#" } - backupErrorMsg:string { "#Backup error: #" } - } - - rdsView:table - { - deviceLabel:string { "#Serial port:#" } - PSrdsLabel:string { "#Station name:#" } - PIrdsLabel:string { "#Station code:#" } - RTrdsLabel:string { "#Clip info:#" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Select the date and time" } - - cancelButtonLabel:string { "Cancel" } - okButtonLabel:string { "OK" } - - hourLabel:string { "hour:" } - minuteLabel:string { "minute:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Export Playlist" } - - playlistTitleLabel:string { "Title:" } - formatLabel:string { "Export as:" } - - cancelButtonLabel:string { "Cancel" } - saveButtonLabel:string { "Save" } - - internalFormatName:string { "Campcaster archive" } - smilFormatName:string { "tar containing a SMIL" } - - fileChooserDialogTitle:string { "Save File" } - - createExportErrorMsg:string { "Could not export the playlist:" } - saveExportErrorMsg:string { "Could not save the exported playlist." } - } - - transportList:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - cancelUploadMenuItem:string { "#Cancel upload#" } - cancelDownloadMenuItem:string { "#Cancel download#" } - - cannotCancelTransportMsg:string { "#Canceling failed: {0}.#" } - duplicateFileMsg:string { "#the file is in the network " - "hub already.#" } - } - - restoreBackupWindow:table - { - windowTitle:string { "Restore Backup" } - errorMessage:string { "Error: {0}" } - pendingMessage:string { "Uploading backup file\n''{0}''.\n" - "Please wait..." } - finishedMessage:string { "Upload finished." } - } - - metadataTypes:table - { - title:string { "Título" } - creator:string { "Creador" } - album:string { "Álbum" } - year:string { "Año" } - genre:string { "Género" } - description:string { "Descripción" } - format:string { "Formato" } - length:string { "Duración" } - bpm:string { "BPM" } - rating:string { "Calificación" } - encoded_by:string { "Codificador por" } - track_number:string { "Pista número" } - disc_number:string { "Disco número" } - mood:string { "Clasificación" } - publishing_label:string { "Disquera" } - composer:string { "Compositor" } - bitrate:string { "Tasa de bits" } - channels:string { "Canales" } - sample_rate:string { "Tasa de muestra" } - encoding_software:string { "Programa para codificación" } - checksum:string { "Suma de comprobación" } - lyrics:string { "Letras" } - orchestra_or_band:string { "Orquesta o grupo musical" } - conductor:string { "Conductor" } - lyricist:string { "Autor de la letra" } - original_lyricist:string { "Autor original" } - radio_station_name:string { "Nombre de la estación de radio" } - audio_file_info_url:string { "Sitio web con información del archivo" } - artist_url:string { "Sitio web del artista" } - audio_source_url:string { "Sitio web de la fuente" } - radio_station_url:string { "Sitio web de la estación de radio" } - buy_cd_url:string { "Sitio web para comprar CD" } - isrc_number:string { "número ISRC" } - catalog_number:string { "número de catálogo" } - original_artist:string { "Artista original" } - copyright:string { "Derechos Reservados" } - report_date_time:string { "Report date/time" } - report_location:string { "Report location" } - report_organizations:string { "Report organizations" } - subject:string { "Subject" } - } - - keyboardShortcuts:table - { - playAudio:string { "Play" } - pauseAudio:string { "Pause" } - stopAudio:string { "Stop" } - nextTrack:string { "Next track" } - fadeOut:string { "Fade out" } - moveItemUp:string { "Move item up" } - moveItemDown:string { "Move item down" } - removeItem:string { "Remove item" } - } -} diff --git a/src/products/gLiveSupport/var/fr.txt b/src/products/gLiveSupport/var/fr.txt deleted file mode 100644 index 9e3cb61ee..000000000 --- a/src/products/gLiveSupport/var/fr.txt +++ /dev/null @@ -1,467 +0,0 @@ -fr:table -{ - cancelButtonLabel:string { "Annuler" } - noButtonLabel:string { "Non" } - yesButtonLabel:string { "Oui" } - okButtonLabel:string { "OK" } - - localeNotAvailableMsg:string { "Locale {0} n'est pas disponible." } - schedulerNotReachableMsg:string { "Le serveur de programmation est inaccessible." } - storageNotReachableMsg:string { "Le serveur de stockage est inaccessible." } - authenticationNotReachableMsg:string - { "Le serveur d'authentification est " - "inaccessible.\n" - "Voulez vous éditer les paramètres " - "du serveur?" } - audioErrorMsg { "Erreur Lecteur Audio: " } - - masterPanelWindow:table - { - windowTitle:string { "Fenêtre Principale" } - - notLoggedInMsg:string { "Pas connecté" } - loggedInMsg:string { "Utilisateur: {0}" } - loginButtonLabel:string { "Connexion" } - logoutButtonLabel:string { "Déconnexion" } - liveModeButtonLabel:string { "Mode Live" } - uploadFileButtonLabel:string { "Transfert" } - scratchpadButtonLabel:string { "Console" } - playlistButtonLabel:string { "Sélection" } - schedulerButtonLabel:string { "Planificateur" } - searchButtonLabel:string { "Recherche" } - optionsButtonLabel:string { "Options" } - - elapsedTimeLabel:string { "écoulé" } - remainingTimeLabel:string { "restant" } - - sureToExitMsg:string { "Etes vous sûr de vouloir quitter?" } - } - - loginWindow:table - { - windowTitle:string { "Connexion" } - - userNameLabel:string { "Nom d'utilisateur" } - passwordLabel:string { "Mot de passe" } - languageLabel:string { "Langue" } - - pleaseWaitMsg:string { "Connexion en cours, veuillez patienter." } - } - - audioClipListWindow:table - { - windowTitle:string { "Liste des Clips Audio" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "durée" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "jeton" } - - closeButtonLabel:string { "Fermer" } - } - - scratchpadWindow:table - { - windowTitle:string { "Console de mixage" } - - creatorColumnLabel:string { "Auteur" } - titleColumnLabel:string { "Titre" } - addToPlaylistButtonLabel:string { "Ajouter à la sélection" } - clearListButtonLabel:string { "Effacer la liste" } - removeButtonLabel:string { "Supprimer" } - - cueMenuItem:string { "Ape_rçu" } - addToLiveModeMenuItem:string { "Ajouter au _Mode Live " } - addToPlaylistMenuItem:string { "_Ajouter à la sélection" } - removeMenuItem:string { "_Supprimer" } - editPlaylistMenuItem:string { "_Editer la sélection" } - schedulePlaylistMenuItem:string { "_Programmer la sélection" } - exportPlaylistMenuItem:string { "E_xporter la sélection" } - uploadToHubMenuItem:string { "Transférer vers le Network Hub" } - - cannotEditPlaylistMsg:string - { "Ne peut ouvrir la sélection pour modification." } - } - - playlistListWindow:table - { - windowTitle:string { "Sélection" } - - listBoxLabel { "Sélections" } - detailBoxLabel { "Détails" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "durée" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "jeton" } - - closeButtonLabel:string { "Fermer" } - } - - uploadFileWindow:table - { - windowTitle:string { "Transfert de fichiers" } - - chooseFileLabel:string { "Nom de fichier" } - chooseFileButtonLabel:string { "Parcourir" } - - mainSectionLabel:string { "Principal" } - musicSectionLabel:string { "Musique" } - voiceSectionLabel:string { "Voix" } - - lengthLabel:string { "Durée" } - - uploadButtonLabel:string { "Transfert" } - closeButtonLabel:string { "Annuler" } - - fileChooserDialogTitle:string { "Ouvrir Fichier" } - fileUploadedMsg:string { "''{0}'' transféré." } - couldNotOpenFileMsg:string { "Le fichier ne peut être ouvert." } - couldNotReadLengthMsg:string { "Ne peut déterminer la durée du" - "clip audio." } - unsupportedFileTypeMsg:string { "Type de fichier non pris en charge." } - missingTitleMsg:string { "Veuillez entrer un titre." } - badMetadataMsg:string { "Métadonnées invalides pour {0}." } - duplicateFileMsg:string { "Erreur: le fichier a déjà été " - "stocké." } - } - - playlistWindow:table - { - windowTitle:string { "Editer la sélection" } - - startColumnLabel:string { "Lire" } - titleColumnLabel:string { "Titre" } - lengthColumnLabel:string { "durée" } - fadeInColumnLabel:string { "Fade in" } - fadeOutColumnLabel:string { "Fade out" } - - nameLabel:string { "Nom" } - lengthLabel:string { "Durée:" } - saveButtonLabel:string { "Enregistrer" } - closeButtonLabel:string { "Fermer" } - lockFadesCheckButtonLabel:string - { "Verrouiller la fin sur le début en fondu (non stop)" } - - upMenuItem:string { "_Haut" } - downMenuItem:string { "_Bas" } - removeMenuItem:string { "_Supprimer" } - - playlistSavedMsg:string { "Enregistrer la sélection ''{0}''." } - savePlaylistDialogMsg:string { "Voulez-vous enregistrer la sélection?" } - closeWithoutSavingButtonLabel:string - { "Fermer sans sauvergarder" } - emptyTitleErrorMsg:string { "Veuillez entrer un titre." } - } - - schedulerWindow:table - { - windowTitle:string { "Planificateur" } - - scheduleTab:string { "Programme" } - statusTab:string { "Etat" } - - startColumnLabel:string { "Lire" } - titleColumnLabel:string { "titre" } - endColumnLabel:string { "fin" } - deleteMenuItem:string { "_Supprimer" } - - stopCurrentlyPlayingButtonLabel:string { "Arrêter" } - stopCurrentlyPlayingText:string { "la lecture en cours" - "dans le planificateur." } - stopCurrentlyPlayingDialogMsg:string { "En êtes vous sûr?" } - - closeButtonLabel:string { "Fermer" } - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Programmer la sélection" } - - hourLabel:string { "heure: " } - minuteLabel:string { "minute: " } - secondLabel:string { "secondes: " } - scheduleButtonLabel:string { "programmer" } - closeButtonLabel:string { "Fermer" } - } - - searchWindow:table - { - windowTitle:string { "Recherche/Parcourir" } - - searchWhereLabel:string { "Rechercher ou parcourir: " } - searchWhereLocal:string { "archive locale" } - searchWhereRemote:string { "archive distante" } - - simpleSearchTab:string { "Recherche" } - advancedSearchTab:string { "Recherche Avancée" } - browseTab:string { "Parcourir" } - transportsTab:string { "Transfers" } - - searchButtonLabel:string { "Recherche" } - backwardButtonLabel:string { "⇦ Précédent" } - forwardButtonLabel:string { "Suivant ⇨" } - searchResultsCountLabel:string { "{0}-{1} of {2} résultats" } - - typeColumnLabel:string { "Type" } - titleColumnLabel:string { "Titre" } - creatorColumnLabel:string { "Auteur" } - sourceColumnLabel:string { "Album" } - lengthColumnLabel:string { "Durée" } - - allStringForBrowse { "--- tout ---" } - - addToScratchpadMenuItem:string { "Ajouter à la _Console de Mixage" } - addToPlaylistMenuItem:string { "_Ajouter à la sélection" } - addToLiveModeMenuItem:string { "Ajouter au Mode _Live " } - editPlaylistMenuItem:string { "_Editer la sélection" } - schedulePlaylistMenuItem:string { "_Programmer la sélection" } - exportPlaylistMenuItem:string { "E_xporter la sélection" } - uploadToHubMenuItem:string { "Transférer vers l'archive distante" } - downloadFromHubMenuItem:string { "Télécharger à partir de l'archive distante" } - - pleaseWaitMsg:string { "Veuillez patienter..." } - shortErrorMsg:string { "Echec de la recherche." } - longErrorMsg:string { "Echec de la recherche: {0}." } - uploadToHubErrorMsg:string { "Echec du transfert vers l'archive distante: {0}." } - downloadFromHubErrorMsg:string { "Echec du téléchargement à partir de l'archive distante: {0}." } - nothingFoundMsg:string { "Fichiers introuvables." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "Types de fichier" } - allFileType:string { "tout" } - audioClipFileType:string { "clips audio" } - playlistFileType:string { "sélections" } - - searchByTextLabel:string { "Recherche par" } - - partialOperatorDisplay:string { "contient" } - prefixOperatorDisplay:string { "commence par" } - =OperatorDisplay:string { "égal" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Mode Live" } - - playMenuItem:string { "_Lire" } - cueMenuItem:string { "Ape_rçu" } - addToPlaylistMenuItem:string { "_Ajouter à la sélection" } - removeMenuItem:string { "_Supprimer" } - editPlaylistMenuItem:string { "_Editer la sélection" } - schedulePlaylistMenuItem:string { "_Programmer la sélection" } - exportPlaylistMenuItem:string { "E_xporter la sélection" } - uploadToHubMenuItem:string { "Transférer vers l'\archive distante" } - - cuePlayerLabel:string { "Aperçu" } - autoPlayNextLabel:string { "Lire automatiquement le morceau suivant" } - - clearListButtonLabel:string { "Effacer la liste" } - removeButtonLabel:string { "Supprimer" } - - cannotEditPlaylistMsg:string - { "Ne peut ouvrir la sélection pour modification." } - } - - optionsWindow:table - { - windowTitle:string { "Options" } - - needToRestartMsg:string { "Vous devez redémarrer " - "l'application\npour que les nouveaux paramètres " - "soient effectifs." } - errorMsg:string { "Ne peut sauvegarder les options: " } - - soundSectionLabel:string { "Son" } - keyBindingsSectionLabel:string { "Raccourcis clavier" } - serversSectionLabel:string { "Serveurs" } - schedulerSectionLabel:string { "Planificateur" } - backupSectionLabel:string { "Sauvegarde" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "A propos" } - - cancelButtonLabel:string { "Annuler" } - applyButtonLabel:string { "Appliquer" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Périphérique audio 'Cue':" } - outputDeviceLabel:string { "Périphérique audio Mode Live:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Appuyer sur une touche..." } - keyBindingsInstructionsText:string - { "Double-cliquer le raccourci que vous voulez " - "modifier, \n" - "puis appuyer sur la touche du nouveau " - "raccourci\n" - "(ou appuyer la touche Echap pour annuler " - "l'opération)." } - - authenticationLabel:string { "Serveur d'authentification" } - storageLabel:string { "Serveur de stockage" } - schedulerLabel:string { "Serveur de programmation" } - serverLabel:string { "adresse:" } - portLabel:string { "port:" } - pathLabel:string { "chemin:" } - - schedulerStatusText:string { "Le Planificateur est" } - schedulerRunningStatus:string { "en cours d'exécution." } - schedulerStoppedStatus:string { "arrêter." } - schedulerStartButtonLabel:string { "Démarrer" } - schedulerStopButtonLabel:string { "Arrêter" } - - reportBugsToText:string { "Rapporter les bugs à: {0}" } - creditsText:import { "../../../../CREDITS" } - } - - backupView:table - { - workingStatus:string { "En cours..." } - successStatus:string { "Prêt" } - faultStatus:string { "Erreur: {0}" } - - titleColumnLabel:string { "Titre" } - dateColumnLabel:string { "Date" } - statusColumnLabel:string { "Etat" } - - mtimeTextLabel:string { "Modifié depuis:" } - chooseTimeButtonLabel:string { "Choisir le moment" } - resetTimeButtonLabel:string { "Réinitialiser" } - - backupButtonLabel:string { "Sauvegarde" } - deleteButtonLabel:string { "Supprimer" } - saveButtonLabel:string { "Enregistrer" } - - backupTitleLabel:string { "Titre:" } - defaultBackupTitle:string { "nouvelle sauvegarde" } - - fileChooserDialogTitle:string { "Enregister le fichier" } - backupErrorMsg:string { "Erreur de sauvegarde: " } - } - - rdsView:table - { - deviceLabel:string { "Port série:" } - PSrdsLabel:string { "Nom de la station:" } - PIrdsLabel:string { "Code de la station:" } - RTrdsLabel:string { "Infos clip:" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Choisir la date et l'heure" } - - cancelButtonLabel:string { "Annuler" } - okButtonLabel:string { "OK" } - - hourLabel:string { "heure:" } - minuteLabel:string { "minute:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Exporter la sélection" } - - playlistTitleLabel:string { "Titre:" } - formatLabel:string { "Exporter sous:" } - - cancelButtonLabel:string { "Annuler" } - saveButtonLabel:string { "Enregistrer" } - - internalFormatName:string { "Archive Campcaster " } - smilFormatName:string { "tar contenant du SMIL" } - - fileChooserDialogTitle:string { "Enregistrer le Fichier" } - - createExportErrorMsg:string { "Ne peut exporter la sélection:" } - saveExportErrorMsg:string { "Ne peut enregistrer la sélection exportée." } - } - - transportList:table - { - workingStatus:string { "En cours..." } - successStatus:string { "Prêt" } - faultStatus:string { "Erreur: {0}" } - - titleColumnLabel:string { "Titre" } - dateColumnLabel:string { "Date" } - statusColumnLabel:string { "Etat" } - - cancelUploadMenuItem:string { "Annuler le transfert" } - cancelDownloadMenuItem:string { "Annuler le télechargement" } - - cannotCancelTransportMsg:string { "Echec de l'annulation: {0}." } - duplicateFileMsg:string { "le fichier existe déjà sur " - "l'archive distante." } - } - - restoreBackupWindow:table - { - windowTitle:string { "Restaurer la sauvegarde" } - errorMessage:string { "Erreur: {0}" } - pendingMessage:string { "Transfert du fichier de sauvegarde\n''{0}''.\n" - "Veuillez patienter..." } - finishedMessage:string { "Transfert terminé." } - } - - metadataTypes:table - { - title:string { "Titre" } - creator:string { "Auteur" } - album:string { "Album" } - year:string { "Année" } - genre:string { "Genre" } - description:string { "Description" } - format:string { "Format" } - length:string { "Durée" } - bpm:string { "BPM" } - rating:string { "Classement" } - encoded_by:string { "Encodé par" } - track_number:string { "Numéro de piste" } - disc_number:string { "Numéro de disque" } - mood:string { "Mode" } - publishing_label:string { "Etiquette de publication" } - composer:string { "Compositeur" } - bitrate:string { "Vitesse de transmission" } - channels:string { "Canaux" } - sample_rate:string { "Jeu de classement" } - encoding_software:string { "Logiciel d'encodage" } - checksum:string { "Checksum" } - lyrics:string { "Paroles" } - orchestra_or_band:string { "Orchestre ou groupe" } - conductor:string { "Chef d'orchestre" } - lyricist:string { "Paroles" } - original_lyricist:string { "Paroles originales" } - radio_station_name:string { "Nom de la station radio" } - audio_file_info_url:string { "Page web du fichier audio" } - artist_url:string { "Page web de l'artiste" } - audio_source_url:string { "Page web de la source audio" } - radio_station_url:string { "Page web de la station radio" } - buy_cd_url:string { "Page web pour acheter le CD" } - isrc_number:string { "Numéro ISRC" } - catalog_number:string { "Numéro Catalogue" } - original_artist:string { "Artiste original" } - copyright:string { "Copyright" } - report_date_time:string { "Date/heure du rapport" } - report_location:string { "Emplacement du rapport" } - report_organizations:string { "Organisations" } - subject:string { "Sujet" } - } - - keyboardShortcuts:table - { - playAudio:string { "Lire" } - pauseAudio:string { "Suspendre" } - stopAudio:string { "Arrêt" } - nextTrack:string { "Piste suivante" } - fadeOut:string { "Terminer en fondu" } - moveItemUp:string { "Haut" } - moveItemDown:string { "Bas" } - removeItem:string { "Supprimer" } - } -} - diff --git a/src/products/gLiveSupport/var/glade/DateTimeChooserWindow.glade b/src/products/gLiveSupport/var/glade/DateTimeChooserWindow.glade deleted file mode 100644 index 4aa435e42..000000000 --- a/src/products/gLiveSupport/var/glade/DateTimeChooserWindow.glade +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GTK_WIN_POS_CENTER_ON_PARENT - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - hours: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 0 23 1 10 0 - - - False - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - minutes: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 0 59 1 10 0 - - - False - False - 1 - - - - - False - False - 1 - - - - - False - False - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-ok - True - -5 - - - False - False - - - - - False - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/ExportPlaylistWindow.glade b/src/products/gLiveSupport/var/glade/ExportPlaylistWindow.glade deleted file mode 100644 index fec84e5f0..000000000 --- a/src/products/gLiveSupport/var/glade/ExportPlaylistWindow.glade +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GTK_WIN_POS_CENTER_ON_PARENT - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - title: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - my playlist - - - False - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - export as: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - internal format - True - True - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - SMIL format - True - internalFormatRadioButton1 - - - False - False - 1 - - - - - False - 1 - - - - - False - False - 1 - - - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-cancel - True - -6 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-save - True - -10 - - - 1 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/GLiveSupport.glade b/src/products/gLiveSupport/var/glade/GLiveSupport.glade deleted file mode 100644 index 2c0617068..000000000 --- a/src/products/gLiveSupport/var/glade/GLiveSupport.glade +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - False - True - GTK_WIN_POS_CENTER_ALWAYS - . - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 6 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - gtk-dialog-warning - 6 - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - are you sure? - True - True - True - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-no - True - -9 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-yes - True - -8 - - - 1 - - - - - False - GTK_PACK_END - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - False - True - GTK_WIN_POS_CENTER_ALWAYS - . - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 6 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - gtk-dialog-warning - 6 - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - some error occurred! - True - True - True - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-ok - True - -5 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/LiveModeWindow.glade b/src/products/gLiveSupport/var/glade/LiveModeWindow.glade deleted file mode 100644 index f919a89b3..000000000 --- a/src/products/gLiveSupport/var/glade/LiveModeWindow.glade +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - 400 - 500 - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 80 - 80 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-play - True - False - GTK_POS_TOP - - - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - preview - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - True - - - 80 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-play - True - - - - - 80 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-stop - True - - - 1 - - - - - False - 1 - - - - - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - play next item automatically - True - - - - - False - False - 1 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - True - True - 1 - - - - - 2 - - - - - - diff --git a/src/products/gLiveSupport/var/glade/LoginWindow.glade b/src/products/gLiveSupport/var/glade/LoginWindow.glade deleted file mode 100644 index 766f6b7c3..000000000 --- a/src/products/gLiveSupport/var/glade/LoginWindow.glade +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - False - True - GTK_WIN_POS_CENTER_ALWAYS - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - user name - - - False - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - password - - - False - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - language - - - False - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - 1 - - - - - 2 - - - - - False - 50 - - - - - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - statusBar - - - - - False - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-cancel - True - -6 - - - - - True - True - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-ok - True - -5 - - - 1 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/MasterPanelWindow.glade b/src/products/gLiveSupport/var/glade/MasterPanelWindow.glade deleted file mode 100644 index c95d87e0c..000000000 --- a/src/products/gLiveSupport/var/glade/MasterPanelWindow.glade +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - Campcaster Studio - masterPanelWindow - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - GTK_SHADOW_IN - - - 160 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - time - - - - - - label_item - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - 80 - True - False - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-play - True - GTK_POS_TOP - - - False - False - - - - - 80 - True - False - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-stop - True - GTK_POS_TOP - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - GTK_SHADOW_IN - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - 3 - title - PANGO_ELLIPSIZE_END - True - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - creator - PANGO_ELLIPSIZE_END - True - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 322 - 8 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - False - False - - - - - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 10 - - - 200 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - elapsed: - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - elapsed time - - - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - remains: - - - False - False - 5 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - remaining time - - - - - False - False - 5 - - - - - 1 - - - - - False - False - 1 - - - - - 3 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - playlist - PANGO_ELLIPSIZE_MIDDLE - True - - - 4 - - - - - - - - label_item - - - - - 2 - - - - - 1 - - - - - 120 - 104 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-missing-image - - - False - False - 2 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - live mode - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - upload file - - - 1 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - scratchpad - - - 2 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - playlist - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - scheduler - - - 4 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - search - - - 5 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - options - - - 6 - - - - - False - False - 5 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 1 - 5 - user logged in - GTK_JUSTIFY_RIGHT - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - log in - - - False - False - 1 - - - - - 1 - - - - - False - False - 1 - - - - - - diff --git a/src/products/gLiveSupport/var/glade/OptionsWindow.glade b/src/products/gLiveSupport/var/glade/OptionsWindow.glade deleted file mode 100644 index 63bcb6cc9..000000000 --- a/src/products/gLiveSupport/var/glade/OptionsWindow.glade +++ /dev/null @@ -1,1645 +0,0 @@ - - - - - - 710 - 575 - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GDK_WINDOW_TYPE_HINT_NORMAL - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 200 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - cue device: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 100 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - test - - - False - 2 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 200 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - output device: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 100 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - test - - - False - 2 - - - - - False - False - 1 - - - - - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - sound - - - tab - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - click on the shortcut you want to change, -and then do some other stuff - GTK_JUSTIFY_CENTER - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - False - - - 1 - - - - - - - - - 1 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - keyboard shortcuts - - - tab - 1 - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - authentication server - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - location: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - port: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - path: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 2 - - - - - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - storage server - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - location: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - port: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - path: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 2 - - - - - 1 - - - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - scheduler server - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - location: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - port: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 100 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - path: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - 2 - - - - - 1 - - - - - False - False - 2 - - - - - - - - - 2 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - servers - - - tab - 2 - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 16 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 7 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - the scheduler is - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - running - - - False - False - 1 - - - - - False - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_SPREAD - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - start - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - stop - - - 1 - - - - - False - False - 1 - - - - - 3 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - scheduler - - - tab - 3 - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - GTK_SHADOW_NONE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - title: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - modified since: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - 20 - False - 0.5 - - - 1 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - choose time - - - 2 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - reset - - - 3 - - - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - file type: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-add - True - - - False - False - 4 - - - - - False - False - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 1 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 2 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 3 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 4 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 100 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - backup - - - False - False - GTK_PACK_END - - - - - False - False - 2 - - - - - 2 - - - - - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - False - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-save - True - - - 1 - - - - - False - False - 1 - - - - - 1 - - - - - 4 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - backup - - - tab - 4 - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - serial port: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - station name (PS): - True - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - station ID (PI): - True - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - clip info (RT): - True - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 3 - - - - - 5 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - rds - - - tab - 5 - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Credits: - - XY - ZW - - -Report bugs to: - - someone@somewhere.com - - - 50 - - - - - - - - - - - 6 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - about - - - tab - 6 - False - False - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-apply - True - -10 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-cancel - True - -6 - - - 1 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-ok - True - -5 - - - 2 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/PlaylistWindow.glade b/src/products/gLiveSupport/var/glade/PlaylistWindow.glade deleted file mode 100644 index 78d996e0f..000000000 --- a/src/products/gLiveSupport/var/glade/PlaylistWindow.glade +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - 300 - 400 - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GDK_WINDOW_TYPE_HINT_NORMAL - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - name: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Duration: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 00:00:00 - - - False - False - 1 - - - - - False - False - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - lock fade-out to following fade-in - True - True - - - False - False - 3 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - status bar - - - False - False - 4 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-close - True - -7 - - - - - True - False - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-save - True - -10 - - - 1 - - - - - False - GTK_PACK_END - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - False - True - GTK_WIN_POS_CENTER_ALWAYS - . - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 6 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - gtk-dialog-warning - 6 - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - are you sure? - True - True - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - close without saving - -9 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-cancel - True - -6 - - - 1 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-save - True - -8 - - - 2 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/RestoreBackupWindow.glade b/src/products/gLiveSupport/var/glade/RestoreBackupWindow.glade deleted file mode 100644 index d07df13d0..000000000 --- a/src/products/gLiveSupport/var/glade/RestoreBackupWindow.glade +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GTK_WIN_POS_CENTER_ALWAYS - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - uploading backup file -please wait... - GTK_JUSTIFY_CENTER - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-cancel - True - -6 - - - - - True - False - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-ok - True - -5 - - - 1 - - - - - False - False - 1 - - - - - - diff --git a/src/products/gLiveSupport/var/glade/SchedulePlaylistWindow.glade b/src/products/gLiveSupport/var/glade/SchedulePlaylistWindow.glade deleted file mode 100644 index c8b3629ac..000000000 --- a/src/products/gLiveSupport/var/glade/SchedulePlaylistWindow.glade +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GTK_WIN_POS_CENTER_ON_PARENT - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - my playlist - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - hours: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 0 23 1 10 0 - - - False - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - minutes: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 0 59 1 10 0 - - - False - False - 1 - - - - - False - False - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - seconds: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 0 59 1 10 0 - - - False - False - 1 - - - - - False - False - 2 - - - - - False - False - 2 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - schedule - -10 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/SchedulerWindow.glade b/src/products/gLiveSupport/var/glade/SchedulerWindow.glade deleted file mode 100644 index c20b38c0d..000000000 --- a/src/products/gLiveSupport/var/glade/SchedulerWindow.glade +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - 350 - 400 - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GDK_WINDOW_TYPE_HINT_NORMAL - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 3 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2007 - 6 - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 1 Jan 2007 - - - False - False - 1 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - - - 2 - - - - - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - schedule - - - tab - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-stop - True - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - currently playing item in scheduler - - - False - False - 1 - - - - - False - False - - - - - 1 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - status - - - tab - 1 - False - False - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-close - True - -7 - - - - - False - GTK_PACK_END - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - False - True - GTK_WIN_POS_CENTER_ALWAYS - . - GDK_WINDOW_TYPE_HINT_DIALOG - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 6 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - gtk-dialog-warning - 6 - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - are you sure? - True - True - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-no - True - -9 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-yes - True - -8 - - - 1 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/glade/ScratchpadWindow.glade b/src/products/gLiveSupport/var/glade/ScratchpadWindow.glade deleted file mode 100644 index a708dd5eb..000000000 --- a/src/products/gLiveSupport/var/glade/ScratchpadWindow.glade +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - True - - - 80 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-play - True - - - False - False - - - - - 80 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-media-stop - True - - - False - False - 1 - - - - - False - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - 350 - 350 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - True - True - 2 - False - - - - - - - 1 - - - - - - diff --git a/src/products/gLiveSupport/var/glade/SearchWindow.glade b/src/products/gLiveSupport/var/glade/SearchWindow.glade deleted file mode 100644 index dcacb7d56..000000000 --- a/src/products/gLiveSupport/var/glade/SearchWindow.glade +++ /dev/null @@ -1,855 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - 766 - 231 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - search or browse on: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - 0 - 0.5 - 0 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - 100 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - search - - - False - False - 1 - - - - - - - False - False - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - search - - - tab - False - False - - - - - 280 - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - file type: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - 1 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-add - True - - - False - False - 4 - - - - - False - False - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 1 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 2 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 3 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 80 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - search by: - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 2 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 3 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-remove - True - - - False - False - 4 - - - - - False - False - 4 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 100 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - search - - - False - False - GTK_PACK_END - - - - - False - False - 2 - - - - - - - - - 1 - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - advanced search - - - tab - 1 - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - True - False - - - - - 1 - - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - True - False - - - - - 1 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - True - False - - - - - 1 - - - - - 2 - - - - - 2 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - browse - - - tab - 2 - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - True - False - False - - - 3 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - transports - - - tab - 3 - False - False - - - - - - - 1 - - - - - False - - - - - 766 - 343 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 1 - 25 of 32 results - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_START - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-go-back - True - - - False - False - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-go-forward - True - GTK_POS_RIGHT - - - False - False - 1 - - - - - 1 - - - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - True - - - - - 1 - - - - - 1 - - - - - - diff --git a/src/products/gLiveSupport/var/glade/UploadFileWindow.glade b/src/products/gLiveSupport/var/glade/UploadFileWindow.glade deleted file mode 100644 index 627e74300..000000000 --- a/src/products/gLiveSupport/var/glade/UploadFileWindow.glade +++ /dev/null @@ -1,1697 +0,0 @@ - - - - - - 380 - 500 - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - GDK_WINDOW_TYPE_HINT_NORMAL - False - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - file name: - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - browse - - - False - 2 - - - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - GTK_SHADOW_NONE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 8 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 1 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 2 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 3 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 4 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 5 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 6 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 7 - - - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - duration - - - False - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - 00:00:00 - - - 1 - - - - - False - False - 1 - - - - - - - - - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - main - - - tab - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - GTK_SHADOW_NONE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 3 - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 1 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 2 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 3 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 4 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 5 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 6 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 7 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 8 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 9 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 10 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 11 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 12 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 13 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 14 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 15 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 16 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 17 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 18 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 19 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 20 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 21 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 22 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 23 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 24 - - - - - - - - - 1 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - music - - - tab - 1 - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_RESIZE_QUEUE - GTK_SHADOW_NONE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 3 - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 1 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 2 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 3 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 4 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 5 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 6 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - - - 150 - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - metadata - - - False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - - - - - False - False - 7 - - - - - - - - - 2 - False - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - voice - - - tab - 2 - False - False - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - status bar - - - False - False - 2 - - - - - 1 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_BUTTONBOX_END - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-cancel - True - -6 - - - - - True - True - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-apply - True - -10 - - - 1 - - - - - False - GTK_PACK_END - - - - - - diff --git a/src/products/gLiveSupport/var/hu.txt b/src/products/gLiveSupport/var/hu.txt deleted file mode 100644 index eb54d2a28..000000000 --- a/src/products/gLiveSupport/var/hu.txt +++ /dev/null @@ -1,464 +0,0 @@ -hu:table -{ - cancelButtonLabel:string { "Mégsem" } - noButtonLabel:string { "Nem" } - yesButtonLabel:string { "Igen" } - okButtonLabel:string { "OK" } - - localeNotAvailableMsg:string { "A {0} nyelv nem elérhető" } - schedulerNotReachableMsg:string { "Az időzítő szerver nem elérhető" } - storageNotReachableMsg:string { "A tároló szerver nem elérhető" } - authenticationNotReachableMsg:string - { "A beléptető szerver nem elérhető.\n" - "Szerver beállítások szerkesztése?" } - audioErrorMsg { "Hiba történt a lejátszáskor: " } - - masterPanelWindow:table - { - windowTitle:string { "Fő Panel" } - - notLoggedInMsg:string { "Nincs bejelentkezve" } - loggedInMsg:string { "Bejelentkezve: {0}" } - loginButtonLabel:string { "Log in" } - logoutButtonLabel:string { "Log out" } - liveModeButtonLabel:string { "Élő adás" } - uploadFileButtonLabel:string { "Filefeltöltés" } - scratchpadButtonLabel:string { "Scratchpad" } - playlistButtonLabel:string { "Műsorkezelés" } - schedulerButtonLabel:string { "Időzítő" } - searchButtonLabel:string { "Keresés" } - optionsButtonLabel:string { "Beállítások" } - - elapsedTimeLabel:string { "eltelt" } - remainingTimeLabel:string { "hátralevő" } - - sureToExitMsg:string { "Biztos, hogy ki szeretne lépni?" } - } - - loginWindow:table - { - windowTitle:string { "Belépés" } - - userNameLabel:string { "Azonosító" } - passwordLabel:string { "Jelszó" } - languageLabel:string { "Nyelv" } - - pleaseWaitMsg:string { "Kérem, várjon..." } - } - - audioClipListWindow:table - { - windowTitle:string { "Hanganyag" } - - idColumnLabel:string { "azonosító" } - lengthColumnLabel:string { "hossz" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "token" } - - closeButtonLabel:string { "bezár" } - } - - scratchpadWindow:table - { - windowTitle:string { "Scratchpad" } - - creatorColumnLabel:string { "Előadó" } - titleColumnLabel:string { "Cím" } - addToPlaylistButtonLabel:string { "Műsorhoz hozzáadni" } - clearListButtonLabel:string { "Lista törlése" } - removeButtonLabel:string { "Kiválasztottak törlése" } - - cueMenuItem:string { "_Belehallgatni" } - addToLiveModeMenuItem:string { "Élő _adásba" } - addToPlaylistMenuItem:string { "Műsorhoz _hozzáadni" } - removeMenuItem:string { "_Törölni" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Műsor időzítése" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - playlistListWindow:table - { - windowTitle:string { "Műsorszerkesztő" } - - listBoxLabel { "Műsorok" } - detailBoxLabel { "Műsor adatai" } - - idColumnLabel:string { "azonosító" } - lengthColumnLabel:string { "hossz" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "token" } - - closeButtonLabel:string { "Bezár" } - } - - uploadFileWindow:table - { - windowTitle:string { "Filefeltöltés" } - - chooseFileLabel:string { "Filenév" } - chooseFileButtonLabel:string { "Tallóz" } - - mainSectionLabel:string { "Általános" } - musicSectionLabel:string { "Music" } - voiceSectionLabel:string { "Voice" } - - lengthLabel:string { "Hossz" } - - uploadButtonLabel:string { "feltölt" } - closeButtonLabel:string { "bezár" } - - fileChooserDialogTitle:string { "File Kiválasztása" } - fileUploadedMsg:string { "A ''{0}'' file feltöltve." } - couldNotOpenFileMsg:string { "A fájl nem olvasható." } - couldNotReadLengthMsg:string { "#Could not determine audio clip " - "length.#" } - unsupportedFileTypeMsg:string { "#Unsupported file type.#" } - missingTitleMsg:string { "Kérem, adjon meg egy címet." } - badMetadataMsg:string { "#Invalid data for {0}.#" } - duplicateFileMsg:string { "#Error: the file is in the storage " - "already.#" } - } - - playlistWindow:table - { - windowTitle:string { "Műsorszerkesztő" } - - startColumnLabel:string { "kezdet" } - titleColumnLabel:string { "cím" } - lengthColumnLabel:string { "hossz" } - fadeInColumnLabel:string { "Fade in" } - fadeOutColumnLabel:string { "Fade out" } - - nameLabel:string { "név" } - lengthLabel:string { "Duration:" } - saveButtonLabel:string { "elment" } - closeButtonLabel:string { "bezár" } - lockFadesCheckButtonLabel:string - { "Lock fade-out to following fade-in" } - - upMenuItem:string { "Move _Up" } - downMenuItem:string { "Move D_own" } - removeMenuItem:string { "_Remove" } - - playlistSavedMessage:string { "a {0} műsor elmentve" } - savePlaylistDialogMsg:string { "El szeretné menteni a műsort?" } - closeWithoutSavingButtonLabel:string - { "Bezárás mentés nélkül" } - emptyTitleErrorMsg:string { "Kérem, adjon meg egy címet!" } - } - - schedulerWindow:table - { - windowTitle:string { "Időzítő" } - - scheduleTab:string { "Schedule" } - statusTab:string { "Status" } - - startColumnLabel:string { "kezdet" } - titleColumnLabel:string { "cím" } - endColumnLabel:string { "vég" } - deleteMenuItem:string { "_töröl" } - - stopCurrentlyPlayingButtonLabel:string { "Stop" } - stopCurrentlyPlayingText:string { "what is currently playing " - "in the scheduler." } - stopCurrentlyPlayingDialogMsg:string { "Are you sure?" } - - closeButtonLabel:string { "bezár" } - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Időzítő" } - - hourLabel:string { "óra: " } - minuteLabel:string { "perc: " } - secondLabel:string { "másodperc: " } - scheduleButtonLabel:string { "időzít" } - closeButtonLabel:string { "bezár" } - } - - searchWindow:table - { - windowTitle:string { "Keresés" } - - searchWhereLabel:string { "Search or browse on: " } - searchWhereLocal:string { "local storage" } - searchWhereRemote:string { "network hub" } - - simpleSearchTab:string { "Keresés" } - advancedSearchTab:string { "Összetett keresés" } - browseTab:string { "Böngészés" } - transportsTab:string { "Transfers" } - - searchButtonLabel:string { "Keress!" } - backwardButtonLabel:string { "⇦ Previous" } - forwardButtonLabel:string { "Next ⇨" } - searchResultsCountLabel:string { "{0}-{1} of {2} results" } - - typeColumnLabel:string { "Típus" } - titleColumnLabel:string { "Cím" } - creatorColumnLabel:string { "Előadó" } - sourceColumnLabel:string { "Album" } - lengthColumnLabel:string { "Hossz" } - - allStringForBrowse { "--- minden ---" } - - addToScratchpadMenuItem:string { "Scratchpadbe betenni" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - addToLiveModeMenuItem:string { "Élő _adásba" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to the network hub" } - downloadFromHubMenuItem:string { "Download from the network hub" } - - pleaseWaitMsg:string { "Please wait..." } - shortErrorMsg:string { "Search failed." } - longErrorMsg:string { "Search failed: {0}." } - uploadToHubErrorMsg:string { "Uploading to hub failed: {0}." } - downloadFromHubErrorMsg:string { "Downloading from hub failed: {0}." } - nothingFoundMsg:string { "No files found." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "File types" } - allFileType:string { "all" } - audioClipFileType:string { "audio clips" } - playlistFileType:string { "playlists" } - - searchByTextLabel:string { "Keresési feltétel:" } - - partialOperatorDisplay:string { "része" } - prefixOperatorDisplay:string { "kezdete" } - =OperatorDisplay:string { "=" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Élő adás" } - - playMenuItem:string { "Le_játszani" } - cueMenuItem:string { "_Belehallgatni" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - removeMenuItem:string { "_Eltávolítani" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cuePlayerLabel:string { "Belehallgatni" } - autoPlayNextLabel:string { "#Play the next item automatically#" } - - clearListButtonLabel:string { "Clear list" } - removeButtonLabel:string { "Remove item(s)" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - optionsWindow:table - { - windowTitle:string { "Options" } - - needToRestartMsg:string { "You will need to restart the " - "application\nfor the new settings " - "to take effect." } - errorMsg:string { "Could not save the options: " } - - soundSectionLabel:string { "Sound" } - keyBindingsSectionLabel:string { "Keyboard Shortcuts" } - serversSectionLabel:string { "Servers" } - schedulerSectionLabel:string { "Scheduler" } - backupSectionLabel:string { "Backup" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "About" } - - cancelButtonLabel:string { "Cancel" } - applyButtonLabel:string { "Apply" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Cue audio device:" } - outputDeviceLabel:string { "Live Mode audio device:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Press a key..." } - keyBindingsInstructionsText:string - { "Double-click on the shortcut you want " - "to change, \n" - "then press the key for the new " - "shortcut\n" - "(or press the Escape key to cancel " - "the operation)." } - - authenticationLabel:string { "Authentication server" } - storageLabel:string { "Storage server" } - schedulerLabel:string { "Scheduler server" } - serverLabel:string { "address:" } - portLabel:string { "port:" } - pathLabel:string { "path:" } - - schedulerStatusText:string { "The scheduler is" } - schedulerRunningStatus:string { "running." } - schedulerStoppedStatus:string { "stopped." } - schedulerStartButtonLabel:string { "Start" } - schedulerStopButtonLabel:string { "Stop" } - - reportBugsToText:string { "Report bugs to: {0}" } - } - - backupView:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - mtimeTextLabel:string { "#Modified since:#" } - chooseTimeButtonLabel:string { "#Choose time#" } - resetTimeButtonLabel:string { "#Reset#" } - - backupButtonLabel:string { "#Backup#" } - deleteButtonLabel:string { "#Delete#" } - saveButtonLabel:string { "#Save#" } - - backupTitleLabel:string { "#Title:#" } - defaultBackupTitle:string { "#new backup#" } - - fileChooserDialogTitle:string { "#Save File#" } - backupErrorMsg:string { "#Backup error: #" } - } - - rdsView:table - { - deviceLabel:string { "#Serial port:#" } - PSrdsLabel:string { "#Station name:#" } - PIrdsLabel:string { "#Station code:#" } - RTrdsLabel:string { "#Clip info:#" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Select the date and time" } - - cancelButtonLabel:string { "Cancel" } - okButtonLabel:string { "OK" } - - hourLabel:string { "hour:" } - minuteLabel:string { "minute:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Export Playlist" } - - playlistTitleLabel:string { "Title:" } - formatLabel:string { "Export as:" } - - cancelButtonLabel:string { "Cancel" } - saveButtonLabel:string { "Save" } - - internalFormatName:string { "Campcaster archive" } - smilFormatName:string { "tar containing a SMIL" } - - fileChooserDialogTitle:string { "Save File" } - - createExportErrorMsg:string { "Could not export the playlist:" } - saveExportErrorMsg:string { "Could not save the exported playlist." } - } - - transportList:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - cancelUploadMenuItem:string { "#Cancel upload#" } - cancelDownloadMenuItem:string { "#Cancel download#" } - - cannotCancelTransportMsg:string { "#Canceling failed: {0}.#" } - duplicateFileMsg:string { "#the file is in the network " - "hub already.#" } - } - - restoreBackupWindow:table - { - windowTitle:string { "Restore Backup" } - errorMessage:string { "Error: {0}" } - pendingMessage:string { "Uploading backup file\n''{0}''.\n" - "Please wait..." } - finishedMessage:string { "Upload finished." } - } - - metadataTypes:table - { - title:string { "Cím" } - creator:string { "Előadó" } - album:string { "Lemez" } - year:string { "Év" } - genre:string { "Műfaj" } - description:string { "Megjegyzés" } - format:string { "Típus" } - length:string { "Hossz" } - bpm:string { "Tempó (BPM)" } - rating:string { "Értékelés" } - encoded_by:string { "Rögzítő neve" } - track_number:string { "Hányadik szám" } - disc_number:string { "Hányadik lemez" } - mood:string { "Hangulat" } - publishing_label:string { "Kiadó" } - composer:string { "Zeneszerző" } - bitrate:string { "Bitek száma mp-ként" } - channels:string { "Csatornák száma" } - sample_rate:string { "Mintavételi gyakoriság" } - encoding_software:string { "Rögzítő szoftver" } - checksum:string { "Ellenőrző összeg" } - lyrics:string { "Dalszöveg" } - orchestra_or_band:string { "Zenekar vagy együttes" } - conductor:string { "Karmester" } - lyricist:string { "Szövegíró" } - original_lyricist:string { "Eredeti szövegíró" } - radio_station_name:string { "Rádióadó" } - audio_file_info_url:string { "Zeneszám honlapja" } - artist_url:string { "Előadó honlapja" } - audio_source_url:string { "Forrás honlapja" } - radio_station_url:string { "Rádióadó honlapja" } - buy_cd_url:string { "CD-bolt honlapja" } - isrc_number:string { "ISRC-szám" } - catalog_number:string { "Katalógusszám" } - original_artist:string { "Eredeti előadó" } - copyright:string { "Szerzői jog tulajdonosa" } - report_date_time:string { "Report date/time" } - report_location:string { "Report location" } - report_organizations:string { "Report organizations" } - subject:string { "Subject" } - } - - keyboardShortcuts:table - { - playAudio:string { "Play" } - pauseAudio:string { "Pause" } - stopAudio:string { "Stop" } - nextTrack:string { "Next track" } - fadeOut:string { "Fade out" } - moveItemUp:string { "Move item up" } - moveItemDown:string { "Move item down" } - removeItem:string { "Remove item" } - } -} - diff --git a/src/products/gLiveSupport/var/icon16.png b/src/products/gLiveSupport/var/icon16.png deleted file mode 100644 index 3738d50a6b2398679e9d45df091f86f3d7863110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)Q2@v9y?gKOa=9dzOMGN00000NkvXXu0mjf{umnr diff --git a/src/products/gLiveSupport/var/icon22.png b/src/products/gLiveSupport/var/icon22.png deleted file mode 100644 index e547be12fc157d74ba74a46b405eb940e30371ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmV;R17G}!P)1RCwC# zlu2k4VHC$_GBcT(%w(CQO)ShG+NuHTb7w*W-|MXO+;|1;-v?{clbVd@BM%8Mf&fj|6<&->BgtT*pE;v((#16) zL;6_{jyG=S3ZWt@-@Tul?x{5)5TGUnT4kjnUDZYb5JX`Mk~3Cls-f$kFc9x#KgV{~ z^+@f11h@DsYqRD}X*QvVAoRtqNm1?^sHsm4-56Z?Ow1%-FCj5i)AKO5Z3*Nc>L3X4 zaiPe;_z>H)zSmHH0k@S=du(3U7Ael37KZ4Pf#+gh+k6Z|DQgYxvM*E>je=oN)>2YP zh$U_=@8aI2b*+A94dEmjg(&+WKEgI`c&{Zg;0rzrijwF)+(FFch7)`0y4h!K3vdw6 zrnWi?rtQG9v!1G=8x1_DC$9f2E8n)snm%=#igfz+*jy0m$S>ZA7rv_Me2_sxk@jyWPj1LA0Ob>-dB z_;{P?zdrDK?Am?5zGx=qw448G^ZtLE{|5Mr00RKLjfb+4T~#Ik0000#Xj+v!U?_RZFg zZLQUccE+hN<7FHN@rIW=3Rs~MMG}J%2zQWVbKmS{vpoma4z|>4U)l$D=0Dk-b9T?~ zeBb{&doZ5o!GC#S695wc695Qc`%BnU4PF}?mro|?OXTS}vtuTwCyL}63BYi`2Rs}z z==25JTW-<)-4_CWPyHd5qyFiAUtQy$4q%m-$WxlkAI8sEu!PK>uEkW703gHwL}B#! zC;%dS^w;kJY{y+d{d)eFVM~35h@p@Ez%cZ`23RcuGDWg+i+cX@Eo9*W4ZuZ!8|ndU zUpvh_>{As+Ya2dRcBny*FWDEW^Oz)z~E#1n)po|MbgIAKgP z{$%EM0#fICNRuXs!7l#ld2-MVM>lzp-}@7G(aRA ziFjNCt_Q6xPM^E(tj{|L$E%^F3LF=g>N8E*g~c0ar)|)A^Xj{m9NRrEz{d3K%?Z;> zz8G$|9yxyV;<>(PGz^=On|qd#WQK0q%bV1NrSl~Esc}FmgT_N9gu&p^^YGs92K4>g zeph|Xu^wyF{wkL3f*q+)Dt#OoST=J(8Rs6z?Qd-=|CtW9JqEDeICYaY>$!6Korax9 z`#Ss4ilOc=mPqK#+=7oZCCfL*7_(!z;XV+0&`Jfn?So8!^72tGis1y0OX9@RWTTce znG?lIt%P=1!u=Pjc6K`LU!GzkkQQV>F{?B43}UaVIOwAeThO*)p9e&)-Y~yTLY+Knz$gbjhy%_~fuQ4d+i+dYzCf3K|DgaK6jqv!qO#DKgJsCbt-;=o z<9Imu)BZq!A8SHvrA&zt^7t}&+SGU2y6^9;cHT#!M&*QVf*VZP<&zh${Z6b@i#*mQ zi?^fIP7U=?kw}Ci<;ticNvD<>%(-!z#EgLbR*UD}t*v`(mO7LUp%PNFr7~)EOpIQ{ zhHLlw{o%)|pj@Sj=R}fqHlDwD%{3$wChkEL+Y0CG&=kzw_OSJ4bz|e@OD#UH%gytF zKkuFiA`vJ^(#M&nz496%78g;L>%05|y@w9Nj}=M>R2CHS(O>t0H)N#vbRak>%=3xD z}`Gk~sP`_YAUT8z+Q$mqYz9pIYm?^_t=547z{bQG- zR$!E%Jpt+=R1^UakLXYMM;3%iuvK_5h&LDN{I-Tj)s?#K-7J$J(02)wN5=WSp!cCl z(w%H;jwc*lxF}2x%SnJn(2g9(zJTrDYV%gbe9=hO@>92&x=m#p8Yri824j zI~v6b?Tvr4;wN1wT~;9~6KBE+fC+&AFTn2t3;?bZ5yteQ>qh_p002ovPDHLkV1kdV B9QgnM diff --git a/src/products/gLiveSupport/var/icon48.png b/src/products/gLiveSupport/var/icon48.png deleted file mode 100644 index 9b2bc0be1a604f041877420d4cfb5538b0ef8709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3078 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" } - } - - liveModeWindow:table - { - windowTitle:string { "Live Mode" } - - playMenuItem:string { "_Play" } - cueMenuItem:string { "_Cue" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - removeMenuItem:string { "_Verwijderen" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cuePlayerLabel:string { "Cue" } - autoPlayNextLabel:string { "#Play the next item automatically#" } - - clearListButtonLabel:string { "Clear list" } - removeButtonLabel:string { "Remove item(s)" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - optionsWindow:table - { - windowTitle:string { "Options" } - - needToRestartMsg:string { "You will need to restart the " - "application\nfor the new settings " - "to take effect." } - errorMsg:string { "Could not save the options: " } - - soundSectionLabel:string { "Sound" } - keyBindingsSectionLabel:string { "Keyboard Shortcuts" } - serversSectionLabel:string { "Servers" } - schedulerSectionLabel:string { "Scheduler" } - backupSectionLabel:string { "Backup" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "About" } - - cancelButtonLabel:string { "Cancel" } - applyButtonLabel:string { "Apply" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Cue audio device:" } - outputDeviceLabel:string { "Live Mode audio device:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Press a key..." } - keyBindingsInstructionsText:string - { "Double-click on the shortcut you want " - "to change, \n" - "then press the key for the new " - "shortcut\n" - "(or press the Escape key to cancel " - "the operation)." } - - authenticationLabel:string { "Authentication server" } - storageLabel:string { "Storage server" } - schedulerLabel:string { "Scheduler server" } - serverLabel:string { "address:" } - portLabel:string { "port:" } - pathLabel:string { "path:" } - - schedulerStatusText:string { "The scheduler is" } - schedulerRunningStatus:string { "running." } - schedulerStoppedStatus:string { "stopped." } - schedulerStartButtonLabel:string { "Start" } - schedulerStopButtonLabel:string { "Stop" } - - reportBugsToText:string { "Report bugs to: {0}" } - } - - backupView:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - mtimeTextLabel:string { "#Modified since:#" } - chooseTimeButtonLabel:string { "#Choose time#" } - resetTimeButtonLabel:string { "#Reset#" } - - backupButtonLabel:string { "#Backup#" } - deleteButtonLabel:string { "#Delete#" } - saveButtonLabel:string { "#Save#" } - - backupTitleLabel:string { "#Title:#" } - defaultBackupTitle:string { "#new backup#" } - - fileChooserDialogTitle:string { "#Save File#" } - backupErrorMsg:string { "#Backup error: #" } - } - - rdsView:table - { - deviceLabel:string { "#Serial port:#" } - PSrdsLabel:string { "#Station name:#" } - PIrdsLabel:string { "#Station code:#" } - RTrdsLabel:string { "#Clip info:#" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Select the date and time" } - - cancelButtonLabel:string { "Cancel" } - okButtonLabel:string { "OK" } - - hourLabel:string { "hour:" } - minuteLabel:string { "minute:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Export Playlist" } - - playlistTitleLabel:string { "Title:" } - formatLabel:string { "Export as:" } - - cancelButtonLabel:string { "Cancel" } - saveButtonLabel:string { "Save" } - - internalFormatName:string { "Campcaster archive" } - smilFormatName:string { "tar containing a SMIL" } - - fileChooserDialogTitle:string { "Save File" } - - createExportErrorMsg:string { "Could not export the playlist:" } - saveExportErrorMsg:string { "Could not save the exported playlist." } - } - - transportList:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - cancelUploadMenuItem:string { "#Cancel upload#" } - cancelDownloadMenuItem:string { "#Cancel download#" } - - cannotCancelTransportMsg:string { "#Canceling failed: {0}.#" } - duplicateFileMsg:string { "#the file is in the network " - "hub already.#" } - } - - restoreBackupWindow:table - { - windowTitle:string { "Restore Backup" } - errorMessage:string { "Error: {0}" } - pendingMessage:string { "Uploading backup file\n''{0}''.\n" - "Please wait..." } - finishedMessage:string { "Upload finished." } - } - - metadataTypes:table - { - title:string { "Titel" } - creator:string { "Maker" } - album:string { "Album" } - year:string { "Jaar" } - genre:string { "Genre" } - description:string { "Omschrijving" } - format:string { "Format" } - length:string { "Lengte" } - bpm:string { "BPM" } - rating:string { "Waardering" } - encoded_by:string { "Geencodeerd door" } - track_number:string { "Track nummer" } - disc_number:string { "Disk nummer" } - mood:string { "Stemming" } - publishing_label:string { "Platen label" } - composer:string { "Componist" } - bitrate:string { "Bitrate" } - channels:string { "Kanalen" } - sample_rate:string { "Sample rate" } - encoding_software:string { "Encoder software" } - checksum:string { "Controlegetal" } - lyrics:string { "Tekst schrijver" } - orchestra_or_band:string { "Orkest of band" } - conductor:string { "Dirigent" } - lyricist:string { "Schrijver" } - original_lyricist:string { "Originele schrijver" } - radio_station_name:string { "Naam van het station" } - audio_file_info_url:string { "Web pagina met audio informatie" } - artist_url:string { "Web pagina van artiest" } - audio_source_url:string { "Web pagina van de audio bron" } - radio_station_url:string { "Website van het station" } - buy_cd_url:string { "Online CD bestellen" } - isrc_number:string { "ISRC nummer" } - catalog_number:string { "Catalogus nummer" } - original_artist:string { "Originele artiest" } - copyright:string { "Copyright" } - report_date_time:string { "Report date/time" } - report_location:string { "Report location" } - report_organizations:string { "Report organizations" } - subject:string { "Subject" } - } - - keyboardShortcuts:table - { - playAudio:string { "Play" } - pauseAudio:string { "Pause" } - stopAudio:string { "Stop" } - nextTrack:string { "Next track" } - fadeOut:string { "Fade out" } - moveItemUp:string { "Move item up" } - moveItemDown:string { "Move item down" } - removeItem:string { "Remove item" } - } -} - diff --git a/src/products/gLiveSupport/var/pl.txt b/src/products/gLiveSupport/var/pl.txt deleted file mode 100644 index 35f10c067..000000000 --- a/src/products/gLiveSupport/var/pl.txt +++ /dev/null @@ -1,465 +0,0 @@ -pl:table -{ - cancelButtonLabel:string { "Anuluj" } - noButtonLabel:string { "Nie" } - yesButtonLabel:string { "Tak" } - okButtonLabel:string { "OK" } - - localeNotAvailableMsg:string { "Język {0} nie jest dostępny" } - schedulerNotReachableMsg:string { "Serwer programacji nie jest dostępny" } - storageNotReachableMsg:string { "Serwer plików nie jest dostępny" } - authenticationNotReachableMsg:string - { "Serwer logowania nie jest dostępny.\n" - "Would you like to edit the server " - "settings?" } - audioErrorMsg { "Błąd odtwarzacz: " } - - masterPanelWindow:table - { - windowTitle:string { "Okno główne" } - - notLoggedInMsg:string { "Nie zalogowany" } - loggedInMsg:string { "Zalogowany: {0}" } - loginButtonLabel:string { "Zaloguj" } - logoutButtonLabel:string { "Wyloguj" } - liveModeButtonLabel:string { "Na żywo" } - uploadFileButtonLabel:string { "Załaduj plik" } - scratchpadButtonLabel:string { "Przybornik" } - playlistButtonLabel:string { "Listę utworów" } - schedulerButtonLabel:string { "Programacja" } - searchButtonLabel:string { "Szukaj" } - optionsButtonLabel:string { "Options" } - - elapsedTimeLabel:string { "minęło" } - remainingTimeLabel:string { "zostało" } - - sureToExitMsg:string { "Czy na pewno opuścić program ?" } - } - - loginWindow:table - { - windowTitle:string { "LOGOWANIE" } - - userNameLabel:string { "Login" } - passwordLabel:string { "Hasło" } - languageLabel:string { "#Language#" } - - pleaseWaitMsg:string { "Logging in, please wait." } - } - - audioClipListWindow:table - { - windowTitle:string { "Okno utworu" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "długość" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "token" } - - closeButtonLabel:string { "zamknij" } - } - - scratchpadWindow:table - { - windowTitle:string { "Przybornik" } - - creatorColumnLabel:string { "Autor" } - titleColumnLabel:string { "Tytuł" } - addToPlaylistButtonLabel:string { "Dodaj do listy utworów" } - clearListButtonLabel:string { "Wyczyść listę" } - removeButtonLabel:string { "Usuń element(y)" } - - cueMenuItem:string { "Po_słuchaj" } - addToLiveModeMenuItem:string { "Dodaj do _Na żywo" } - addToPlaylistMenuItem:string { "_Dodaj do listy utworów" } - removeMenuItem:string { "_Usuń" } - editPlaylistMenuItem:string { "_Edytuj" } - schedulePlaylistMenuItem:string { "_Programacja" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cannotEditPlaylistMsg:string - { "Nie udało się otworzyć listę do edycji." } - } - - playlistListWindow:table - { - windowTitle:string { "Okno listy utworów" } - - listBoxLabel { "Listy utworów" } - detailBoxLabel { "Szczegóły" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "długość" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "token" } - - closeButtonLabel:string { "zamknij" } - } - - uploadFileWindow:table - { - windowTitle:string { "Załaduj plik" } - - chooseFileLabel:string { "Nazwa pliku" } - chooseFileButtonLabel:string { "Przeglądaj" } - - mainSectionLabel:string { "Start" } - musicSectionLabel:string { "Muzyka" } - voiceSectionLabel:string { "Audycja" } - - lengthLabel:string { "Długość" } - - uploadButtonLabel:string { "Załaduj" } - closeButtonLabel:string { "Anuluj" } - - fileChooserDialogTitle:string { "Wybierz plik" } - fileUploadedMsg:string { "Plik ''{0}'' został załadowany." } - couldNotOpenFileMsg:string { "Nie udało się otworzyć pliku." } - couldNotReadLengthMsg:string { "Nie udało się ustalić długość " - "pliku." } - unsupportedFileTypeMsg:string { "To rozszerzenie nie jest obsługiwane." } - missingTitleMsg:string { "Proszę wprowadzić tytuł." } - badMetadataMsg:string { "#Invalid data for {0}.#" } - duplicateFileMsg:string { "#Error: the file is in the storage " - "already.#" } - } - - playlistWindow:table - { - windowTitle:string { "Zarządzanie listą utworów" } - - startColumnLabel:string { "Początek" } - titleColumnLabel:string { "Tytuł" } - lengthColumnLabel:string { "Długość" } - fadeInColumnLabel:string { "Wprowadzenie" } - fadeOutColumnLabel:string { "Zakończenie" } - - nameLabel:string { "Nazwa" } - saveButtonLabel:string { "Zapisz" } - closeButtonLabel:string { "Zamknij" } - lockFadesCheckButtonLabel:string - { "Zablokuj zakończenie do następnego " - "wprowadzenia" } - - upMenuItem:string { "Do _Góry" } - downMenuItem:string { "Do D_ołu" } - removeMenuItem:string { "_Usuń" } - - playlistSavedMsg:string { "Zapisano listę utworów ''{0}''." } - savePlaylistDialogMsg:string { "Czy chcesz zapisać listę utworów?" } - closeWithoutSavingButtonLabel:string - { "#Close without Saving#" } - emptyTitleErrorMsg:string { "Proszę wprowadzić tytuł." } - } - - schedulerWindow:table - { - windowTitle:string { "Okno programacji" } - - scheduleTab:string { "Schedule" } - statusTab:string { "Status" } - - startColumnLabel:string { "Początek" } - titleColumnLabel:string { "tytuł" } - endColumnLabel:string { "koniec" } - deleteMenuItem:string { "_Usuń" } - - stopCurrentlyPlayingButtonLabel:string { "Stop" } - stopCurrentlyPlayingText:string { "what is currently playing " - "in the scheduler." } - stopCurrentlyPlayingDialogMsg:string { "Are you sure?" } - - closeButtonLabel:string { "zamknij" } - - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Programacja listy utworów" } - - hourLabel:string { "godzina: " } - minuteLabel:string { "minuta: " } - secondLabel:string { "seconds: " } - scheduleButtonLabel:string { "zaprogramuj" } - closeButtonLabel:string { "zamknij" } - } - - searchWindow:table - { - windowTitle:string { "Szukaj/Przeglądaj" } - - searchWhereLabel:string { "Search or browse on: " } - searchWhereLocal:string { "local storage" } - searchWhereRemote:string { "network hub" } - - simpleSearchTab:string { "Szukaj" } - advancedSearchTab:string { "Szukanie zaawansowane" } - browseTab:string { "Przeglądaj" } - transportsTab:string { "Transfers" } - - searchButtonLabel:string { "Szukaj" } - backwardButtonLabel:string { "⇦ Previous" } - forwardButtonLabel:string { "Next ⇨" } - searchResultsCountLabel:string { "{0}-{1} of {2} results" } - - typeColumnLabel:string { "Rodzaj" } - titleColumnLabel:string { "Tytuł" } - creatorColumnLabel:string { "Autor" } - sourceColumnLabel:string { "Album" } - lengthColumnLabel:string { "Długość" } - - allStringForBrowse { "--- wszystko ---" } - - addToScratchpadMenuItem:string { "_Dodaj do przybornika" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - addToLiveModeMenuItem:string { "Dodaj do _Na żywo" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to the network hub" } - downloadFromHubMenuItem:string { "Download from the network hub" } - - pleaseWaitMsg:string { "Please wait..." } - shortErrorMsg:string { "Search failed." } - longErrorMsg:string { "Search failed: {0}." } - uploadToHubErrorMsg:string { "Uploading to hub failed: {0}." } - downloadFromHubErrorMsg:string { "Downloading from hub failed: {0}." } - nothingFoundMsg:string { "No files found." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "File types" } - allFileType:string { "all" } - audioClipFileType:string { "audio clips" } - playlistFileType:string { "playlists" } - - searchByTextLabel:string { "Szukaj po" } - - partialOperatorDisplay:string { "zawiera" } - prefixOperatorDisplay:string { "zaczyna się od" } - =OperatorDisplay:string { "równa się" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Na żywo" } - - playMenuItem:string { "_Zagraj" } - cueMenuItem:string { "Po_słuchaj" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - removeMenuItem:string { "_Usuń" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cuePlayerLabel:string { "Podgląd" } - - clearListButtonLabel:string { "Clear list" } - removeButtonLabel:string { "Remove item(s)" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - optionsWindow:table - { - windowTitle:string { "Options" } - - needToRestartMsg:string { "You will need to restart the " - "application\nfor the new settings " - "to take effect." } - errorMsg:string { "Could not save the options: " } - - soundSectionLabel:string { "Sound" } - keyBindingsSectionLabel:string { "Keyboard Shortcuts" } - serversSectionLabel:string { "Servers" } - schedulerSectionLabel:string { "Scheduler" } - backupSectionLabel:string { "Backup" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "About" } - - cancelButtonLabel:string { "Cancel" } - applyButtonLabel:string { "Apply" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Cue audio device:" } - outputDeviceLabel:string { "Live Mode audio device:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Press a key..." } - keyBindingsInstructionsText:string - { "Double-click on the shortcut you want " - "to change, \n" - "then press the key for the new " - "shortcut\n" - "(or press the Escape key to cancel " - "the operation)." } - - authenticationLabel:string { "Authentication server" } - storageLabel:string { "Storage server" } - schedulerLabel:string { "Scheduler server" } - serverLabel:string { "address:" } - portLabel:string { "port:" } - pathLabel:string { "path:" } - - schedulerStatusText:string { "The scheduler is" } - schedulerRunningStatus:string { "running." } - schedulerStoppedStatus:string { "stopped." } - schedulerStartButtonLabel:string { "Start" } - schedulerStopButtonLabel:string { "Stop" } - - reportBugsToText:string { "Report bugs to: {0}" } - } - - backupView:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - mtimeTextLabel:string { "#Modified since:#" } - chooseTimeButtonLabel:string { "#Choose time#" } - resetTimeButtonLabel:string { "#Reset#" } - - backupButtonLabel:string { "#Backup#" } - deleteButtonLabel:string { "#Delete#" } - saveButtonLabel:string { "#Save#" } - - backupTitleLabel:string { "#Title:#" } - defaultBackupTitle:string { "#new backup#" } - - fileChooserDialogTitle:string { "#Save File#" } - backupErrorMsg:string { "#Backup error: #" } - } - - rdsView:table - { - deviceLabel:string { "#Serial port:#" } - PSrdsLabel:string { "#Station name:#" } - PIrdsLabel:string { "#Station code:#" } - RTrdsLabel:string { "#Clip info:#" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Select the date and time" } - - cancelButtonLabel:string { "Cancel" } - okButtonLabel:string { "OK" } - - hourLabel:string { "hour:" } - minuteLabel:string { "minute:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Export Playlist" } - - playlistTitleLabel:string { "Title:" } - formatLabel:string { "Export as:" } - - cancelButtonLabel:string { "Cancel" } - saveButtonLabel:string { "Save" } - - internalFormatName:string { "Campcaster archive" } - smilFormatName:string { "tar containing a SMIL" } - - fileChooserDialogTitle:string { "Save File" } - - createExportErrorMsg:string { "Could not export the playlist:" } - saveExportErrorMsg:string { "Could not save the exported playlist." } - } - - transportList:table - { - workingStatus:string { "#In progress...#" } - successStatus:string { "#Ready#" } - faultStatus:string { "#Error: {0}#" } - - titleColumnLabel:string { "#Title#" } - dateColumnLabel:string { "#Date#" } - statusColumnLabel:string { "#Status#" } - - cancelUploadMenuItem:string { "#Cancel upload#" } - cancelDownloadMenuItem:string { "#Cancel download#" } - - cannotCancelTransportMsg:string { "#Canceling failed: {0}.#" } - duplicateFileMsg:string { "#the file is in the network " - "hub already.#" } - } - - restoreBackupWindow:table - { - windowTitle:string { "Restore Backup" } - errorMessage:string { "Error: {0}" } - pendingMessage:string { "Uploading backup file\n''{0}''.\n" - "Please wait..." } - finishedMessage:string { "Upload finished." } - } - - metadataTypes:table - { - title:string { "Tytuł" } - creator:string { "Autor" } - album:string { "Płyta" } - year:string { "Rok" } - genre:string { "Rodzaj" } - description:string { "Opis" } - format:string { "Format" } - length:string { "Długość" } - bpm:string { "BPM" } - rating:string { "Rating" } - encoded_by:string { "Skompresowany przez" } - track_number:string { "Numer utworu" } - disc_number:string { "Numer płyty" } - mood:string { "Mood" } - publishing_label:string { "Znacznik publikacji" } - composer:string { "Composer" } - bitrate:string { "Bitrate" } - channels:string { "Kanały" } - sample_rate:string { "Sample rate" } - encoding_software:string { "Encoding software" } - checksum:string { "Checksum" } - lyrics:string { "Lyrics" } - orchestra_or_band:string { "Orchiestra lub grupa" } - conductor:string { "Conductor" } - lyricist:string { "Lyricist" } - original_lyricist:string { "Original lyricist" } - radio_station_name:string { "Nazwa statcji radiowej" } - audio_file_info_url:string { "Strona o pliku" } - artist_url:string { "Strona o autorze" } - audio_source_url:string { "Strona pochodzenia pliku" } - radio_station_url:string { "Strona stacji radiowej" } - buy_cd_url:string { "Strona zakupu CD" } - isrc_number:string { "ISRC number" } - catalog_number:string { "Catalog number" } - original_artist:string { "Original artist" } - copyright:string { "Copyright" } - report_date_time:string { "Report date/time" } - report_location:string { "Report location" } - report_organizations:string { "Report organizations" } - subject:string { "Subject" } - } - - keyboardShortcuts:table - { - playAudio:string { "Play" } - pauseAudio:string { "Pause" } - stopAudio:string { "Stop" } - nextTrack:string { "Next track" } - fadeOut:string { "Fade out" } - moveItemUp:string { "Move item up" } - moveItemDown:string { "Move item down" } - removeItem:string { "Remove item" } - } -} - diff --git a/src/products/gLiveSupport/var/root.txt b/src/products/gLiveSupport/var/root.txt deleted file mode 100644 index 8d5f64002..000000000 --- a/src/products/gLiveSupport/var/root.txt +++ /dev/null @@ -1,467 +0,0 @@ -root:table -{ - cancelButtonLabel:string { "Cancel" } - noButtonLabel:string { "No" } - yesButtonLabel:string { "Yes" } - okButtonLabel:string { "OK" } - - localeNotAvailableMsg:string { "Locale {0} is not available." } - schedulerNotReachableMsg:string { "The scheduler server is not available." } - storageNotReachableMsg:string { "The storage server is not available." } - authenticationNotReachableMsg:string - { "The authentication server is not " - "available.\n" - "Would you like to edit the server " - "settings?" } - audioErrorMsg { "Audio player error: " } - - masterPanelWindow:table - { - windowTitle:string { "Master Panel" } - - notLoggedInMsg:string { "Not logged in" } - loggedInMsg:string { "User: {0}" } - loginButtonLabel:string { "Log in" } - logoutButtonLabel:string { "Log out" } - liveModeButtonLabel:string { "Live Mode" } - uploadFileButtonLabel:string { "Upload File" } - scratchpadButtonLabel:string { "Scratchpad" } - playlistButtonLabel:string { "Playlist" } - schedulerButtonLabel:string { "Scheduler" } - searchButtonLabel:string { "Search" } - optionsButtonLabel:string { "Options" } - - elapsedTimeLabel:string { "elapsed" } - remainingTimeLabel:string { "remaining" } - - sureToExitMsg:string { "Are you sure you want to exit?" } - } - - loginWindow:table - { - windowTitle:string { "Login" } - - userNameLabel:string { "User name" } - passwordLabel:string { "Password" } - languageLabel:string { "Language" } - - pleaseWaitMsg:string { "Logging in, please wait." } - } - - audioClipListWindow:table - { - windowTitle:string { "Audio Clip List" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "length" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "token" } - - closeButtonLabel:string { "close" } - } - - scratchpadWindow:table - { - windowTitle:string { "Scratchpad" } - - creatorColumnLabel:string { "Creator" } - titleColumnLabel:string { "Title" } - addToPlaylistButtonLabel:string { "Add to playlist" } - clearListButtonLabel:string { "Clear list" } - removeButtonLabel:string { "Remove item(s)" } - - cueMenuItem:string { "Pre_view" } - addToLiveModeMenuItem:string { "Add to _Live Mode" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - removeMenuItem:string { "_Remove" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - playlistListWindow:table - { - windowTitle:string { "Playlist" } - - listBoxLabel { "Playlists" } - detailBoxLabel { "Playlist details" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "length" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "token" } - - closeButtonLabel:string { "close" } - } - - uploadFileWindow:table - { - windowTitle:string { "Upload File" } - - chooseFileLabel:string { "Filename" } - chooseFileButtonLabel:string { "Browse" } - - mainSectionLabel:string { "Main" } - musicSectionLabel:string { "Music" } - voiceSectionLabel:string { "Voice" } - - lengthLabel:string { "Duration" } - - uploadButtonLabel:string { "Upload" } - closeButtonLabel:string { "Cancel" } - - fileChooserDialogTitle:string { "Open File" } - fileUploadedMsg:string { "Uploaded ''{0}''." } - couldNotOpenFileMsg:string { "The file could not be opened." } - couldNotReadLengthMsg:string { "Could not determine audio clip " - "length." } - unsupportedFileTypeMsg:string { "Unsupported file type." } - missingTitleMsg:string { "Please enter a title." } - badMetadataMsg:string { "Invalid data for {0}." } - duplicateFileMsg:string { "Error: the file is in the storage " - "already." } - } - - playlistWindow:table - { - windowTitle:string { "Edit Playlist" } - - startColumnLabel:string { "Start" } - titleColumnLabel:string { "Title" } - lengthColumnLabel:string { "Length" } - fadeInColumnLabel:string { "Fade in" } - fadeOutColumnLabel:string { "Fade out" } - - nameLabel:string { "Name" } - lengthLabel:string { "Duration:" } - saveButtonLabel:string { "Save" } - closeButtonLabel:string { "Close" } - lockFadesCheckButtonLabel:string - { "Lock fade-out to following fade-in" } - - upMenuItem:string { "Move _Up" } - downMenuItem:string { "Move D_own" } - removeMenuItem:string { "_Remove" } - - playlistSavedMsg:string { "Saved playlist ''{0}''." } - savePlaylistDialogMsg:string { "Do you want to save the playlist?" } - closeWithoutSavingButtonLabel:string - { "Close without Saving" } - emptyTitleErrorMsg:string { "Please enter a title." } - } - - schedulerWindow:table - { - windowTitle:string { "Scheduler" } - - scheduleTab:string { "Schedule" } - statusTab:string { "Status" } - - startColumnLabel:string { "start" } - titleColumnLabel:string { "title" } - endColumnLabel:string { "end" } - deleteMenuItem:string { "_Delete" } - - stopCurrentlyPlayingButtonLabel:string { "Stop" } - stopCurrentlyPlayingText:string { "what is currently playing " - "in the scheduler." } - stopCurrentlyPlayingDialogMsg:string { "Are you sure?" } - - closeButtonLabel:string { "Close" } - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Schedule Playlist" } - - hourLabel:string { "hour: " } - minuteLabel:string { "minute: " } - secondLabel:string { "seconds: " } - scheduleButtonLabel:string { "schedule" } - closeButtonLabel:string { "close" } - } - - searchWindow:table - { - windowTitle:string { "Search/Browse" } - - searchWhereLabel:string { "Search or browse on: " } - searchWhereLocal:string { "local storage" } - searchWhereRemote:string { "network hub" } - - simpleSearchTab:string { "Search" } - advancedSearchTab:string { "Advanced Search" } - browseTab:string { "Browse" } - transportsTab:string { "Transfers" } - - searchButtonLabel:string { "Search" } - backwardButtonLabel:string { "⇦ Previous" } - forwardButtonLabel:string { "Next ⇨" } - searchResultsCountLabel:string { "{0}-{1} of {2} results" } - - typeColumnLabel:string { "Type" } - titleColumnLabel:string { "Title" } - creatorColumnLabel:string { "Creator" } - sourceColumnLabel:string { "Album" } - lengthColumnLabel:string { "Length" } - - allStringForBrowse { "--- all ---" } - - addToScratchpadMenuItem:string { "Add To S_cratchpad" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - addToLiveModeMenuItem:string { "Add To _Live Mode" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to the network hub" } - downloadFromHubMenuItem:string { "Download from the network hub" } - - pleaseWaitMsg:string { "Please wait..." } - shortErrorMsg:string { "Search failed." } - longErrorMsg:string { "Search failed: {0}." } - uploadToHubErrorMsg:string { "Uploading to hub failed: {0}." } - downloadFromHubErrorMsg:string { "Downloading from hub failed: {0}." } - nothingFoundMsg:string { "No files found." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "File types" } - allFileType:string { "all" } - audioClipFileType:string { "audio clips" } - playlistFileType:string { "playlists" } - - searchByTextLabel:string { "Search by" } - - partialOperatorDisplay:string { "contains" } - prefixOperatorDisplay:string { "starts with" } - =OperatorDisplay:string { "equals" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Live Mode" } - - playMenuItem:string { "_Play" } - cueMenuItem:string { "Pre_view" } - addToPlaylistMenuItem:string { "_Add to Playlist" } - removeMenuItem:string { "_Remove" } - editPlaylistMenuItem:string { "_Edit Playlist" } - schedulePlaylistMenuItem:string { "_Schedule Playlist" } - exportPlaylistMenuItem:string { "E_xport Playlist" } - uploadToHubMenuItem:string { "Upload to Network Hub" } - - cuePlayerLabel:string { "Preview" } - autoPlayNextLabel:string { "Play the next item automatically" } - - clearListButtonLabel:string { "Clear list" } - removeButtonLabel:string { "Remove item(s)" } - - cannotEditPlaylistMsg:string - { "Could not open playlist for editing." } - } - - optionsWindow:table - { - windowTitle:string { "Options" } - - needToRestartMsg:string { "You will need to restart the " - "application\nfor the new settings " - "to take effect." } - errorMsg:string { "Could not save the options: " } - - soundSectionLabel:string { "Sound" } - keyBindingsSectionLabel:string { "Keyboard Shortcuts" } - serversSectionLabel:string { "Servers" } - schedulerSectionLabel:string { "Scheduler" } - backupSectionLabel:string { "Backup" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "About" } - - cancelButtonLabel:string { "Cancel" } - applyButtonLabel:string { "Apply" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Cue audio device:" } - outputDeviceLabel:string { "Live Mode audio device:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Press a key..." } - keyBindingsInstructionsText:string - { "Double-click on the shortcut you want " - "to change, \n" - "then press the key for the new " - "shortcut\n" - "(or press the Escape key to cancel " - "the operation)." } - - authenticationLabel:string { "Authentication server" } - storageLabel:string { "Storage server" } - schedulerLabel:string { "Scheduler server" } - serverLabel:string { "address:" } - portLabel:string { "port:" } - pathLabel:string { "path:" } - - schedulerStatusText:string { "The scheduler is" } - schedulerRunningStatus:string { "running." } - schedulerStoppedStatus:string { "stopped." } - schedulerStartButtonLabel:string { "Start" } - schedulerStopButtonLabel:string { "Stop" } - - reportBugsToText:string { "Report bugs to: {0}" } - creditsText:import { "../../../../CREDITS" } - } - - backupView:table - { - workingStatus:string { "In progress..." } - successStatus:string { "Ready" } - faultStatus:string { "Error: {0}" } - - titleColumnLabel:string { "Title" } - dateColumnLabel:string { "Date" } - statusColumnLabel:string { "Status" } - - mtimeTextLabel:string { "Modified since:" } - chooseTimeButtonLabel:string { "Choose time" } - resetTimeButtonLabel:string { "Reset" } - - backupButtonLabel:string { "Backup" } - deleteButtonLabel:string { "Delete" } - saveButtonLabel:string { "Save" } - - backupTitleLabel:string { "Title:" } - defaultBackupTitle:string { "new backup" } - - fileChooserDialogTitle:string { "Save File" } - backupErrorMsg:string { "Backup error: " } - } - - rdsView:table - { - deviceLabel:string { "Serial port:" } - PSrdsLabel:string { "Station name:" } - PIrdsLabel:string { "Station code:" } - RTrdsLabel:string { "Clip info:" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Select the date and time" } - - cancelButtonLabel:string { "Cancel" } - okButtonLabel:string { "OK" } - - hourLabel:string { "hour:" } - minuteLabel:string { "minute:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Export Playlist" } - - playlistTitleLabel:string { "Title:" } - formatLabel:string { "Export as:" } - - cancelButtonLabel:string { "Cancel" } - saveButtonLabel:string { "Save" } - - internalFormatName:string { "Campcaster archive" } - smilFormatName:string { "tar containing a SMIL" } - - fileChooserDialogTitle:string { "Save File" } - - createExportErrorMsg:string { "Could not export the playlist:" } - saveExportErrorMsg:string { "Could not save the exported playlist." } - } - - transportList:table - { - workingStatus:string { "In progress..." } - successStatus:string { "Ready" } - faultStatus:string { "Error: {0}" } - - titleColumnLabel:string { "Title" } - dateColumnLabel:string { "Date" } - statusColumnLabel:string { "Status" } - - cancelUploadMenuItem:string { "Cancel upload" } - cancelDownloadMenuItem:string { "Cancel download" } - - cannotCancelTransportMsg:string { "Canceling failed: {0}." } - duplicateFileMsg:string { "the file is in the network " - "hub already." } - } - - restoreBackupWindow:table - { - windowTitle:string { "Restore Backup" } - errorMessage:string { "Error: {0}" } - pendingMessage:string { "Uploading backup file\n''{0}''.\n" - "Please wait..." } - finishedMessage:string { "Upload finished." } - } - - metadataTypes:table - { - title:string { "Title" } - creator:string { "Creator" } - album:string { "Album" } - year:string { "Year" } - genre:string { "Genre" } - description:string { "Description" } - format:string { "Format" } - length:string { "Length" } - bpm:string { "BPM" } - rating:string { "Rating" } - encoded_by:string { "Encoded by" } - track_number:string { "Track number" } - disc_number:string { "Disc number" } - mood:string { "Mood" } - publishing_label:string { "Publishing label" } - composer:string { "Composer" } - bitrate:string { "Bitrate" } - channels:string { "Channels" } - sample_rate:string { "Sample rate" } - encoding_software:string { "Encoding software" } - checksum:string { "Checksum" } - lyrics:string { "Lyrics" } - orchestra_or_band:string { "Orchestra or band" } - conductor:string { "Conductor" } - lyricist:string { "Lyricist" } - original_lyricist:string { "Original lyricist" } - radio_station_name:string { "Radio station name" } - audio_file_info_url:string { "File info web page" } - artist_url:string { "Artist web page" } - audio_source_url:string { "Source web page" } - radio_station_url:string { "Radio station web page" } - buy_cd_url:string { "Buy CD web page" } - isrc_number:string { "ISRC number" } - catalog_number:string { "Catalog number" } - original_artist:string { "Original artist" } - copyright:string { "Copyright" } - report_date_time:string { "Report date/time" } - report_location:string { "Report location" } - report_organizations:string { "Report organizations" } - subject:string { "Subject" } - } - - keyboardShortcuts:table - { - playAudio:string { "Play" } - pauseAudio:string { "Pause" } - stopAudio:string { "Stop" } - nextTrack:string { "Next track" } - fadeOut:string { "Fade out" } - moveItemUp:string { "Move item up" } - moveItemDown:string { "Move item down" } - removeItem:string { "Remove item" } - } -} - diff --git a/src/products/gLiveSupport/var/sr_CS.txt b/src/products/gLiveSupport/var/sr_CS.txt deleted file mode 100644 index 8f7f26ef0..000000000 --- a/src/products/gLiveSupport/var/sr_CS.txt +++ /dev/null @@ -1,460 +0,0 @@ -sr_CS:table -{ - cancelButtonLabel:string { "Otkaži" } - noButtonLabel:string { "Ne" } - yesButtonLabel:string { "Da" } - okButtonLabel:string { "OK" } - - localeNotAvailableMsg:string { "Mesto {0} nije dostupno" } - schedulerNotReachableMsg:string { "Server sa rasporedom nije dostupan" } - storageNotReachableMsg:string { "Server nije dostupan" } - authenticationNotReachableMsg:string - { "Server za autentizaciju nije dostupan.\n" - "Da li biste želeli da promenite serverske postavke?" } - audioErrorMsg { "Greška u audio plejeru: " } - - masterPanelWindow:table - { - windowTitle:string { "Glavni panel" } - - notLoggedInMsg:string { "Niste prijavljeni" } - loggedInMsg:string { "Prijavljeni: {0}" } - loginButtonLabel:string { "Prijava" } - logoutButtonLabel:string { "Odjava" } - liveModeButtonLabel:string { "Uživo" } - uploadFileButtonLabel:string { "Aploud" } - scratchpadButtonLabel:string { "Priprema" } - playlistButtonLabel:string { "Plej lista" } - schedulerButtonLabel:string { "Raspored" } - searchButtonLabel:string { "Pretraga" } - optionsButtonLabel:string { "Opcije" } - - elapsedTimeLabel:string { "pozicija" } - remainingTimeLabel:string { "preostalo" } - - sureToExitMsg:string { "Sigurno želite da izađete?" } - } - - loginWindow:table - { - windowTitle:string { "PRIJAVA" } - - userNameLabel:string { "Prijavi se" } - passwordLabel:string { "Lozinka" } - languageLabel:string { "#Language#" } - - pleaseWaitMsg:string { "Prijava je u toku, sačekajte" } - } - - audioClipListWindow:table - { - windowTitle:string { "Audio Klipovi" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "dužina" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "preuzeto" } - - closeButtonLabel:string { "zatvori" } - } - - scratchpadWindow:table - { - windowTitle:string { "Priprema" } - - creatorColumnLabel:string { "Autor" } - titleColumnLabel:string { "Naslov" } - addToPlaylistButtonLabel:string { "Dodaj u plej listu" } - clearListButtonLabel:string { "Obriši listu" } - removeButtonLabel:string { "Ukloni iz liste" } - - cueMenuItem:string { "Proba" } - addToLiveModeMenuItem:string { "Dodaj u Program Uživo" } - addToPlaylistMenuItem:string { "Dodaj u plej listu" } - removeMenuItem:string { "Ukloni" } - editPlaylistMenuItem:string { "Uredi plej listu" } - schedulePlaylistMenuItem:string { "Programiraj plej listu" } - exportPlaylistMenuItem:string { "Prebaci plejlistu" } - uploadToHubMenuItem:string { "Uputi na centralni server" } - - cannotEditPlaylistMsg:string { "Neuspelo otvaranje plejliste" } - } - - playlistListWindow:table - { - windowTitle:string { "Plej lista" } - - listBoxLabel { "Plej liste" } - detailBoxLabel { "Detalji plej liste" } - - idColumnLabel:string { "id" } - lengthColumnLabel:string { "dužina" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "preuzeto" } - - closeButtonLabel:string { "zatvori" } - } - - uploadFileWindow:table - { - windowTitle:string { "Aploud fajla" } - - chooseFileLabel:string { "Ime fajla" } - chooseFileButtonLabel:string { "Pretraži" } - - mainSectionLabel:string { "Glavno" } - musicSectionLabel:string { "Muzika" } - voiceSectionLabel:string { "Glas" } - - lengthLabel:string { "Trajanje" } - - uploadButtonLabel:string { "Uputi" } - closeButtonLabel:string { "Otkaži" } - - fileChooserDialogTitle:string { "Izaberi fajl" } - fileUploadedMsg:string { "Upućen fajl ''{0}''." } - couldNotOpenFileMsg:string { "Fajl se ne može otvoriti." } - - couldNotReadLengthMsg:string { "Neuspelo određivanje dužine." } - - unsupportedFileTypeMsg:string { "Nepodržavana ekstenzija." } - missingTitleMsg:string { "Unesite naslov." } - badMetadataMsg:string { "Greška u podacima za {0}." } - duplicateFileMsg:string { "Greška:fajl je već u arhivi." } - } - - playlistWindow:table - { - windowTitle:string { "Plej lista" } - - startColumnLabel:string { "počni" } - titleColumnLabel:string { "naslov" } - lengthColumnLabel:string { "dužina" } - fadeInColumnLabel:string { "Fade in" } - fadeOutColumnLabel:string { "Fade out" } - - nameLabel:string { "Ime" } - lengthLabel:string { "#Duration:#" } - saveButtonLabel:string { "Sačuvaj" } - closeButtonLabel:string { "Zatvori" } - lockFadesCheckButtonLabel:string - { "Podesi fade out tako da prati fade in" } - - playlistSavedMsg:string { "Sačuvana plej lista {0}." } - savePlaylistDialogMsg:string { "Sačuvati plejlistu?" } - closeWithoutSavingButtonLabel:string - { "#Close without Saving#" } - emptyTitleErrorMsg:string { "Unesite naslov." } - } - - schedulerWindow:table - { - windowTitle:string { "Raspored" } - - scheduleTab:string { "Raspored emitovanja" } - statusTab:string { "Status" } - - startColumnLabel:string { "početak" } - titleColumnLabel:string { "naziv" } - endColumnLabel:string { "kraj" } - deleteMenuItem:string { "Obriši" } - - stopCurrentlyPlayingButtonLabel:string { "Stop" } - stopCurrentlyPlayingText:string { "trenutno se nalazi u " - "rasporedu emitovanja." } - stopCurrentlyPlayingDialogMsg:string { "Da li ste sigurni?" } - - closeButtonLabel:string { "Zatvori" } - - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Programiranje Plej Liste" } - - hourLabel:string { "sat: " } - minuteLabel:string { "minut: " } - secondLabel:string { "sekunde: " } - scheduleButtonLabel:string { "programiraj" } - closeButtonLabel:string { "zatvori" } - } - - searchWindow:table - { - windowTitle:string { "Pretraga/Pregled" } - - searchWhereLabel:string { "Traži ili pregledaj na: " } - searchWhereLocal:string { "lokalna arhiva" } - searchWhereRemote:string { "centralni server" } - - simpleSearchTab:string { "Pretraga" } - advancedSearchTab:string { "Napredna pretraga" } - browseTab:string { "Pregled" } - transportsTab:string { "Prenesi" } - - searchButtonLabel:string { "Pretraži" } - backwardButtonLabel:string { "⇦ Prethodno" } - forwardButtonLabel:string { "Sledeće ⇨" } - searchResultsCountLabel:string { "{0}-{1} od {2} rezultata" } - - typeColumnLabel:string { "Tip" } - titleColumnLabel:string { "Naslov" } - creatorColumnLabel:string { "Autor" } - sourceColumnLabel:string { "Album" } - lengthColumnLabel:string { "Dužina" } - - allStringForBrowse { "--- sve ---" } - - addToScratchpadMenuItem:string { "Dodaj u Pripremu " } - addToPlaylistMenuItem:string { "Dodaj u plejlistu" } - addToLiveModeMenuItem:string { "Dodaj u Program Uživo" } - editPlaylistMenuItem:string { "Uredi plejlistu" } - schedulePlaylistMenuItem:string { "Napravi raspored plejliste" } - exportPlaylistMenuItem:string { "Prebaci plejlistu" } - uploadToHubMenuItem:string { "Uputi na centralni server" } - downloadFromHubMenuItem:string { "Preuzmi sa centralnog servera" } - - pleaseWaitMsg:string { "Sačekajte..." } - shortErrorMsg:string { "Neuspela pretraga." } - longErrorMsg:string { "Neuspela pretraga: {0}." } - uploadToHubErrorMsg:string { "Neuspelo upućivanje na centralni server: {0}." } - downloadFromHubErrorMsg:string { "Neuspelo preuzimanje sa centralnog servera: {0}." } - nothingFoundMsg:string { "Fajlovi nisu nađeni." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "Tip fajla" } - allFileType:string { "Svi" } - audioClipFileType:string { "audio klipovi" } - playlistFileType:string { "plejliste" } - - searchByTextLabel:string { "Traži po" } - - partialOperatorDisplay:string { "sadrži" } - prefixOperatorDisplay:string { "počinje sa" } - =OperatorDisplay:string { "jednako" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Program Uživo" } - - playMenuItem:string { "Pusti" } - cueMenuItem:string { "Proba" } - addToPlaylistMenuItem:string { "Dodaj u plejlistu" } - removeMenuItem:string { "Ukloni" } - editPlaylistMenuItem:string { "Uredi plejlistu" } - schedulePlaylistMenuItem:string { "Programiraj plejlistu" } - exportPlaylistMenuItem:string { "Prebaci plejlistu" } - uploadToHubMenuItem:string { "Uputi na centralni server" } - - cuePlayerLabel:string { "Proba" } - autoPlayNextLabel:string { "#Play the next item automatically#" } - - clearListButtonLabel:string { "Očisti listu" } - removeButtonLabel:string { "Ukloni" } - - cannotEditPlaylistMsg:string - { "Neuspelo otvaranje plejliste." } - } - - optionsWindow:table - { - windowTitle:string { "Opcije" } - - needToRestartMsg:string { "Neophodno je restartartovati " - "aplikaciju\nkako bi nove postavke " - "uspele." } - errorMsg:string { "Neuspelo čuvanje opcija: " } - - soundSectionLabel:string { "Zvuk" } - keyBindingsSectionLabel:string { "Prečice na tastaturi" } - serversSectionLabel:string { "Serveri" } - schedulerSectionLabel:string { "Raspored emitovanja" } - backupSectionLabel:string { "Bekap" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "O aplikaciji" } - - cancelButtonLabel:string { "Otkaži" } - applyButtonLabel:string { "Primeni" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Kartica za predslušavanje:" } - outputDeviceLabel:string { "Kartica za emitovanje: " } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Pritisnite dugme..." } - keyBindingsInstructionsText:string - { "Kliknite dva puta na prečicu koju " - "želite,\nzatim pritisnite taster za " - "novu prečicu\n" - "(ili pritisnite escape kako biste " - "poništili operaciju)." } - - authenticationLabel:string { "Server za autentifikaciju" } - storageLabel:string { "Server za pohranjivanje" } - schedulerLabel:string { "Server za raspored emitovanja" } - serverLabel:string { "adresa:" } - portLabel:string { "port:" } - pathLabel:string { "putanja:" } - - schedulerStatusText:string { "Raspored emitovanja je" } - schedulerRunningStatus:string { "u toku." } - schedulerStoppedStatus:string { "zaustavljen." } - schedulerStartButtonLabel:string { "Počni"} - schedulerStopButtonLabel:string { "Završi" } - - reportBugsToText:string { "Prijavi greške: {0}" } - } - - backupView:table - { - workingStatus:string { "U toku..." } - successStatus:string { "Spremno"} - faultStatus:string { "Greška: {0}" } - - titleColumnLabel:string { "Naslov" } - dateColumnLabel:string { "Datum" } - statusColumnLabel:string { "Status" } - - mtimeTextLabel:string { "#Modified since:#" } - chooseTimeButtonLabel:string { "Izaberi vreme" } - resetTimeButtonLabel:string { "Reset" } - - backupButtonLabel:string { "Bekap" } - deleteButtonLabel:string { "Izbriši" } - saveButtonLabel:string { "Sačuvaj" } - - backupTitleLabel:string { "Bekap:" } - defaultBackupTitle:string { "novi bekap" } - - fileChooserDialogTitle:string { "Sačuvaj fajl" } - backupErrorMsg:string { "Greška u bekapu: " } - } - - rdsView:table - { - deviceLabel:string { "Serijski port:" } - PSrdsLabel:string { "Ime stanice:" } - PIrdsLabel:string { "Šifra stanice:" } - RTrdsLabel:string { "Informacija o klipu:" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Odaberite datum i vreme" } - - cancelButtonLabel:string { "Otkaži" } - okButtonLabel:string { "OK" } - - hourLabel:string { "sat:" } - minuteLabel:string { "minut:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Prebaci plejlistu" } - - playlistTitleLabel:string { "Naslov:" } - formatLabel:string { "Prebaci kao:" } - - cancelButtonLabel:string { "Otkaži" } - saveButtonLabel:string { "Sačuvaj" } - - internalFormatName:string { "Campcaster arhiva" } - smilFormatName:string { "tar koji sadrži SMIL" } - - fileChooserDialogTitle:string { "Sačuvaj fajl" } - - createExportErrorMsg:string { "Neuspelo prebacivanje plejliste:" } - - saveExportErrorMsg:string { "Neuspelo čuvanje prebačene plejliste." } - } - - transportList:table - { - workingStatus:string { "U toku..." } - successStatus:string { "Spremno" } - faultStatus:string { "Greška: {0}" } - - titleColumnLabel:string { "Naslov" } - dateColumnLabel:string { "Datum" } - statusColumnLabel:string { "Status" } - - cancelUploadMenuItem:string { "Otkaži upućivanje" } - cancelDownloadMenuItem:string { "Otkaži preuzimanje" } - - cannotCancelTransportMsg:string { "Neuspelo otkazivanje." } - duplicateFileMsg:string { "Fajl je već na centralnom " - "serveru." } - } - - restoreBackupWindow:table - { - windowTitle:string { "Povrati bekap" } - errorMessage:string { "Greška: {0}" } - pendingMessage:string { "#Uploading backup file\n''{0}''.\n#" - "Sačekajte..." } - finishedMessage:string { "Završeno upućivanje." } - } - - metadataTypes:table - { - title:string { "Naziv" } - creator:string { "Autor" } - album:string { "Album" } - year:string { "Godina" } - genre:string { "Žanr" } - description:string { "Opis" } - format:string { "Format" } - length:string { "Dužina" } - bpm:string { "BPM" } - rating:string { "Ocena" } - encoded_by:string { "Enkodirao" } - track_number:string { "Redni broj snimka" } - disc_number:string { "Redni broj diska" } - mood:string { "Raspoloženje" } - publishing_label:string { "Izdavačka kuća" } - composer:string { "Kompozitor" } - bitrate:string { "Bitrejt" } - channels:string { "Broj kanala" } - sample_rate:string { "Brzina uzorkovanja" } - encoding_software:string { "Enkoder" } - checksum:string { "Kompletna kontrola" } - lyrics:string { "Tekst pesme" } - orchestra_or_band:string { "Orkestar ili bend" } - conductor:string { "Dirigent" } - lyricist:string { "Tekstopisac" } - original_lyricist:string { "Originalni tekstopisac" } - radio_station_name:string { "Ime radio stanice" } - audio_file_info_url:string { "Web strana sa informacijama o fajlu" } - artist_url:string { "Web strana izvođača" } - audio_source_url:string { "Web strana izvora" } - radio_station_url:string { "Web strana radio stanice" } - buy_cd_url:string { "Kupi CD preko web strane" } - isrc_number:string { "ISRC broj" } - catalog_number:string { "Kataloški broj" } - original_artist:string { "Originalni izvođač" } - copyright:string { "Autorska prava" } - report_date_time:string { "#Report date/time#" } - report_location:string { "#Report location#" } - report_organizations:string { "#Report organizations#" } - subject:string { "#Subject#" } - } - - keyboardShortcuts:table - { - playAudio:string { "Play" } - pauseAudio:string { "Pause" } - stopAudio:string { "Stop" } - nextTrack:string { "Sledeć track" } - fadeOut:string { "Fade out" } - moveItemUp:string { "Pomeri gore" } - moveItemDown:string { "Pomeri dole" } - removeItem:string { "Ukloni" } - } -} - diff --git a/src/products/gLiveSupport/var/sr_CS_CYRILLIC.txt b/src/products/gLiveSupport/var/sr_CS_CYRILLIC.txt deleted file mode 100644 index 76504141e..000000000 --- a/src/products/gLiveSupport/var/sr_CS_CYRILLIC.txt +++ /dev/null @@ -1,460 +0,0 @@ -sr_CS_CYRILLIC:table -{ - cancelButtonLabel:string { "Откажи" } - noButtonLabel:string { "Не" } - yesButtonLabel:string { "Да" } - okButtonLabel:string { "ОК" } - - localeNotAvailableMsg:string { "Место {0} није доступно" } - schedulerNotReachableMsg:string { "Сервер са распоредом није доступан" } - storageNotReachableMsg:string { "Сервер није доступан" } - authenticationNotReachableMsg:string - { "Сервер за аутентизацију није доступан.\n" - "Да ли бисте желели да промените серверске поставке?" } - audioErrorMsg { "Грешка у аудио плејеру: " } - - masterPanelWindow:table - { - windowTitle:string { "Главни панел" } - - notLoggedInMsg:string { "Нисте пријављени" } - loggedInMsg:string { "Пријављени: {0}" } - loginButtonLabel:string { "Пријава" } - logoutButtonLabel:string { "Одјава" } - liveModeButtonLabel:string { "Уживо" } - uploadFileButtonLabel:string { "Аплоуд" } - scratchpadButtonLabel:string { "Припрема" } - playlistButtonLabel:string { "Плеј листа" } - schedulerButtonLabel:string { "Распоред" } - searchButtonLabel:string { "Претрага" } - optionsButtonLabel:string { "Опције" } - - elapsedTimeLabel:string { "позиција" } - remainingTimeLabel:string { "преостало" } - - sureToExitMsg:string { "Сигурно желите да изађете?" } - } - - loginWindow:table - { - windowTitle:string { "ПРИЈАВА" } - - userNameLabel:string { "Пријави се" } - passwordLabel:string { "Лозинка" } - languageLabel:string { "#Language#" } - - pleaseWaitMsg:string { "Пријава је у току, сачекајте" } - } - - audioClipListWindow:table - { - windowTitle:string { "Аудио Клипови" } - - idColumnLabel:string { "ид" } - lengthColumnLabel:string { "дужина" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "преузето" } - - closeButtonLabel:string { "затвори" } - } - - scratchpadWindow:table - { - windowTitle:string { "Припрема" } - - creatorColumnLabel:string { "Аутор" } - titleColumnLabel:string { "Наслов" } - addToPlaylistButtonLabel:string { "Додај у плеј листу" } - clearListButtonLabel:string { "Обриши листу" } - removeButtonLabel:string { "Уклони из листе" } - - cueMenuItem:string { "Проба" } - addToLiveModeMenuItem:string { "Додај у Програм Уживо" } - addToPlaylistMenuItem:string { "Додај у плеј листу" } - removeMenuItem:string { "Уклони" } - editPlaylistMenuItem:string { "Уреди плеј листу" } - schedulePlaylistMenuItem:string { "Програмирај плеј листу" } - exportPlaylistMenuItem:string { "Пребаци плејлисту" } - uploadToHubMenuItem:string { "Упути на централни сервер" } - - cannotEditPlaylistMsg:string { "Неуспело отварање плејлисте" } - } - - playlistListWindow:table - { - windowTitle:string { "Плеј листа" } - - listBoxLabel { "Плеј листе" } - detailBoxLabel { "Детаљи плеј листе" } - - idColumnLabel:string { "ид" } - lengthColumnLabel:string { "дужина" } - uriColumnLabel:string { "URI" } - tokenColumnLabel:string { "преузето" } - - closeButtonLabel:string { "затвори" } - } - - uploadFileWindow:table - { - windowTitle:string { "Аплоуд фајла" } - - chooseFileLabel:string { "Име фајла" } - chooseFileButtonLabel:string { "Претражи" } - - mainSectionLabel:string { "Главно" } - musicSectionLabel:string { "Музика" } - voiceSectionLabel:string { "Глас" } - - lengthLabel:string { "Трајање" } - - uploadButtonLabel:string { "Упути" } - closeButtonLabel:string { "Откажи" } - - fileChooserDialogTitle:string { "Изабери фајл" } - fileUploadedMsg:string { "Упућен фајл ''{0}''." } - couldNotOpenFileMsg:string { "Фајл се не може отворити." } - - couldNotReadLengthMsg:string { "Неуспело одређивање дужине." } - - unsupportedFileTypeMsg:string { "Неподржавана екстензија." } - missingTitleMsg:string { "Унесите наслов." } - badMetadataMsg:string { "Грешка у подацима за {0}." } - duplicateFileMsg:string { "Грешка:фајл је већ у архиви." } - } - - playlistWindow:table - { - windowTitle:string { "Плеј листа" } - - startColumnLabel:string { "почни" } - titleColumnLabel:string { "наслов" } - lengthColumnLabel:string { "дужина" } - fadeInColumnLabel:string { "Фејд ин" } - fadeOutColumnLabel:string { "Фејд аут" } - - nameLabel:string { "Име" } - lengthLabel:string { "#Duration:#" } - saveButtonLabel:string { "Сачувај" } - closeButtonLabel:string { "Затвори" } - lockFadesCheckButtonLabel:string - { "Подеси фејд аут тако да прати фејд ин" } - - playlistSavedMsg:string { "Сачувана плеј листа {0}." } - savePlaylistDialogMsg:string { "Сачувати плејлисту?" } - closeWithoutSavingButtonLabel:string - { "#Close without Saving#" } - emptyTitleErrorMsg:string { "Унесите наслов." } - } - - schedulerWindow:table - { - windowTitle:string { "Распоред" } - - scheduleTab:string { "Распоред емитовања" } - statusTab:string { "Статус" } - - startColumnLabel:string { "почетак" } - titleColumnLabel:string { "назив" } - endColumnLabel:string { "крај" } - deleteMenuItem:string { "Обриши" } - - stopCurrentlyPlayingButtonLabel:string { "Стоп" } - stopCurrentlyPlayingText:string { "тренутно се налази у " - "распореду емитовања" } - stopCurrentlyPlayingDialogMsg:string { "Да ли сте сигурни?" } - - closeButtonLabel:string { "Затвори" } - - } - - schedulePlaylistWindow:table - { - windowTitle:string { "Програмирање Плеј Листе" } - - hourLabel:string { "сат: " } - minuteLabel:string { "минут: " } - secondLabel:string { "секунде: " } - scheduleButtonLabel:string { "програмирај" } - closeButtonLabel:string { "затвори" } - } - - searchWindow:table - { - windowTitle:string { "Претрага/Преглед" } - - searchWhereLabel:string { "Тражи или прегледај на: " } - searchWhereLocal:string { "локална архива" } - searchWhereRemote:string { "централни сервер" } - - simpleSearchTab:string { "Претрага" } - advancedSearchTab:string { "Напредна претрага" } - browseTab:string { "Преглед" } - transportsTab:string { "Пренеси" } - - searchButtonLabel:string { "Претражи" } - backwardButtonLabel:string { "⇦ Претходно" } - forwardButtonLabel:string { "Следеће ⇨" } - searchResultsCountLabel:string { "{0}-{1} од {2} резултата" } - - typeColumnLabel:string { "Тип" } - titleColumnLabel:string { "Наслов" } - creatorColumnLabel:string { "Аутор" } - sourceColumnLabel:string { "Албум" } - lengthColumnLabel:string { "Дужина" } - - allStringForBrowse { "--- све ---" } - - addToScratchpadMenuItem:string { "Додај у Припрему " } - addToPlaylistMenuItem:string { "Додај у плејлисту" } - addToLiveModeMenuItem:string { "Додај у Програм Уживо" } - editPlaylistMenuItem:string { "Уреди плејлисту" } - schedulePlaylistMenuItem:string { "Направи распоред плејлисте" } - exportPlaylistMenuItem:string { "Пребаци плејлисту" } - uploadToHubMenuItem:string { "Упути на централни сервер" } - downloadFromHubMenuItem:string { "Преузми са централног сервера" } - - pleaseWaitMsg:string { "Сачекајте..." } - shortErrorMsg:string { "Неуспела претрага." } - longErrorMsg:string { "Неуспела претрага: {0}." } - uploadToHubErrorMsg:string { "Неуспело упућивање на централни сервер: {0}." } - downloadFromHubErrorMsg:string { "Неуспело преузимање са централног сервера: {0}." } - nothingFoundMsg:string { "Фајлови нису нађени." } - } - - advancedSearchEntry:table - { - fileTypeTextLabel:string { "Тип фајла" } - allFileType:string { "Сви" } - audioClipFileType:string { "аудио клипови" } - playlistFileType:string { "плејлисте" } - - searchByTextLabel:string { "Тражи по" } - - partialOperatorDisplay:string { "садржи" } - prefixOperatorDisplay:string { "почиње са" } - =OperatorDisplay:string { "једнако" } - <=OperatorDisplay:string { "<=" } - >=OperatorDisplay:string { ">=" } - } - - liveModeWindow:table - { - windowTitle:string { "Програм Уживо" } - - playMenuItem:string { "Пусти" } - cueMenuItem:string { "Проба" } - addToPlaylistMenuItem:string { "Додај у плејлисту" } - removeMenuItem:string { "Уклони" } - editPlaylistMenuItem:string { "Уреди плејлисту" } - schedulePlaylistMenuItem:string { "Програмирај плејлисту" } - exportPlaylistMenuItem:string { "Пребаци плејлисту" } - uploadToHubMenuItem:string { "Упути на централни сервер" } - - cuePlayerLabel:string { "Проба" } - autoPlayNextLabel:string { "#Play the next item automatically#" } - - clearListButtonLabel:string { "Очисти листу" } - removeButtonLabel:string { "Уклони" } - - cannotEditPlaylistMsg:string - { "Неуспело отварање плејлисте." } - } - - optionsWindow:table - { - windowTitle:string { "Опције" } - - needToRestartMsg:string { "Неопходно је рестартартовати " - "апликацију\nкако би нове поставке " - "успеле." } - errorMsg:string { "Неуспело чување опција: " } - - soundSectionLabel:string { "Звук" } - keyBindingsSectionLabel:string { "Пречице на тастатури" } - serversSectionLabel:string { "Сервери" } - schedulerSectionLabel:string { "Распоред емитовања" } - backupSectionLabel:string { "Бекап" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "О апликацији" } - - cancelButtonLabel:string { "Откажи" } - applyButtonLabel:string { "Примени" } - okButtonLabel:string { "ОК" } - - cueDeviceLabel:string { "Картица за предслушавање:" } - outputDeviceLabel:string { "Картица за емитовање: " } - testButtonLabel:string { "Тест" } - - pressAKeyMsg:string { "Притисните дугме..." } - keyBindingsInstructionsText:string - { "Кликните два пута на пречицу коју " - "желите,\nзатим притисните тастер за " - "нову пречицу\n" - "(или притисните ескејп како бисте " - "поништили операцију)." } - - authenticationLabel:string { "Сервер за аутентификацију" } - storageLabel:string { "Сервер за похрањивање" } - schedulerLabel:string { "Сервер за распоред емитовања" } - serverLabel:string { "адреса:" } - portLabel:string { "порт:" } - pathLabel:string { "путања:" } - - schedulerStatusText:string { "Распоред емитовања је" } - schedulerRunningStatus:string { "у току." } - schedulerStoppedStatus:string { "заустављен." } - schedulerStartButtonLabel:string { "Почни"} - schedulerStopButtonLabel:string { "Заврши" } - - reportBugsToText:string { "Пријави грешке: {0}" } - } - - backupView:table - { - workingStatus:string { "У току..." } - successStatus:string { "Спремно"} - faultStatus:string { "Грешка: {0}" } - - titleColumnLabel:string { "Наслов" } - dateColumnLabel:string { "Датум" } - statusColumnLabel:string { "Статус" } - - mtimeTextLabel:string { "#Modified since:#" } - chooseTimeButtonLabel:string { "Изабери време" } - resetTimeButtonLabel:string { "Ресет" } - - backupButtonLabel:string { "Бекап" } - deleteButtonLabel:string { "Избриши" } - saveButtonLabel:string { "Сачувај" } - - backupTitleLabel:string { "Бекап:" } - defaultBackupTitle:string { "нови бекап" } - - fileChooserDialogTitle:string { "Сачувај фајл" } - backupErrorMsg:string { "Грешка у бекапу: " } - } - - rdsView:table - { - deviceLabel:string { "Серијски порт:" } - PSrdsLabel:string { "Име станице:" } - PIrdsLabel:string { "Шифра станице:" } - RTrdsLabel:string { "Информација о клипу:" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Одаберите датум и време" } - - cancelButtonLabel:string { "Откажи" } - okButtonLabel:string { "ОК" } - - hourLabel:string { "сат:" } - minuteLabel:string { "минут:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Пребаци плејлисту" } - - playlistTitleLabel:string { "Наслов:" } - formatLabel:string { "Пребаци као:" } - - cancelButtonLabel:string { "Откажи" } - saveButtonLabel:string { "Сачувај" } - - internalFormatName:string { "Цампцастер архива" } - smilFormatName:string { "тар који садржи СМИЛ" } - - fileChooserDialogTitle:string { "Сачувај фајл" } - - createExportErrorMsg:string { "Неуспело пребацивање плејлисте:" } - - saveExportErrorMsg:string { "Неуспело чување пребачене плејлисте." } - } - - transportList:table - { - workingStatus:string { "У току..." } - successStatus:string { "Спремно" } - faultStatus:string { "Грешка: {0}" } - - titleColumnLabel:string { "Наслов" } - dateColumnLabel:string { "Датум" } - statusColumnLabel:string { "Статус" } - - cancelUploadMenuItem:string { "Откажи упућивање" } - cancelDownloadMenuItem:string { "Откажи преузимање" } - - cannotCancelTransportMsg:string { "Неуспело отказивање." } - duplicateFileMsg:string { "Фајл је већ на централном " - "серверу." } - } - - restoreBackupWindow:table - { - windowTitle:string { "Поврати бекап" } - errorMessage:string { "Грешка: {0}" } - pendingMessage:string { "#Uploading backup file\n''{0}''.\n#" - "Сачекајте..." } - finishedMessage:string { "Завршено упућивање." } - } - - metadataTypes:table - { - title:string { "Назив" } - creator:string { "Аутор" } - album:string { "Албум" } - year:string { "Година" } - genre:string { "Жанр" } - description:string { "Опис" } - format:string { "Формат" } - length:string { "Дужина" } - bpm:string { "BPM" } - rating:string { "Оцена" } - encoded_by:string { "Енкодирао" } - track_number:string { "Редни број снимка" } - disc_number:string { "Редни број диска" } - mood:string { "Расположење" } - publishing_label:string { "Издавачка кућа" } - composer:string { "Композитор" } - bitrate:string { "Битрејт" } - channels:string { "Број канала" } - sample_rate:string { "Брзина узорковања" } - encoding_software:string { "Енкодер" } - checksum:string { "Комплетна контрола" } - lyrics:string { "Текст песме" } - orchestra_or_band:string { "Оркестар или бенд" } - conductor:string { "Диригент" } - lyricist:string { "Текстописац" } - original_lyricist:string { "Оригинални текстописац" } - radio_station_name:string { "Име радио станице" } - audio_file_info_url:string { "Веб страна са информацијама о фајлу" } - artist_url:string { "Веб страна извођача" } - audio_source_url:string { "Веб страна извора" } - radio_station_url:string { "Веб страна радио станице" } - buy_cd_url:string { "Купи ЦД преко веб стране" } - isrc_number:string { "ISRC број" } - catalog_number:string { "Каталошки број" } - original_artist:string { "Оригинални извођач" } - copyright:string { "Ауторска права" } - report_date_time:string { "#Report date/time#" } - report_location:string { "#Report location#" } - report_organizations:string { "#Report organizations#" } - subject:string { "#Subject#" } - } - - keyboardShortcuts:table - { - playAudio:string { "Плеј" } - pauseAudio:string { "Поуз" } - stopAudio:string { "Стоп" } - nextTrack:string { "Следећ трак" } - fadeOut:string { "Фејд аут" } - moveItemUp:string { "Помери горе" } - moveItemDown:string { "Помери доле" } - removeItem:string { "Уклони" } - } -} - diff --git a/src/products/gLiveSupport/var/stationLogo.png b/src/products/gLiveSupport/var/stationLogo.png deleted file mode 100644 index fba91b3cc72eda4c7aac5664a94571db46e8a6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3612 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" } - } - - liveModeWindow:table - { - windowTitle:string { "Liveläge" } - - playMenuItem:string { "S_pela" } - cueMenuItem:string { "_Förhandskoll" } - addToPlaylistMenuItem:string { "Lägg till i _Spellista" } - removeMenuItem:string { "_Avlägsna" } - editPlaylistMenuItem:string { "_Redigera Spellista" } - schedulePlaylistMenuItem:string { "S_chemalägg Spellista" } - exportPlaylistMenuItem:string { "E_xportera Spellista" } - uploadToHubMenuItem:string { "Ladda upp till nätverksnav" } - - cuePlayerLabel:string { "Förhandskoll" } - autoPlayNextLabel:string { "spela nästa automatiskt" } - - clearListButtonLabel:string { "Rensa listan" } - removeButtonLabel:string { "Avlägsna post(er)" } - - cannotEditPlaylistMsg:string - { "Kunde inte öppna spellistan för redigering." } - } - - optionsWindow:table - { - windowTitle:string { "Val" } - - needToRestartMsg:string { "Du måste starta om programmet " - "för att\nde nya inställningarna " - "ska verkställas." } - errorMsg:string { "Kunde inte spara valen: " } - - soundSectionLabel:string { "Ljud" } - keyBindingsSectionLabel:string { "Kortkommandon" } - serversSectionLabel:string { "Servrar" } - schedulerSectionLabel:string { "Schemaläggare" } - backupSectionLabel:string { "Backup" } - rdsSectionLabel:string { "RDS" } - aboutSectionLabel:string { "Om" } - - cancelButtonLabel:string { "Avbryt" } - applyButtonLabel:string { "Verkställ" } - okButtonLabel:string { "OK" } - - cueDeviceLabel:string { "Förhandsljudenhet:" } - outputDeviceLabel:string { "Livelägeljudenhet:" } - testButtonLabel:string { "Test" } - - pressAKeyMsg:string { "Tryck en tangent..." } - keyBindingsInstructionsText:string - { "Dubbelklicka på den genväg du vill " - "ändra, \n" - "tryck sen tangenten för den nya " - "genvägen\n" - "(eller tryck Escape-tangenten för " - "att avbryta)." } - - authenticationLabel:string { "Autentiseringsserver" } - storageLabel:string { "Lagringsserver" } - schedulerLabel:string { "Schemaläggningsserver" } - serverLabel:string { "adress:" } - portLabel:string { "port:" } - pathLabel:string { "sökväg:" } - - schedulerStatusText:string { "Schemaläggaren" } - schedulerRunningStatus:string { "körs." } - schedulerStoppedStatus:string { "körs ej." } - schedulerStartButtonLabel:string { "Start" } - schedulerStopButtonLabel:string { "Stopp" } - - reportBugsToText:string { "Rapportera buggar till: {0}" } - creditsText:import { "../../../../CREDITS" } - } - - backupView:table - { - workingStatus:string { "På gång..." } - successStatus:string { "Klart" } - faultStatus:string { "Fel: {0}" } - - titleColumnLabel:string { "Titel" } - dateColumnLabel:string { "Datum" } - statusColumnLabel:string { "Läge" } - - mtimeTextLabel:string { "Ändrad sedan:" } - chooseTimeButtonLabel:string { "Välj tid" } - resetTimeButtonLabel:string { "Återställ" } - - backupButtonLabel:string { "Backup" } - deleteButtonLabel:string { "Ta bort" } - saveButtonLabel:string { "Spara" } - - backupTitleLabel:string { "Titel:" } - defaultBackupTitle:string { "ny backup" } - - fileChooserDialogTitle:string { "spara fil" } - backupErrorMsg:string { "Backup-fel: " } - } - - rdsView:table - { - deviceLabel:string { "Serieport:" } - PSrdsLabel:string { "Stationsnamn:" } - PIrdsLabel:string { "Stationskod:" } - RTrdsLabel:string { "Ljudfilsinfo:" } - } - - dateTimeChooserWindow:table - { - windowTitle:string { "Välj datum och tid" } - - cancelButtonLabel:string { "Avbryt" } - okButtonLabel:string { "OK" } - - hourLabel:string { "timme:" } - minuteLabel:string { "minut:" } - } - - exportPlaylistWindow:table - { - windowTitle:string { "Exportera Spellista" } - - playlistTitleLabel:string { "Titel:" } - formatLabel:string { "Exportera som:" } - - cancelButtonLabel:string { "Avbryt" } - saveButtonLabel:string { "Spara" } - - internalFormatName:string { "Campcaster-arkiv" } - smilFormatName:string { "tar innehåller en SMIL" } - - fileChooserDialogTitle:string { "Spara Fil" } - - createExportErrorMsg:string { "Kunde inte exportera spellistan:" } - saveExportErrorMsg:string { "Kunde inte spara den exporterade spellistan." } - } - - transportList:table - { - workingStatus:string { "På gång..." } - successStatus:string { "Klart" } - faultStatus:string { "Fel: {0}" } - - titleColumnLabel:string { "Titel" } - dateColumnLabel:string { "Datum" } - statusColumnLabel:string { "Läge" } - - cancelUploadMenuItem:string { "Avbryt uppladdning" } - cancelDownloadMenuItem:string { "Avbryt nedladdning" } - - cannotCancelTransportMsg:string { "Avbrytning misslyckades: {0}." } - duplicateFileMsg:string { "filen finns i nätverks" - "navet redan." } - } - - restoreBackupWindow:table - { - windowTitle:string { "Återställ Backup" } - errorMessage:string { "Fel: {0}" } - pendingMessage:string { "Laddar upp backup-filen\n''{0}''.\n" - "Vänta..." } - finishedMessage:string { "Uppladdning färdig." } - } - - metadataTypes:table - { - title:string { "Titel" } - creator:string { "Skapare" } - album:string { "Album" } - year:string { "År" } - genre:string { "Genre" } - description:string { "Beskrivning" } - format:string { "Format" } - length:string { "Längd" } - bpm:string { "BPM" } - rating:string { "Kvalificering" } - encoded_by:string { "Kodad av" } - track_number:string { "Spårnummer" } - disc_number:string { "Skivnummer" } - mood:string { "Stämning" } - publishing_label:string { "Utgivande märke" } - composer:string { "Kompositör" } - bitrate:string { "Bithastighet" } - channels:string { "Kanaler" } - sample_rate:string { "Sampelhastighet" } - encoding_software:string { "Kodningsprogram" } - checksum:string { "Kontrollsumma" } - lyrics:string { "Text" } - orchestra_or_band:string { "Orkester eller band" } - conductor:string { "Dirigent" } - lyricist:string { "Textförfattare" } - original_lyricist:string { "Originaltextförfattare" } - radio_station_name:string { "Radiostationsnamn" } - audio_file_info_url:string { "Filinfowebbsida" } - artist_url:string { "Artist webbsida" } - audio_source_url:string { "Källans webbsida" } - radio_station_url:string { "Radiostationens webbsida" } - buy_cd_url:string { "Köpa-CD-webbsida" } - isrc_number:string { "ISRC-nummer" } - catalog_number:string { "Katalognummer" } - original_artist:string { "Originalartist" } - copyright:string { "Upphovsrätt" } - report_date_time:string { "Rapportera datum/tid" } - report_location:string { "Rapportera plats" } - report_organizations:string { "Rapportera organisationer" } - subject:string { "Ämne" } - } - - keyboardShortcuts:table - { - playAudio:string { "Spela" } - pauseAudio:string { "Paus" } - stopAudio:string { "Stopp" } - nextTrack:string { "Nästa spår" } - fadeOut:string { "Tona ut" } - moveItemUp:string { "Flytta upp post" } - moveItemDown:string { "Flytta ner post" } - removeItem:string { "Avlägsna post" } - } -} - diff --git a/src/products/gLiveSupport/var/testAudio.ogg b/src/products/gLiveSupport/var/testAudio.ogg deleted file mode 100644 index e8adff4b52e9baad1662439981ff0ca0ca571554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17343 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 PwNxg$+Dp1dM$!KT8*Kk> diff --git a/src/products/gLiveSupport/var/widgets/blueBin/bottom.png b/src/products/gLiveSupport/var/widgets/blueBin/bottom.png deleted file mode 100644 index dc9abc5a432cf36a30ab0a0a8dba60193487a679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2818 zcmV+d3;pzoP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C03S(2K~#9!VmxyG9s>gd0|Nu&<0o&StPdZ*L0EtR0E_Gh U01#`XSO5S307*qoM6N<$f)AQiM*si- diff --git a/src/products/gLiveSupport/var/widgets/blueBin/bottomLeft.png b/src/products/gLiveSupport/var/widgets/blueBin/bottomLeft.png deleted file mode 100644 index 71c70b8591ae55dc379edcdc177f685b1ef031df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 diff --git a/src/products/gLiveSupport/var/widgets/blueBin/left.png b/src/products/gLiveSupport/var/widgets/blueBin/left.png deleted file mode 100644 index 38bb0f431fd1c13c3a289cd15964de937dd806d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 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 TZ{)HF00000NkvXXu0mjfSp-=} diff --git a/src/products/gLiveSupport/var/widgets/blueBin/right.png b/src/products/gLiveSupport/var/widgets/blueBin/right.png deleted file mode 100644 index 730c9c3b7a9d6efe555038483d1ffffd3a4563e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 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 TVb6Wr00000NkvXXu0mjf)-qOB diff --git a/src/products/gLiveSupport/var/widgets/blueBin/top.png b/src/products/gLiveSupport/var/widgets/blueBin/top.png deleted file mode 100644 index df1c5d45aec25da268286ef9a62472873b8f61a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2819 zcmV+e3;gtnP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C03b<3K~#9!Vtn-U1p@;E0|Nu&$}PJgES3i^-$7V_0RV>H V2ZeCzUrqo3002ovPDHLkV1kC|R^9*r diff --git a/src/products/gLiveSupport/var/widgets/blueBin/topLeft.png b/src/products/gLiveSupport/var/widgets/blueBin/topLeft.png deleted file mode 100644 index 6fb4deb28dcc4e2aec692ccd143f527d0ab66116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 diff --git a/src/products/gLiveSupport/var/widgets/blueBin/topRight.png b/src/products/gLiveSupport/var/widgets/blueBin/topRight.png deleted file mode 100644 index 0ea6a2bb3bd98770f6a03c514e55421fd193d2f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 diff --git a/src/products/gLiveSupport/var/widgets/button/center.png b/src/products/gLiveSupport/var/widgets/button/center.png deleted file mode 100644 index 3d708dbdf59b27178ae99855b0d89afe6dbff4ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2891 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 diff --git a/src/products/gLiveSupport/var/widgets/button/centerGray.png b/src/products/gLiveSupport/var/widgets/button/centerGray.png deleted file mode 100644 index 3d708dbdf59b27178ae99855b0d89afe6dbff4ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2891 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 diff --git a/src/products/gLiveSupport/var/widgets/button/centerRoll.png b/src/products/gLiveSupport/var/widgets/button/centerRoll.png deleted file mode 100644 index 992df804006fe03d99044cb28fcbdaa60dd45528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 zcmV-P3%2x$P)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0A@)S{^^N3%<9d6jNZg;V$}XyNcI%R;%%<#()fCM>FA4vL`!uI*zQoa{^Z-73w9H}K n2J~~d(=r+j#T$tI>C!d;q*yw?xoN;K00000NkvXXu0mjf*j<5r diff --git a/src/products/gLiveSupport/var/widgets/button/centerSel.png b/src/products/gLiveSupport/var/widgets/button/centerSel.png deleted file mode 100644 index 366729d6e59f9bac5251143b05abb9f82efc784d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2896 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 Tv!~vL00000NkvXXu0mjf>?W%` diff --git a/src/products/gLiveSupport/var/widgets/button/leftSel.png b/src/products/gLiveSupport/var/widgets/button/leftSel.png deleted file mode 100644 index 51302ea922f8884498d4b3731b2f9d10299cf4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3100 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 TKHluq00000NkvXXu0mjfVEou+ diff --git a/src/products/gLiveSupport/var/widgets/button/rightGray.png b/src/products/gLiveSupport/var/widgets/button/rightGray.png deleted file mode 100644 index 616eb6d940e7c9fe224837a8d8949df5eac6e00a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 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 TKHluq00000NkvXXu0mjfVEou+ diff --git a/src/products/gLiveSupport/var/widgets/button/rightRoll.png b/src/products/gLiveSupport/var/widgets/button/rightRoll.png deleted file mode 100644 index d5e2fffaa39ab5ce7ed148929f5f9876fbbbb384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3073 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 diff --git a/src/products/gLiveSupport/var/widgets/button/rightSel.png b/src/products/gLiveSupport/var/widgets/button/rightSel.png deleted file mode 100644 index f60b0d25d0ce4758e92defc61a117d7fb553db00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3096 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 diff --git a/src/products/gLiveSupport/var/widgets/combo/right.png b/src/products/gLiveSupport/var/widgets/combo/right.png deleted file mode 100644 index d1df5fb57fbb3b818c61921dabe5b616944d89cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3464 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 T@A=ww00000NkvXXu0mjfr>a#H diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/bottomLeft.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/bottomLeft.png deleted file mode 100644 index 55325d4e7c63fd5e669b5d423b118396be3b2ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/bottomRight.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/bottomRight.png deleted file mode 100644 index 3852da14ac18c0a01e59692a7805120f4550b95e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 zcmV+p3-R=cP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C04qsEK~#9!03HD0{{X1I;MLgW@9^~j*xKd?2n7}s4FT}+ g^#ue22L}ZM00)r`hT_qLga7~l07*qoM6N<$f(>F_+5i9m diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/left.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/left.png deleted file mode 100644 index d27061d9b0b5430d24bb95b654894ce99ec9e88c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 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 T!LV3o00000NkvXXu0mjfRVrC> diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/right.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/right.png deleted file mode 100644 index 7fcdc81b402ad8a9e0f5362731feea51eb65cb29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 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 TJh3BW00000NkvXXu0mjfOhs7; diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/top.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/top.png deleted file mode 100644 index df1c5d45aec25da268286ef9a62472873b8f61a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2819 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 V2ZeCzUrqo3002ovPDHLkV1kC|R^9*r diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/topLeft.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/topLeft.png deleted file mode 100644 index cd3f1215992822da0ac23c87c77f5e3f7ec04687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 diff --git a/src/products/gLiveSupport/var/widgets/darkBlueBin/topRight.png b/src/products/gLiveSupport/var/widgets/darkBlueBin/topRight.png deleted file mode 100644 index ba5b8556cbd5699a39274e10e03901b9cb7f2f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 zcmV+p3-R=cP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C04qsEK~#9!03HD0{{Zv#_Wl0;|Ns92>+SCV|Ns8}{{pn( g5cl`{`uqF?0CABR82Ng=DF6Tf07*qoM6N<$f?Shm5dZ)H diff --git a/src/products/gLiveSupport/var/widgets/entryBin/bottom.png b/src/products/gLiveSupport/var/widgets/entryBin/bottom.png deleted file mode 100644 index a1fcad5406421711a68c3444deb1189bb14526ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02L{Ex;TbZ+)A>kd#cFHv*FK=U&03k m#UHp8xVZj!Ak)CW%5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02MiTx;TbZ++r|cIQ^gT^}F}C?mc?^ z?z5_*BIA#rzrK9?_VDeuZ=b%iu(7i6a`VXjWB$Oz478Y$iII_ugO!HYF6K+_mJUHx3vIVCg!01BQq>i_@% diff --git a/src/products/gLiveSupport/var/widgets/entryBin/bottomRight.png b/src/products/gLiveSupport/var/widgets/entryBin/bottomRight.png deleted file mode 100644 index 80059ed4386b4ca9b5f378319e9c4d105df42806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02MiSx;TbZ+)A>kd-`y{ef|Ic|JUni zp853n_4)t*|NZ@c{=?hj`eKEQc?z>9PMkQkb>_#fx6k+R@c8)jym_;Rfsu_N)<$yU T#713Hpjix_u6{1-oD!M<5feYt diff --git a/src/products/gLiveSupport/var/widgets/entryBin/left.png b/src/products/gLiveSupport/var/widgets/entryBin/left.png deleted file mode 100644 index a9a6f95de1bb19896d5468eac866dbedba6b6cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02Rr3x;TbZ+)AqX_UY@+)#mT_R;*sR i>d=t}mV#miCLV@%agJm!8O8fRl?5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02Rr3x;TbZ+)A>kfB$p-{rdm^{;gJ0 jJ#wUhrJ$IBiHBkK8jh>0%jU`gRWf+G`njxgN@xNAjua|( diff --git a/src/products/gLiveSupport/var/widgets/entryBin/top.png b/src/products/gLiveSupport/var/widgets/entryBin/top.png deleted file mode 100644 index abbdcd90bed0f1805a6398b4187c0680f78f94ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02L{Ex;TbZ+)CP0_S=q`XM>DQCEvly lKfi37l9Lv&KWAW(U{J{9aP{4}vKFYA!PC{xWt~$(69AjOC|Lji diff --git a/src/products/gLiveSupport/var/widgets/entryBin/topLeft.png b/src/products/gLiveSupport/var/widgets/entryBin/topLeft.png deleted file mode 100644 index b947502812ee5cbddc103a02b2bd7d5dde0a4d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02SGLx;TbZ+)DcM_4W7V`tkO)f4NdN z)cpMR_S4zj<#KlaK0nt#{eAxaxV^RI|9?uev9XCMq$MXmefDh9Gy!%F0|xcO^0fxc S0(*c)F?hQAxvXweC diff --git a/src/products/gLiveSupport/var/widgets/entryBin/topRight.png b/src/products/gLiveSupport/var/widgets/entryBin/topRight.png deleted file mode 100644 index 9b95fafba3097ddfc44d3ace47b8b1979b74019a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=G$9T=9=E0`etGTq8a>QWZRN6Vp?JQWH}u3s0un02SGJx;TbZ+)CP0_S;Tcn_HjXT%O;2 zbKlOpi_`W0{r}JZ#Mrj(@4uhF&+FU$WjM8AhQtd_t`DC-e)#kAGrz(C2BjaO2WF?$ RxdKgM@O1TaS?83{1OPyAJSzYI diff --git a/src/products/gLiveSupport/var/widgets/icons/audioClipIcon.png b/src/products/gLiveSupport/var/widgets/icons/audioClipIcon.png deleted file mode 100644 index f7adf90a85b7633f72fc58a21e9b9e9a029c311e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^{2H9D zV+hA}-?KOQS`>I3E-G<_37&dnwD`pT|4WTKb!x3WtGPe)rE%W+xnPoWYS3eo!r(to zPpwndmo_rGA^I}M`}g~dY5MGn|0*Xl&&v6%?Rfq4tbN;~zqmi!80cc-T=u-McgvL0 ow;UHYKPs?%|Lnq(n?aBHJ;GQOGZ$W13ACTV)78&qol`;+03L3S5&!@I diff --git a/src/products/gLiveSupport/var/widgets/icons/playlistIcon.png b/src/products/gLiveSupport/var/widgets/icons/playlistIcon.png deleted file mode 100644 index 2f41a4678eb3244bf52bf2211ff94aa0268a1693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^{2JLg@h_i0KYIN5QeR3fOC9_|D z`ub==`TsdF|5p{?IDPo@t0#?3O;2;=fB*mg_vg3kIT~*&^b%G6+5_!kED7=pW^j0R zBMrn!@^*J&=wOxg0CG4BJR*x37`TN&n2}-D90{Nxdx@v7EBjS;Nq#n&2*LQXK%ps~ zE{-7_*G>B(g$^t5I7j*@=CrA$EI#^ue`=z~*Qe%_bdAlPUjIBZF3UscX{iy9?#g8% zYRZqoR&n%-9oxe6eyfpWZO&5pN6K|UjJn|mCBED4@6+qbM5=I%#NJAf9G!*qYclsEjjKhpM17W*DpD@Fl26O&&R&tx%Cn& WIipS#Jah-TkHOQ`&t;ucLK6UyzNPa3 diff --git a/src/products/gLiveSupport/var/widgets/imageButton/delete.png b/src/products/gLiveSupport/var/widgets/imageButton/delete.png deleted file mode 100644 index 1919d297ccc8124ed794c4a1b5a50364f3a4e02d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3493 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 diff --git a/src/products/gLiveSupport/var/widgets/imageButton/hugePlayRoll.png b/src/products/gLiveSupport/var/widgets/imageButton/hugePlayRoll.png deleted file mode 100644 index 55ea1ab2ab914505e4751daf25cc5e05cf5b020f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3683 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 B2iX7s diff --git a/src/products/gLiveSupport/var/widgets/imageButton/masterPause.png b/src/products/gLiveSupport/var/widgets/imageButton/masterPause.png deleted file mode 100644 index 910a2a8b9dbd929039d8d9646fca9232e1e9039e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcmV-71jze|P)5?eF#c{QdX%`rza4)Y#|D(c}F6{_pYj(bnbo`1{%1>g49|naux9 zh{1J)lun4hb%d3Pyzfqkz-oq|aD|$5gq3lHnRJAfXojP2g`0APm~(`dZH1j{g`aYT zmu`idZH1gsh`dsY!Doh~YlWWm_W9%G@8RU`ZHS}Q+2`2Y>1l?dbA*>_hM~>U0b^85V#+1=`Fg`Q7{zQD)aQ;51*hqO|NyV~9AWQM0sh{0lqsq^&s?(p@( z$lX?lwp5D0$IRdR`~CR&`%j3y$=<4kARfo6f>+|&W`Q_;F_V@bt`1?|b zy2i`j)7R$u`uyDB>`;ik`TG3h=I{CW{Az}u%+cakhqcSl;_~zO-Qn!t;_c<<@bU8Z z{{H^#?(}YjoK%RpPKds1h^F4*?CkFK&eP-D-s``{+h&HQ#me5t&ERB*sLs>m{r>)D zhNax!>rjZiYKEfb>G9FkDmmi%><@+v~%x5+)_L*dsIhACg_+(XL zs@C&Rv$3&;U#ruoM-|DFNn^#A$xO+LM;wE+IY%IK3LwtBByI~%hFYGAA>z1oS$=UN?DdK+kgz-xuk%lh+US zB0x`f|Ne)b{(Rx{%JZeX-^%;V2>b2tzYkm`_+EPq^mf2r7kNiOZ=eL;51^+z{|w;i z&QlK01NL<1DW?~?NB=Yb^#6#{>jiqsJRJagoj}iB0X4t{&I51OC)UEnNyoSF;JB~R=gHu5S%%T*{8bVR2omF21DgL${xzZD8@IC#5`RcF^Fg}Xh! x%!k9_4y9JL=AYI7DM_oo!uciieDy|v0RYLzd!4q&&3^y@002ovPDHLkV1n38aOnU5 diff --git a/src/products/gLiveSupport/var/widgets/imageButton/masterPauseRoll.png b/src/products/gLiveSupport/var/widgets/imageButton/masterPauseRoll.png deleted file mode 100644 index 8e8d9bccf9fd68897c26961165ccecce15d886c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 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 Vf?CxEqY3~3002ovPDHLkV1nW0odN&= diff --git a/src/products/gLiveSupport/var/widgets/imageButton/masterStopRoll.png b/src/products/gLiveSupport/var/widgets/imageButton/masterStopRoll.png deleted file mode 100644 index 8f7ecc0b0913d5bad6618731b030e52747f9ac64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148 zcmV-?1cUpDP)PY@ z!F7a`PKdvCgq4ZB?@oxoYKEY2g_?APm2rica)p?5gqCQAqi=2qx%GmD9+3$0NmuZHgYlWU{ zg`UFF>f`YK%-itK-ttd~zEg<0ti9a2$>ibh{cDJ&vcca{h`U&av}A^-S%c-t7Cm%;wSG^U~n+Pl&y{%H_k->doBn zQi!^=!{Jqjx8d&n-Rt{Kh{0lqso?GWP>8+7)a=LA>{E)sxya<-?fh+po@0loYKEWL z=J>|d>{N)k&fW2`z~0T<@Vv|BR)@E%yxVGqqRZOvW`?Fzh`6%C;AV!UWQVA>#o|tg zzEFs~Wrn83)9baw;a7*X)Z+E9z}{Jhv%%2lxya++?EGSfs@UfDYlx=T<@Z&JzT@%! zYKW#(h`P7N;%Ka#!UiA#IUfmAS5AZ3Ly!Q z1_@xH_l|&oz4zV~?1Gdp?76GX;EcO7-u%bONS@a_zq$M3p4pwloIF*^JynyKrX4NS zZE30E_sVoSr-|gLq_Nyfr$Eq1%&%DW}oftfq5p|Vt>@{7=n3biyZ06bdy&G^Mau{q-PC=+M!-i@dnttM&47P z_kg@K&^t}u6xdqKqgU~dlSog}Y4kG;3#y$5^%Z{ZlifB=rsX7!+9#;dBL9HJQei9`{;k>pZ*^SdaXc@&(k)rcM<4$$a90e2A~%s z?;FsoC(jG?YRRj^d7IVbZDG8@?Va%_+^a%(yV=0x)#;bzdpuJvB`#b^#n&J1@e&D} zaOUiCK#mm6-{4-2cDRLiV~0drv5^IaWx6p8QOK6(OjDsr}WCLS*l%I^<4LR|y=c-nrj z)8mP*`h(-Q9D+?}isy$F&i&k9cE)0{dS0zo^^eN`l%iMjul*%-zxo|anSt_xuZs@= O0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0>Vi|K~#9!td+}4)KL`2&;2=q66Rx|u~BOr$?QQh*<=IJ zrqDKJvV8EaVS8iOi7@>zkB;jj(FpZWLqWylqd(WfAb#z8_ zjPT1{+=#oUFXFsIe4Uf34 z*VP&8>+L4uzTWPx&Y0_ZL&GE1P0R8%YE9ZFZ3vMSNWcLu)RYOCMT&2t)9oi(kF{J$ zUep@x&dr{ywTEk}tEzk-t*zRS@8gE6|9Dz!5)cPiO-wH=F0EcZe+rQd@+SBn4xo)g zVq?hj(e;e)BN8kAaWoVPoNR5%E&cR-)EbQ;BqkPN5s)&SA^;%3!bGACX@go5A}OUR zm9#}80RU(U1;-~QqAjhyMq`SzE|<9N0Vc67Gl^1A9aw1$9of8p0o2s&{P(400I01E zYmG#VRE}ytaiJeX;85iX0E9xJXf$fM0su+@08GzhEq&`>Rq3MudoH($R(}ToHT1-X TKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0<}p*K~#9!td&b^Q$ZBR|8pB5P*NL3Z)&tA@m(KDgQ9Mg z)(U=W!vfEUiKO27<1Ab|Jd3#?(ra_`*lk$;^4Um^7xPi6H)&#XX0^@1FCY zxpR%GVnxqtU#iVztS{{j%&JfgkdITP+@?PTB4Ui`5KoS6$3N-ei&~%`$!!i?om==) zZ7%;av0IN{RC96aNN!66XtnwMzd!*T9V@(TegzQC)jk_l{3kib2J*c2eqi$aY z_Nu!zQ+fF4$-({m6B`mCvs7(Hh6YoM^+pt-U$Y~bOuf;# zHCwU2Y=BPBR;;xnnamof^Xxr2N6t|M8MtuqT6XKEUfe=H_kH=ttNHnAZ6Tc=zJ2Ge zwYEH7nwmV_eE^x2i5;p%GP`OlG_qp2#QDsqPVbKU00n#5DJOz;6I1FHVwz5=jtbw+?O+=8DJryPiLv>!WclVyr?K_SiJLVmQ%*3fv zL#b3UnRG1*<9pAo7X7r&TIU=qbZ|h-%h!wVnx6~14-m0u(Y55B3U$Ono?DKr^{z!E zvL*RpB#smN^4X>4N9)Kt@}7hDs;baFCq)4$RE1f+XXnX#CSqfZf$l2g5&*LC=KA8x z!F0ami98dDw7c%tcrZa(NyHN?t1-w9eaggJ+xIVE=HI-nH{SzriEYkNr|UjY020`u zsu+bto|vWXZVL0^m_m-o-S9y!lz~c0000MP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0y{}WK~#9!td&1+6G0HgXHOR?5kirO#0BFZ`%ofiP`V%* zDk?fCC@J{@^wfL=N=l>@AijiY03)IRk?kWfAx`8Z5`TO*J2Q{soY*Fuu^_LynO*(# z_TB8A13*W5lN>fX-|5f7aN$NuIHGEFcDZtHup#Fj6Ys8+>7VrcRg%-MRpy9@0K9G; ztk$-08hTM{)LXj%2*7G>6Q`$_wG9Bl+hl( z67EJb>7{AWDu6VTH1pS&%3C}8;e=+#3jlj%mW)Nj0yjP!d$N23Y z9KKuoFx;uHeLRl1T$*2uD*b^iv9L_>8Hl$;ZA#dr@MccKhI20FUEr$ z%%BEUQ$;`sgJQqs()@$__m0blj~?H?b#pPUoD3I$p$`?+fGl*dzuei;K7L1%8C2oD zdQmSbY7Qsfn;8s+CoqMo4P*0IGZtp$OxdfdIYOTcB2`l{15nKMqResx?Q_{{mdTGE z|4f-#K?um)db9nd)4j2LRYbj5AB>4+7C=5*X(qkYXPJnav%L#Z6ke%b-0tk9nJ|m@ zDr#zg0faF(21Eohm@3#Sdtp`)bIJ(U;qFB diff --git a/src/products/gLiveSupport/var/widgets/imageButton/plusRoll.png b/src/products/gLiveSupport/var/widgets/imageButton/plusRoll.png deleted file mode 100644 index ba4fea1ace56a08afd6c775a8f061f321630659b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3349 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 diff --git a/src/products/gLiveSupport/var/widgets/imageButton/smallPause.png b/src/products/gLiveSupport/var/widgets/imageButton/smallPause.png deleted file mode 100644 index 215b61480ef8a630e9f9c381c827b67a842ae328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3320 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 diff --git a/src/products/gLiveSupport/var/widgets/imageButton/smallPlayRoll.png b/src/products/gLiveSupport/var/widgets/imageButton/smallPlayRoll.png deleted file mode 100644 index d628bd8c1a51b2a641c8701f8f263721822d237e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3393 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 Hu0mjfDM70v diff --git a/src/products/gLiveSupport/var/widgets/imageButton/windowMax.png b/src/products/gLiveSupport/var/widgets/imageButton/windowMax.png deleted file mode 100644 index d95961b453c6c0a0908247eb881f3be709554944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352 zcmV-m0iXVfP) z|3cFaRZW?CRM}&l?~%WE2tMt~VgobQ<+gHOnVsTd=6jTLJ6dZtZ?u~FzII21*~T?m y$o~a4Zy;hEq~repyke=9jNFC-ji?_#0t^6w#0Vd9tn3Q_0000U_5`_D1!%XYl4_0001|Nkl*q$&F+t%YIr5yS&2{?Kl;Mfz*g+A@7;O9#j(QCpVEv`XDAlWAJJz3mXWQW24? zw5+_-9`o0Qz9vFSmY@4J+=mhU+c4LA9OY%+rxMJV%A33Q@WvR`o3>1m(S(j#i6%Mx yL14TTb?UtP)BQ3CZh#Z$0001#Nkl28_0(Z;+#k&SQ{MxA)62>Wzqu4ka_! fn7nS|SAYQkz7`4Y^Sken|CzaI_f^(@Qw@vSken|CzaI_f^(@Qw@vaP<ov=r#aD|A{U+WqoBs9LnUxNoOjRS_ z^xe&|Ogru=Rt W{R!=_n@xbuXYh3Ob6Mw<&;$SwlxH{q diff --git a/src/products/gLiveSupport/var/widgets/tabButton/leftGray.png b/src/products/gLiveSupport/var/widgets/tabButton/leftGray.png deleted file mode 100644 index 1899b75bc82f2d005206a71700a83a93fbf77753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmV-30nGl1P)Y6rA1MRbnGT z8U@impjCcI{-z-KD@pkOJnoiEXQY0T2tJ{ZH?gJ!$swDk9w1edsjFa>@fU3s{XfDO9Z#bZ?M>R$VPyOEb z)AE04n6U!bdr46+QjSuT#k?LXN#0H zibl~c=B`U_yWOYo9-0pTH|M94i)wMZqkax=%cgYzfKOJBwjQnE2*m&Z002ovPDHLk FV1jY0dmsP+ diff --git a/src/products/gLiveSupport/var/widgets/tabButton/leftRoll.png b/src/products/gLiveSupport/var/widgets/tabButton/leftRoll.png deleted file mode 100644 index 993f0d6e86978f59c76077af3424b1d68ab96439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^96&6`!2~4dJvtEuq&N#aB8wRqxP?KOkzv*x37{Z* ziKnkC`!!A`Az7^{_jUIGh30s=IEHAPf7@rx$7IOEdcUosZ&q8|H0gr>%x`!v1Sz;| zXYHD7u}yOm*M6A>rt*0k|Juxuta=(hyKt8O_TRHJUR2z$bzRDPwTNM#CWED`u4kFldT;%~49%3kpfR=h#`aKt|*Ei8D%z yPP4i4OQwe%eMjD$>8bg=d#Wzp$P!R2wcYi diff --git a/src/products/gLiveSupport/var/widgets/tabButton/leftSel.png b/src/products/gLiveSupport/var/widgets/tabButton/leftSel.png deleted file mode 100644 index ea3ca2bef70d83ddde59cb3505b17f6eadeb182e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmV-@0fPRCP)h z(DFHaJ^TTrr6R+G?5!DRcrb@|h{xs3=8w?5$WTBd9HFqp~zE(8E&#NNJ{K z)W*uvn7C6(_M)DmX4axu8h{sF^2XZx1Xc2AP!LgC)TCAxWy_<(lL~5P&8(s%*&ZGG zySSycB(ublYwnG} diff --git a/src/products/gLiveSupport/var/widgets/tabButton/rightGray.png b/src/products/gLiveSupport/var/widgets/tabButton/rightGray.png deleted file mode 100644 index fda8122ede2df0b5016231f7f3c2270857f31e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmV;F0c-w=P)7O%xNuEHOz@G0oD@u|8>}*V(a;8Xe8l*BA$uTm55fTNU z^pPXjTC|pZWF#dQpq#cCBexc(HhRyb9{5|WwR}JJh}>HC9wRxwz`CyGcHJfIEHAPf7@s1&Fm=BlK%bLqgxs}#}tkz33)s{|6M$S zbCDy5hS)}n-7{wF-c$R&*R?6>%B^GT=k!aeO*rDe}acS~Phm|tbGGh-IpfqeoS8R{!)e$6Qga`83{jXsmFT=y{k zPp1cq$E=-Vw?(uUWyu}5veoI(ozPt6s3TWwm|o`U?rz&95^7q0%^^xBdcwPquen?c z_&ippx?l3NI?K7Bi;>+USDk_50;j^UfTLUvR_o&T)t|N8&%9Q6QfiVZ(@CHw89ZJ6 KT-G@yGywpRR(Q?; diff --git a/src/products/gLiveSupport/var/widgets/tabButton/rightSel.png b/src/products/gLiveSupport/var/widgets/tabButton/rightSel.png deleted file mode 100644 index 40ab330451c971b8cd554101956fdbc197ab6f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmV;o0Z9IdP)8v00042Nkl$@F>ez=5QX2aHy~LQ z1|d!qL`sY3_~-lxQ&G`GX;L61MTnf3aL(S&dynESXFFuH#m;^+Z)R4LY~v*>KQ69* zZ~u}y{jmCS*3BS&`*{r@q-B2x;8XYZ^VvrLc}mQAc=N7bu5LH?=a*L#2x-Q5uU0p= zn+cS>$0408d~x|J@7u^z(9OyFy4xMa&X?`|rX0rZdxeiOX3Ys4X3RK0|A{BTqo~nF z_XUyBeLlxgjYFvs3kSW=IHUxZ8Vq_HQ5LBrEnk;$j`C1Rd7x^~zHtbDJzW7Pe;ym{ zplfK?$lz4`VPOAsqD8d$etr$0)J7X2i)4_&MiGk=vTe(vL@^{XAs0zDOpzibl2k$} zY_u(jp;1b5LM}sXwk?rjBZIbqQfmKb!yao;nijLv-C$4k$92s)0Vr)~FaV6NDJA3t hAg$Ny|2Mkpx_>HpG#umMNi_ff002ovPDHLkV1hSHw$T6p diff --git a/src/products/gLiveSupport/var/widgets/whiteWindow/bottom.png b/src/products/gLiveSupport/var/widgets/whiteWindow/bottom.png deleted file mode 100644 index b177658af4dc70a88053e35f0413a9501be89292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2834 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 diff --git a/src/products/gLiveSupport/var/widgets/whiteWindow/bottomLeft.png b/src/products/gLiveSupport/var/widgets/whiteWindow/bottomLeft.png deleted file mode 100644 index bd9231441c9a2b0a48f1148ffad0ac6e385744d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2927 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 diff --git a/src/products/gLiveSupport/var/widgets/whiteWindow/resize.png b/src/products/gLiveSupport/var/widgets/whiteWindow/resize.png deleted file mode 100644 index bd585bb878a8eb2e6fcf4d3850ab77bc273f516f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3181 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 Tpyw&D00000NkvXXu0mjfq@5Un diff --git a/src/products/gLiveSupport/var/widgets/whiteWindow/right.png b/src/products/gLiveSupport/var/widgets/whiteWindow/right.png deleted file mode 100644 index b676e704fbe5811984ba1876fd8b5f6dad6040b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2825 zcmV+k3-KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C047O9K~#9!V)_67|Nr}spD`Rfd5+=g?Ry)U7|;NQ00000 b|NjF35d929gxY*w00000NkvXXu0mjf{smuH diff --git a/src/products/gLiveSupport/var/widgets/whiteWindow/top.png b/src/products/gLiveSupport/var/widgets/whiteWindow/top.png deleted file mode 100644 index d2d5906b5bd98d621f6f6b4e61f3e1eaee715ec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2831 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 diff --git a/src/products/gLiveSupport/var/widgets/whiteWindow/topLeft.png b/src/products/gLiveSupport/var/widgets/whiteWindow/topLeft.png deleted file mode 100644 index 5d8b8f67a364793cf9e9246d7f5f3fa56b9c6e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 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 /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -echo " aclocal $ACLOCAL_FLAGS" -cp -f ${configure_ac} ${tmpdir} -cp -f ${etcdir}/acinclude.m4 ${tmpdir} -aclocal $ACLOCAL_FLAGS - -echo " autoheader ${configure_ac}" -autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/products/scheduler/bin/campcaster-scheduler.sh b/src/products/scheduler/bin/campcaster-scheduler.sh deleted file mode 100755 index 4a647ab75..000000000 --- a/src/products/scheduler/bin/campcaster-scheduler.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -#-------------------------------------------------------------------------------# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# System V runlevel style invoke script for the Campcaster Scheduler -#------------------------------------------------------------------------------- - - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -libdir=$basedir/lib -vardir=$basedir/var/Campcaster/scheduler/var - - -#------------------------------------------------------------------------------- -# Set up the environment -#------------------------------------------------------------------------------- -export LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH -export GST_REGISTRY=$etcdir/gst-registry.xml -scheduler_exe=$bindir/campcaster-scheduler - -if [ -f ~/.campcaster/campcaster-scheduler.xml ]; then - config_file=~/.campcaster/campcaster-scheduler.xml -elif [ -f $etcdir/campcaster-scheduler.xml ]; then - config_file=$etcdir/campcaster-scheduler.xml -else - echo "Can't find configuration file."; -fi - -mode=$1 - - -#------------------------------------------------------------------------------- -# Do what the user asks us to do -#------------------------------------------------------------------------------- -case "$mode" in - 'start') - echo "Starting the Campcaster scheduler..." - $scheduler_exe -c $config_file start - sleep 2 - ;; - - 'stop') - echo "Stopping the Campcaster scheduler..." - $scheduler_exe -c $config_file stop - sleep 2 - ;; - - 'restart') - echo "Stopping the Campcaster scheduler..." - $scheduler_exe -c $config_file stop - sleep 2 - echo "Starting the Campcaster scheduler..." - $scheduler_exe -c $config_file start - sleep 2 - ;; - - 'status') - echo "Checking Campcaster scheduler status..." - $scheduler_exe -c $config_file status - ;; - - 'kill') - echo "Killing all Campcaster scheduler processes..." - killall campcaster-scheduler - sleep 2 - killall -9 campcaster-scheduler - ;; - - *) - echo "Campcaster scheduler System V runlevel init script." - echo "" - echo "Usage:" - echo " $0 start|stop|restart|status|kill" - echo "" - -esac - diff --git a/src/products/scheduler/bin/campcaster-scheduler_devenv.sh b/src/products/scheduler/bin/campcaster-scheduler_devenv.sh deleted file mode 100755 index a9204025c..000000000 --- a/src/products/scheduler/bin/campcaster-scheduler_devenv.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash -#-------------------------------------------------------------------------------# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# System V runlevel style invoke script for the Campcaster Scheduler -# This script is only used in the Campcaster development environment -#------------------------------------------------------------------------------- - - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -libdir=$basedir/lib -tmpdir=$basedir/tmp -vardir=$basedir/var - -usrdir=`cd $basedir/../../../usr; pwd;` - - -#------------------------------------------------------------------------------- -# Set up the environment -#------------------------------------------------------------------------------- -export LD_LIBRARY_PATH=$usrdir/lib:$LD_LIBRARY_PATH - -if [ -x $bindir/campcaster-scheduler ]; then - scheduler_exe=$bindir/campcaster-scheduler -elif [ -x $tmpdir/campcaster-scheduler ]; then - scheduler_exe=$tmpdir/campcaster-scheduler -else - echo "Can't find scheduler executable."; -fi - -if [ -f ~/.campcaster/campcaster-scheduler.xml ]; then - config_file=~/.campcaster/campcaster-scheduler.xml -elif [ -f $etcdir/campcaster-scheduler.xml ]; then - config_file=$etcdir/campcaster-scheduler.xml -else - echo "Can't find configuration file."; -fi - -mode=$1 - - -#------------------------------------------------------------------------------- -# Do what the user asks us to do -#------------------------------------------------------------------------------- -case "$mode" in - 'start') - echo "Starting the Campcaster scheduler..." - $scheduler_exe -c $config_file start - sleep 2 - ;; - - 'run') - echo "Running the Campcaster scheduler..." - $scheduler_exe -c $config_file --debug start - sleep 2 - ;; - - 'stop') - echo "Stopping the Campcaster scheduler..." - $scheduler_exe -c $config_file stop - sleep 2 - ;; - - 'restart') - echo "Stopping the Campcaster scheduler..." - $scheduler_exe -c $config_file stop - sleep 2 - echo "Starting the Campcaster scheduler..." - $scheduler_exe -c $config_file start - sleep 2 - ;; - - 'status') - echo "Checking Campcaster scheduler status..." - $scheduler_exe -c $config_file status - ;; - - 'kill') - echo "Killing all Campcaster scheduler processes..." - killall campcaster-scheduler - sleep 2 - killall -9 campcaster-scheduler - ;; - - *) - echo "Campcaster scheduler System V runlevel init script." - echo "" - echo "Usage:" - echo " $0 start|run|stop|restart|status|kill" - echo "" - -esac - diff --git a/src/products/scheduler/bin/createDatabase.sh b/src/products/scheduler/bin/createDatabase.sh deleted file mode 100755 index 46ebf5a3a..000000000 --- a/src/products/scheduler/bin/createDatabase.sh +++ /dev/null @@ -1,206 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script reates the database used by Campcaster -# -# Invoke as: -# ./bin/createDatabase.sh -# -# To get usage help, try the -h option -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -docdir=$basedir/doc -tmpdir=$basedir/tmp -usrdir=$basedir/usr - - -#------------------------------------------------------------------------------- -# Print the usage information for this script. -#------------------------------------------------------------------------------- -printUsage() -{ - echo "Campcaster scheduler database creation script."; - echo "parameters"; - echo ""; - echo " -D, --database The name of the Campcaster database."; - echo " [default: Campcaster]"; - echo " -s, --dbserver The name of the database server host."; - echo " [default: localhost]"; - echo " -u, --dbuser The name of the database user to access the" - echo " database. [default: campcaster]"; - echo " -w, --dbpassword The database user password."; - echo " [default: campcaster]"; - echo " -h, --help Print this message and exit."; - echo ""; -} - - -#------------------------------------------------------------------------------- -# Process command line parameters -#------------------------------------------------------------------------------- -CMD=${0##*/} - -opts=$(getopt -o D:hs:u:w: -l database:,dbserver:,dbuser:,dbpassword:,help, -n $CMD -- "$@") || exit 1 -eval set -- "$opts" -while true; do - case "$1" in - -D|--database) - database=$2; - shift; shift;; - -h|--help) - printUsage; - exit 0;; - -s|--dbserver) - dbserver=$2; - shift; shift;; - -u|--dbuser) - dbuser=$2; - shift; shift;; - -w|--dbpassword) - dbpassword=$2; - shift; shift;; - --) - shift; - break;; - *) - echo "Unrecognized option $1."; - printUsage; - exit 1; - esac -done - -if [ "x$dbserver" == "x" ]; then - dbserver=localhost; -fi - -if [ "x$database" == "x" ]; then - database=Campcaster; -fi - -if [ "x$dbuser" == "x" ]; then - dbuser=campcaster; -fi - -if [ "x$dbpassword" == "x" ]; then - dbpassword=campcaster; -fi - -echo "Creating database for Campcaster scheduler."; -echo ""; -echo "Using the following parameters:"; -echo ""; -echo " database server: $dbserver"; -echo " database: $database"; -echo " database user: $dbuser"; -echo " database user password: $dbpassword"; -echo "" - -#------------------------------------------------------------------------------- -# The details of installation -#------------------------------------------------------------------------------- - -postgres_user=postgres - -#------------------------------------------------------------------------------- -# Function to check for the existence of an executable on the PATH -# -# @param $1 the name of the exectuable -# @return 0 if the executable exists on the PATH, non-0 otherwise -#------------------------------------------------------------------------------- -check_exe() { - if [ -x "`which $1 2> /dev/null`" ]; then - echo "Executable $1 found..."; - return 0; - else - echo "Executable $1 not found..."; - return 1; - fi -} - - -#------------------------------------------------------------------------------- -# Check to see if this script is being run as root -#------------------------------------------------------------------------------- -if [ `whoami` != "root" ]; then - echo "Please run this script as root."; - exit ; -fi - - -#------------------------------------------------------------------------------- -# Check for required tools -#------------------------------------------------------------------------------- -echo "Checking for required tools..." - -check_exe "su" || exit 1; -check_exe "psql" || exit 1; - - -#------------------------------------------------------------------------------- -# Create the necessary database user and database itself -#------------------------------------------------------------------------------- -echo "Creating database and database user..."; - -# FIXME: the below might not work for remote databases - -if [ "x$dbserver" == "xlocalhost" ]; then - su - $postgres_user -c "echo \"CREATE USER $dbuser \ - ENCRYPTED PASSWORD '$dbpassword' \ - CREATEDB NOCREATEUSER;\" \ - | psql template1" \ - || echo "Couldn't create database user $dbuser."; - - su - $postgres_user -c "echo \"CREATE DATABASE \\\"$database\\\" \ - OWNER $dbuser ENCODING 'utf-8';\" \ - | psql template1" \ - || echo "Couldn't create database $database."; -else - echo "Unable to automatically create database user and table for"; - echo "remote database $dbserver."; - echo "Make sure to create database user $dbuser with password"; - echo "$dbpassword on database server at $dbserver."; - echo "Also create a database called $ld_database, owned by this user."; - echo ""; - echo "The easiest way to achieve this is by issuing the following SQL"; - echo "commands to PostgreSQL:"; - echo "CREATE USER $dbuser"; - echo " ENCRYPTED PASSWORD '$dbpassword'"; - echo " CREATEDB NOCREATEUSER;"; - echo "CREATE DATABASE \"$database\""; - echo " OWNER $dbuser ENCODING 'utf-8';"; -fi - - -# TODO: check for the success of these operations somehow -#------------------------------------------------------------------------------- -# Say goodbye -#------------------------------------------------------------------------------- -echo "Done." - diff --git a/src/products/scheduler/bin/createOdbcDataSource.sh b/src/products/scheduler/bin/createOdbcDataSource.sh deleted file mode 100755 index e70a15e2d..000000000 --- a/src/products/scheduler/bin/createOdbcDataSource.sh +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script creates the ODBC data source needed for Campcaster scheduler -# -# Invoke as: -# ./bin/createOdbcDataSource.sh -# -# To get usage help, try the -h option -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -docdir=$basedir/doc -tmpdir=$basedir/tmp -usrdir=$basedir/usr - - -#------------------------------------------------------------------------------- -# Print the usage information for this script. -#------------------------------------------------------------------------------- -printUsage() -{ - echo "Campcaster scheduler ODBC DataSource creating script."; - echo "parameters"; - echo ""; - echo " -D, --database The name of the Campcaster database."; - echo " [default: Campcaster]"; - echo " -s, --dbserver The name of the database server host."; - echo " [default: localhost]"; - echo " -h, --help Print this message and exit."; - echo ""; -} - - -#------------------------------------------------------------------------------- -# Process command line parameters -#------------------------------------------------------------------------------- -CMD=${0##*/} - -opts=$(getopt -o D:hs: -l database:,dbserver:,help -n $CMD -- "$@") || exit 1 -eval set -- "$opts" -while true; do - case "$1" in - -D|--database) - database=$2; - shift; shift;; - -s|--dbserver) - dbserver=$2; - shift; shift;; - --) - shift; - break;; - *) - echo "Unrecognized option $1."; - printUsage; - exit 1; - esac -done - -if [ "x$dbserver" == "x" ]; then - dbserver=localhost; -fi - -if [ "x$database" == "x" ]; then - database=Campcaster; -fi - - -echo "Creating ODBC data source for Campcaster scheduler."; -echo ""; -echo "Using the following installation parameters:"; -echo ""; -echo " database server: $dbserver"; -echo " database: $database"; -echo "" - -#------------------------------------------------------------------------------- -# The details of installation -#------------------------------------------------------------------------------- -ls_dbserver=$dbserver -ls_database=$database - - -replace_sed_string="s/ls_dbserver/$ls_dbserver/; \ - s/ls_database/$ls_database/;" - - -#------------------------------------------------------------------------------- -# Function to check for the existence of an executable on the PATH -# -# @param $1 the name of the exectuable -# @return 0 if the executable exists on the PATH, non-0 otherwise -#------------------------------------------------------------------------------- -check_exe() { - if [ -x "`which $1 2> /dev/null`" ]; then - echo "Executable $1 found..."; - return 0; - else - echo "Executable $1 not found..."; - return 1; - fi -} - - -#------------------------------------------------------------------------------- -# Check to see if this script is being run as root -#------------------------------------------------------------------------------- -if [ `whoami` != "root" ]; then - echo "Please run this script as root."; - exit ; -fi - - -#------------------------------------------------------------------------------- -# Check for required tools -#------------------------------------------------------------------------------- -echo "Checking for required tools..." - -check_exe "sed" || exit 1; -check_exe "grep" || exit 1; -check_exe "odbcinst" || exit 1; - - -#------------------------------------------------------------------------------- -# Create the ODBC data source and driver -#------------------------------------------------------------------------------- -# check for an existing PostgreSQL ODBC driver, and uninstall if necessary -odbcinst_res=`odbcinst -q -d | grep "\[PostgreSQL_Campcaster\]"` -if [ "x$odbcinst_res" != "x" ]; then - echo "Removing old ODBC PostgreSQL driver..."; - odbcinst -u -d -n PostgreSQL_Campcaster || exit 1; -fi - -echo "Registering ODBC PostgreSQL driver..."; -# check where the odbc dirvers are for PostgreSQL -if [ -f /usr/lib/libodbcpsql.so ]; then - odbcinst_template=$etcdir/odbcinst_template -elif [ -f /usr/lib/odbc/psqlodbc.so ]; then - odbcinst_template=$etcdir/odbcinst_old_debian_template -elif [ -f /usr/lib/odbc/psqlodbcw.so ]; then - odbcinst_template=$etcdir/odbcinst_new_debian_template -else - echo "can't find ODBC driver for PostgreSQL neither at /usr/lib"; - echo "nor at /usr/lib/odbc. please install proper ODBC drivers"; - exit 1; -fi -odbcinst -i -d -f $odbcinst_template || exit 1; - -echo "Registering Campcaster ODBC data source..."; -odbc_template=$etcdir/odbc_template -odbc_template_tmp=/tmp/odbc_template.$$ -cat $odbc_template | sed -e "$replace_sed_string" > $odbc_template_tmp -odbcinst -i -s -l -f $odbc_template_tmp || exit 1; -rm -f $odbc_template_tmp - - -#------------------------------------------------------------------------------- -# Say goodbye -#------------------------------------------------------------------------------- -echo "Done." - diff --git a/src/products/scheduler/bin/gen_coverage_data.sh b/src/products/scheduler/bin/gen_coverage_data.sh deleted file mode 100755 index be3e2d8b3..000000000 --- a/src/products/scheduler/bin/gen_coverage_data.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script generates code coverage data for the module -#------------------------------------------------------------------------------- -module="Campcaster Scheduler" - -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -docdir=$basedir/doc -tmpdir=$basedir/tmp - -usrdir=`cd $basedir/../../../usr; pwd;` - -coverage_report_dir=$docdir/coverage - -raw_coverage_file=$tmpdir/raw_coverage.info -coverage_file=$tmpdir/coverage.info - -lcov=$usrdir/bin/lcov -genhtml=$usrdir/bin/genhtml - - -cd $basedir - -#------------------------------------------------------------------------------- -# Re-configure with covarege collection enabled, compile and run the tests -#------------------------------------------------------------------------------- -$bindir/autogen.sh --enable-coverage -make clean -make check - -#------------------------------------------------------------------------------- -# Generate some symlinks so that the sources are visible from tmpdir -#------------------------------------------------------------------------------- -ln -s $basedir/include $tmpdir/include -ln -s $basedir/src $tmpdir/src - - -#------------------------------------------------------------------------------- -# Use lcov to generate an HTML report on the coverage data -#------------------------------------------------------------------------------- -$lcov -d $tmpdir -c > $raw_coverage_file -$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file -rm -rf $coverage_report_dir -mkdir -p $coverage_report_dir -$genhtml -t "$module" -o $coverage_report_dir $coverage_file - - -#------------------------------------------------------------------------------- -# Clean up -#------------------------------------------------------------------------------- -rm -f $tmpdir/include -rm -f $tmpdir/src diff --git a/src/products/scheduler/bin/run_tests.sh b/src/products/scheduler/bin/run_tests.sh deleted file mode 100755 index 70d7638ae..000000000 --- a/src/products/scheduler/bin/run_tests.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -#-------------------------------------------------------------------------------# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run the test suite for the scheduler. -#------------------------------------------------------------------------------- - - -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -bindir=$basedir/bin -etcdir=$basedir/etc -libdir=$basedir/lib -tmpdir=$basedir/tmp - -usrdir=`cd $basedir/../../../usr; pwd;` - - -#------------------------------------------------------------------------------- -# Set up the environment -#------------------------------------------------------------------------------- -export LD_LIBRARY_PATH=$usrdir/lib:$LD_LIBRARY_PATH - -if [ -x $tmpdir/testRunner ]; then - testRunner=$tmpdir/testRunner -else - echo "Can't find testRunner executable."; -fi - -if [ -f ~/.campcaster/campcaster-scheduler.xml ]; then - config_file=~/.campcaster/campcaster-scheduler.xml -elif [ -f $etcdir/campcaster-scheduler.xml ]; then - config_file=$etcdir/campcaster-scheduler.xml -else - echo "Can't find configuration file."; -fi - - -#------------------------------------------------------------------------------- -# Run the tests -#------------------------------------------------------------------------------- -$testRunner -c $config_file ${*} - diff --git a/src/products/scheduler/configure b/src/products/scheduler/configure deleted file mode 100755 index 26ccda218..000000000 --- a/src/products/scheduler/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen $*) -fi - -(cd $tmpdir && $configure $*) - diff --git a/src/products/scheduler/doc/doxygen/.keepme b/src/products/scheduler/doc/doxygen/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/products/scheduler/doc/doxygen/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/products/scheduler/doc/model/SchedulerModel.zuml b/src/products/scheduler/doc/model/SchedulerModel.zuml deleted file mode 100644 index 7f105b69f1484983c76a4dd3d224832e4081bd57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164753 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 F1VmSsLT@S2Lx7TyWZ1jAcwE^_~gl=`G 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

Preface

-This document is part of the -Campcaster -project, Copyright © 2004 Media -Development Loan Fund, under the GNU -GPL. -
-This is an automatically generated document. -

Scope

-This document contains the generated unit test results for the -Campcaster project. -

Summary

- - - - - - - - - - - - - - - - - - -
Total number of tests:
Tests passed:
Tests failed:
Test errors:
-
-

Tests

- - - - - - - - - - - - - -
test nametest status
failedpassed
- - - - - - diff --git a/src/products/scheduler/etc/testStorageClient.xml b/src/products/scheduler/etc/testStorageClient.xml deleted file mode 100644 index 9ad61269a..000000000 --- a/src/products/scheduler/etc/testStorageClient.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - diff --git a/src/products/scheduler/etc/webAuthenticationClient.xml b/src/products/scheduler/etc/webAuthenticationClient.xml deleted file mode 100644 index a63a04718..000000000 --- a/src/products/scheduler/etc/webAuthenticationClient.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - -]> - - - - - diff --git a/src/products/scheduler/etc/webStorageClient.xml b/src/products/scheduler/etc/webStorageClient.xml deleted file mode 100644 index 2b9440524..000000000 --- a/src/products/scheduler/etc/webStorageClient.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - -]> - - - - - diff --git a/src/products/scheduler/src/BackupFactory.cxx b/src/products/scheduler/src/BackupFactory.cxx deleted file mode 100644 index a43ca5241..000000000 --- a/src/products/scheduler/src/BackupFactory.cxx +++ /dev/null @@ -1,120 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "ScheduleFactory.h" -#include "PostgresqlBackup.h" - -#include "BackupFactory.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string BackupFactory::configElementNameStr = "backupFactory"; - -/*------------------------------------------------------------------------------ - * The singleton instance of BackupFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref BackupFactory::singleton; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance to BackupFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref -BackupFactory :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new BackupFactory()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the backup factory. - *----------------------------------------------------------------------------*/ -void -BackupFactory :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - backup.reset(); - - Ptr::Ref - cmf = ConnectionManagerFactory::getInstance(); - Ptr::Ref - connection = cmf->getConnectionManager(); - - Ptr::Ref - scf = StorageClientFactory::getInstance(); - Ptr::Ref - storage = scf->getStorageClient(); - - Ptr::Ref - sf = ScheduleFactory::getInstance(); - Ptr::Ref - schedule = sf->getSchedule(); - - // try to look for a PostgresqlBackup configuration element - xmlpp::Node::NodeList nodes = - element.get_children(PostgresqlBackup::getConfigElementName()); - if (nodes.size() >= 1) { - const xmlpp::Element * configElement = - dynamic_cast (*(nodes.begin())); - Ptr::Ref pb(new PostgresqlBackup(connection, - storage, - schedule)); - pb->configure(*configElement); - backup = pb; - } - - if (!backup) { - throw std::invalid_argument("could not configure BackupFactory"); - } -} diff --git a/src/products/scheduler/src/BackupFactory.h b/src/products/scheduler/src/BackupFactory.h deleted file mode 100644 index f489dbabc..000000000 --- a/src/products/scheduler/src/BackupFactory.h +++ /dev/null @@ -1,175 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BackupFactory_h -#define BackupFactory_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#include - -#include "LiveSupport/Core/Configurable.h" -#include "BackupInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The factory to create backup objects. - * - * Backup objects are objects which implement the BackupInterface interface, - * so they can create and restore schedule backups. - * - * This object has to be configured with an element that contains - * the configuration element that the factory should build. - * Currently only PostgresqlBackup is supported by this factory. - * - * An example configuration element is the following: - * - *

- *      <backupFactory>
- *          <postgresqlBackup/>
- *      </backupFactory>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT backupFactory (postgresqlBackup) >
- *  
- * - * For details on the <postgresqlBackup> element, see the - * PostgresqlBackup documentation. - * - * @see PostgresqlBackup - */ -class BackupFactory : virtual public Configurable -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The backup created by this factory. - */ - Ptr::Ref backup; - - /** - * The default constructor. - */ - BackupFactory(void) throw() - { - } - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~BackupFactory(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Return a backup. - * - * @return the appropriate backup, according to the - * configuration of this factory. - */ - Ptr::Ref - getBackup(void) throw () - { - return backup; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Storage -} // namespace LiveSupport - -#endif // BackupFactory_h - diff --git a/src/products/scheduler/src/BackupInterface.h b/src/products/scheduler/src/BackupInterface.h deleted file mode 100644 index fe27c1176..000000000 --- a/src/products/scheduler/src/BackupInterface.h +++ /dev/null @@ -1,183 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BackupInterface_h -#define BackupInterface_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Playlist.h" -#include "LiveSupport/Core/ScheduleEntry.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The generic interface for creating and restoring schedule backups. - * - * There is a singleton instance of this type, which is manufactured by the - * BackupFactory class. - * - * There are separate xxxxMethod classes which perform these - * functions via XML-RPC, by delegating them to this singleton object. - * The xxxxMethod classes are registered in the SchedulerDaemon - * object, which calls them when an XML-RPC request is received. - * - */ -class BackupInterface -{ - public: - /** - * Start to create a backup by calling the storage, and also - * adding a backup of the schedule. - * To check if the backup procedure is still pending, call - * createBackupCheck() regularly. - * Make sure to close the backup by calling createBackupClose(). - * - * @param sessionId a valid session ID to use for accessing the - * storage - * @param criteria the criteria to use for backing up the storage - * @param fromTime entries are included in the schedule export starting - * from this time. - * @param toTime entries as included in the schedule export - * up to but not including this time. - * @return a token, which can be used to query the backup process. - * @exception XmlRpcException on XML-RPC issues. - * @see #createBackupCheck - * @see #createBackupClose - */ - virtual Ptr::Ref - createBackupOpen(Ptr::Ref sessionId, - Ptr::Ref criteria, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (XmlRpcException) - = 0; - - /** - * Check the status of a storage backup. - * - * @param token the identifier of this backup task. - * @param url return parameter; - * if the status is "success", it contains the - * URL of the created backup file. - * @param path return parameter; - * if the status is "success", it contains the - * local access path of the created backup file. - * @param errorMessage return parameter; - * if the status is "fault", it contains the - * fault string. - * @return the state of the backup process: one of pendingState, - * finishedState, or failedState. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - * @see #createBackupOpen - * @see #createBackupClose - */ - virtual AsyncState - createBackupCheck(const Glib::ustring & token, - Ptr::Ref & url, - Ptr::Ref & path, - Ptr::Ref & errorMessage) - throw (XmlRpcException) - = 0; - - /** - * Close the storage backup process. - * Frees up all resources allocated to the backup. - * - * @param token the identifier of this backup task. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - * @see #createBackupOpen - * @see #createBackupCheck - */ - virtual void - createBackupClose(const Glib::ustring & token) - throw (XmlRpcException) - = 0; - - /** - * Restore a schedule backup. - * - * All playlist IDs contained in the backup should already be in the - * storage. If this is a combined backup, with both storage and - * schedule components, then restore this backup to the storage - * first, and then call this function. - * - * @param sessionId a valid session ID to identify the user. - * @param path the location of the archive to upload. - * @exception XmlRpcException if there is an error. - */ - virtual void - restoreBackup(Ptr::Ref sessionId, - Ptr::Ref path) - throw (XmlRpcException) - = 0; - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~BackupInterface(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // BackupInterface_h - diff --git a/src/products/scheduler/src/BaseTestMethod.cxx b/src/products/scheduler/src/BaseTestMethod.cxx deleted file mode 100644 index 0204ff28d..000000000 --- a/src/products/scheduler/src/BaseTestMethod.cxx +++ /dev/null @@ -1,87 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include "SchedulerDaemon.h" -#include "BaseTestMethod.h" - - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The XML-RPC host to connect to. - *----------------------------------------------------------------------------*/ -std::string LiveSupport::Scheduler::BaseTestMethod::xmlRpcHost; - -/*------------------------------------------------------------------------------ - * The XML-RPC port number to connect to. - *----------------------------------------------------------------------------*/ -unsigned int LiveSupport::Scheduler::BaseTestMethod::xmlRpcPort; - -/*------------------------------------------------------------------------------ - * A flag to indicate if configuration has already been done. - *----------------------------------------------------------------------------*/ -bool LiveSupport::Scheduler::BaseTestMethod::configured = false; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Read configuration information. - *----------------------------------------------------------------------------*/ -void -LiveSupport::Scheduler:: -BaseTestMethod :: configure(std::string configFileName) - throw (std::exception) -{ - if (!configured) { - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - - try { - std::auto_ptr - parser(new xmlpp::DomParser(configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - scheduler->configure(*(document->get_root_node())); - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in configuration file" << std::endl - << e.what() << std::endl; - } catch (xmlpp::exception &e) { - std::cerr << "error parsing configuration file" << std::endl - << e.what() << std::endl; - } - - xmlRpcHost = scheduler->getXmlRpcHost(); - xmlRpcPort = scheduler->getXmlRpcPort(); - configured = true; - } -} - diff --git a/src/products/scheduler/src/BaseTestMethod.h b/src/products/scheduler/src/BaseTestMethod.h deleted file mode 100644 index a9b244aa0..000000000 --- a/src/products/scheduler/src/BaseTestMethod.h +++ /dev/null @@ -1,127 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef BaseTestMethod_h -#define BaseTestMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/BaseTestMethod.h" - - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A base class for the test methods. - * Subclass this class for the methods that connect to an XML-RPC source. - * Make sure to call BaseTestMethod::configure() before running the - * test cases. - * - */ -class BaseTestMethod : public LiveSupport::Core::BaseTestMethod -{ - private: - /** - * The XML-RPC host name to connect to. - */ - static std::string xmlRpcHost; - - /** - * The XML-RPC port to connect to. - */ - static unsigned int xmlRpcPort; - - /** - * A flag to indicate if configuration has already been done. - */ - static bool configured; - - - public: - - /** - * Function to read configuration information, and fill out - * relevant attributes, such as the XML-RPC port and host. - * - * @param configFileName the name of the configuration file to read. - * @exception std::exception in case of errors reading the - * configuration file - */ - static void - configure(std::string configFileName) - throw (std::exception); - - /** - * Return the XML-RPC port to connect to. - * - * @return the XML-RPC port to connect to. - */ - static unsigned int - getXmlRpcPort(void) throw () - { - return xmlRpcPort; - } - - /** - * Return the XML-RPC host to connect to. - * - * @return the XML-RPC host to connect to. - */ - static std::string - getXmlRpcHost(void) throw () - { - return xmlRpcHost; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // BaseTestMethod_h - diff --git a/src/products/scheduler/src/CreateBackupCheckMethod.cxx b/src/products/scheduler/src/CreateBackupCheckMethod.cxx deleted file mode 100644 index 55c9f257d..000000000 --- a/src/products/scheduler/src/CreateBackupCheckMethod.cxx +++ /dev/null @@ -1,138 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include - -#include "LiveSupport/Core/XmlRpcTools.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "BackupFactory.h" - -#include "CreateBackupCheckMethod.h" - - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string CreateBackupCheckMethod::methodName = "createBackupCheck"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int CreateBackupCheckMethod::errorId = 4100; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -CreateBackupCheckMethod :: CreateBackupCheckMethod ( - Ptr::Ref xmlRpcServer) - throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the upload playlist method XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -CreateBackupCheckMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref token; - try{ - token = XmlRpcTools::extractToken(parameters); - - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, - "missing token argument", - returnValue); - return; - } - - Ptr::Ref bf = BackupFactory::getInstance(); - Ptr::Ref backup = bf->getBackup(); - - Ptr::Ref url; - Ptr::Ref path; - Ptr::Ref errorMessage; - AsyncState state; - try { - state = backup->createBackupCheck(*token, url, path, errorMessage); - - } catch (Core::XmlRpcException &e) { - XmlRpcTools::markError(errorId+10, e.what(), returnValue); - return; - } - - XmlRpcTools::backupStatusToXmlRpcValue(state, returnValue); - - if (state == AsyncState::finishedState) { - if (url && path) { - XmlRpcTools::urlToXmlRpcValue(url, returnValue); - XmlRpcTools::pathToXmlRpcValue(path, returnValue); - } else { - XmlRpcTools::markError(errorId+11, - "missing url or path return value", - returnValue); - return; - } - - } else if (state == AsyncState::failedState) { - if (errorMessage) { - XmlRpcTools::faultStringToXmlRpcValue(errorMessage, returnValue); - } else { - XmlRpcTools::markError(errorId+11, - "missing faultString return value", - returnValue); - return; - } - } -} - diff --git a/src/products/scheduler/src/CreateBackupCheckMethod.h b/src/products/scheduler/src/CreateBackupCheckMethod.h deleted file mode 100644 index 71aac9435..000000000 --- a/src/products/scheduler/src/CreateBackupCheckMethod.h +++ /dev/null @@ -1,152 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef CreateBackupCheckMethod_h -#define CreateBackupCheckMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to check the progress of a backup creation process. - * - * The name of the method when called through XML-RPC is "createBackupCheck". - * - * The expected parameter is an XML-RPC structure with a single member: - *
    - *
  • token - string - the token obtained from createBackupOpen
  • - *
- * - * On success, returns an XML-RPC struct, with the following members: - *
    - *
  • status - string - on of "success", "working" or "fault"
  • - *
  • url - string - if the status is "success", this contains - * a readable URL of the new backup archive
  • - *
  • path - string - if the status is "success", this contains - * the local access path of the new backup - * archive
  • - *
  • faultString - string - if the status is "fault", this contains - * the error message.
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 4101 - invalid argument format
  • - *
  • 4102 - missing token argument
  • - *
  • 4110 - error reported by the scheduler daemon
  • - *
  • 4111 - syntax error in the values returned by - * the scheduler daemon
  • - *
- * - */ -class CreateBackupCheckMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - CreateBackupCheckMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - CreateBackupCheckMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the createBackupOpen command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // CreateBackupCheckMethod_h - diff --git a/src/products/scheduler/src/CreateBackupCloseMethod.cxx b/src/products/scheduler/src/CreateBackupCloseMethod.cxx deleted file mode 100644 index d1d746b7a..000000000 --- a/src/products/scheduler/src/CreateBackupCloseMethod.cxx +++ /dev/null @@ -1,121 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "LiveSupport/Core/XmlRpcTools.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "BackupFactory.h" - -#include "CreateBackupCloseMethod.h" - - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string CreateBackupCloseMethod::methodName = "createBackupClose"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int CreateBackupCloseMethod::errorId = 4200; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -CreateBackupCloseMethod :: CreateBackupCloseMethod( - Ptr::Ref xmlRpcServer) - throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the upload playlist method XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -CreateBackupCloseMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref token; - try{ - token = XmlRpcTools::extractToken(parameters); - - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, - "missing token argument", - returnValue); - return; - } - - Ptr::Ref bf = BackupFactory::getInstance(); - Ptr::Ref backup = bf->getBackup(); - - try { - backup->createBackupClose(*token); - - } catch (Core::XmlRpcException &e) { - XmlRpcTools::markError(errorId+10, e.what(), returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/CreateBackupCloseMethod.h b/src/products/scheduler/src/CreateBackupCloseMethod.h deleted file mode 100644 index af3435ac3..000000000 --- a/src/products/scheduler/src/CreateBackupCloseMethod.h +++ /dev/null @@ -1,136 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef CreateBackupCloseMethod_h -#define CreateBackupCloseMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to close the backup creation process. - * - * The name of the method when called through XML-RPC is "createBackupClose". - * - * The expected parameter is an XML-RPC structure with a single member: - *
    - *
  • token - string - the token obtained from createBackupOpen
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 4201 - invalid argument format
  • - *
  • 4202 - missing token argument
  • - *
  • 4210 - error reported by the scheduler daemon
  • - *
- * - */ -class CreateBackupCloseMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - CreateBackupCloseMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - CreateBackupCloseMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the createBackupOpen command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // CreateBackupCloseMethod_h - diff --git a/src/products/scheduler/src/CreateBackupOpenMethod.cxx b/src/products/scheduler/src/CreateBackupOpenMethod.cxx deleted file mode 100644 index 3db27c368..000000000 --- a/src/products/scheduler/src/CreateBackupOpenMethod.cxx +++ /dev/null @@ -1,152 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "LiveSupport/Core/XmlRpcTools.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "BackupFactory.h" - -#include "CreateBackupOpenMethod.h" - - -using namespace boost; -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string CreateBackupOpenMethod::methodName = "createBackupOpen"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int CreateBackupOpenMethod::errorId = 4000; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -CreateBackupOpenMethod :: CreateBackupOpenMethod( - Ptr::Ref xmlRpcServer) - throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the upload playlist method XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -CreateBackupOpenMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref criteria; - try { - criteria = XmlRpcTools::extractSearchCriteria(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, e.what(), returnValue); - return; - } - - Ptr::Ref fromTime; - try { - fromTime = XmlRpcTools::extractFromTime(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, e.what(), returnValue); - return; - } - - Ptr::Ref toTime; - try { - toTime = XmlRpcTools::extractToTime(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+4, e.what(), returnValue); - return; - } - - Ptr::Ref bf = BackupFactory::getInstance(); - Ptr::Ref backup = bf->getBackup(); - - Ptr::Ref token; - try { - token = backup->createBackupOpen(sessionId, - criteria, - fromTime, - toTime); - } catch (Core::XmlRpcException &e) { - XmlRpcTools::markError(errorId+5, e.what(), returnValue); - return; - } - - XmlRpcTools::tokenToXmlRpcValue(token, returnValue); -} - diff --git a/src/products/scheduler/src/CreateBackupOpenMethod.h b/src/products/scheduler/src/CreateBackupOpenMethod.h deleted file mode 100644 index ec9416057..000000000 --- a/src/products/scheduler/src/CreateBackupOpenMethod.h +++ /dev/null @@ -1,158 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef CreateBackupOpenMethod_h -#define CreateBackupOpenMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to start a backup creation process. - * - * The name of the method when called through XML-RPC is "createBackupOpen". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
  • criteria - struct - the criteria to use for backing up the - * storage
  • - *
  • fromTime - datetime - entries are included in the schedule export - * starting from this time
  • - *
  • toTime - datetime - entries are included in the schedule export - * up to but not including this time
  • - *
- * - * For the format of the criteria parameter, see the - * documentation of XR_LocStor::xr_searchMetadata(). - * - * On success, returns an XML-RPC struct with a single field: - *
    - *
  • token - string - a token, which can be used to query the - * backup process
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 4001 - invalid argument format
  • - *
  • 4002 - missing criteria argument
  • - *
  • 4003 - missing fromTime argument
  • - *
  • 4004 - missing toTime argument
  • - *
  • 4010 - error reported by the scheduler daemon
  • - *
  • 4020 - missing session ID argument
  • - *
- * - */ -class CreateBackupOpenMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - CreateBackupOpenMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - CreateBackupOpenMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the createBackupOpen command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // CreateBackupOpenMethod_h - diff --git a/src/products/scheduler/src/DisplayScheduleMethod.cxx b/src/products/scheduler/src/DisplayScheduleMethod.cxx deleted file mode 100644 index a0f6f1069..000000000 --- a/src/products/scheduler/src/DisplayScheduleMethod.cxx +++ /dev/null @@ -1,138 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "ScheduleInterface.h" -#include "ScheduleFactory.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "DisplayScheduleMethod.h" - - -using namespace boost; -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string DisplayScheduleMethod::methodName = "displaySchedule"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int DisplayScheduleMethod::errorId = 1100; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -DisplayScheduleMethod :: DisplayScheduleMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the stop XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -DisplayScheduleMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref fromTime; - try { - fromTime = XmlRpcTools::extractFromTime(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, "missing or invalid 'from' argument", - returnValue); - return; - } - - Ptr::Ref toTime; - try { - toTime = XmlRpcTools::extractToTime(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "missing or invalid 'to' argument", - returnValue); - return; - } - - Ptr::Ref sf = ScheduleFactory::getInstance(); - Ptr::Ref schedule = sf->getSchedule(); - - Ptr::Ref> >::Ref scheduleEntries - = schedule->getScheduleEntries(fromTime, toTime); - -std::cout << "DisplayScheduleMethod scheduleEntries: " << scheduleEntries->size() << std::endl; - - XmlRpcTools::scheduleEntriesToXmlRpcValue(scheduleEntries, returnValue); -} diff --git a/src/products/scheduler/src/DisplayScheduleMethod.h b/src/products/scheduler/src/DisplayScheduleMethod.h deleted file mode 100644 index 5745a49f1..000000000 --- a/src/products/scheduler/src/DisplayScheduleMethod.h +++ /dev/null @@ -1,165 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef DisplayScheduleMethod_h -#define DisplayScheduleMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/ScheduleEntry.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to return the schedule for a specified - * time interval. - * - * The name of the method when called through XML-RPC is "displaySchedule". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
  • from - datetime - the start of the interval to list schedule from, - * inclusive.
  • - *
  • to - datetime - the end of the interval to list schedule from, - * non-inclusive.
  • - *
- * - * The XML-RPC function returns an XML-RPC array, containing a structure - * for each scheduled item in the interval. An array of size 0 means there - * are not scheduled entries. Each structure is as follows: - *
    - *
  • id - int - the id of the scheduled entry
  • - *
  • playlistId - string - the id of the playlist associated with the entry - *
  • - *
  • start - datetime - the start of the scheduled item
  • - *
  • end - datetime - the end of the scheduled item
  • - *
- * - * The playlistId parameter is a string containing the hexadecimal value of - * the playlist ID. - * It is up to 8 characters long, representing a value between 0 and 2^31-1, - * inclusive. - * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 1101 - invalid argument format
  • - *
  • 1102 - missing or invalid 'from' argument
  • - *
  • 1103 - missing or invalid 'to' argument
  • - *
  • 1120 - missing session ID argument
  • - *
- * - */ -class DisplayScheduleMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - DisplayScheduleMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - DisplayScheduleMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the display schedule command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // DisplayScheduleMethod_h - diff --git a/src/products/scheduler/src/DisplayScheduleMethodTest.cxx b/src/products/scheduler/src/DisplayScheduleMethodTest.cxx deleted file mode 100644 index a0bd87d29..000000000 --- a/src/products/scheduler/src/DisplayScheduleMethodTest.cxx +++ /dev/null @@ -1,409 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" - -#include "SchedulerDaemon.h" -#include "ScheduleFactory.h" -#include "UploadPlaylistMethod.h" -#include "DisplayScheduleMethod.h" -#include "DisplayScheduleMethodTest.h" - -using namespace std; -using namespace XmlRpc; - -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::Authentication; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(DisplayScheduleMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -DisplayScheduleMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - Ptr::Ref storage = scheduler->getStorage(); - storage->reset(); - - schedule = scheduler->getSchedule(); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } catch (std::exception &e) { - CPPUNIT_FAIL(e.what()); - } - - authentication = scheduler->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::string eMsg = "could not log in:\n"; - eMsg += e.what(); - CPPUNIT_FAIL(eMsg); - } - - insertEntries(); // this can only be called after sessionId is obtained -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -DisplayScheduleMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -DisplayScheduleMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new DisplayScheduleMethod()); - XmlRpcValue parameters; - XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpcValue result; - struct tm time; - - // set up a structure for the parameters - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 18; - time.tm_min = 31; - time.tm_sec = 1; - parameters["from"] = &time; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 19; - time.tm_min = 31; - time.tm_sec = 1; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.size() == 0); -} - - -/*------------------------------------------------------------------------------ - * Insert some entries into the schedule - *----------------------------------------------------------------------------*/ -void -DisplayScheduleMethodTest :: insertEntries(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new UploadPlaylistMethod()); - XmlRpcValue parameters; - XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpcValue result; - struct tm time; - - // insert a playlist for 2004-07-31, at 10 o'clock - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // insert a playlist for 2004-07-31, at 12 o'clock - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 12; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // insert a playlist for 2004-07-31, at 14 o'clock - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 14; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } -} - - -/*------------------------------------------------------------------------------ - * Look at some intervals and check against test data - *----------------------------------------------------------------------------*/ -void -DisplayScheduleMethodTest :: intervalTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new DisplayScheduleMethod()); - XmlRpcValue parameters; - XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpcValue result; - struct tm time; - - // check for the interval 2004-07-31 between 9 and 11 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 9; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 11; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 1); - CPPUNIT_ASSERT(result[0].hasMember("playlistId")); - CPPUNIT_ASSERT(result[0]["playlistId"].getType() - == XmlRpcValue::TypeString); - CPPUNIT_ASSERT(std::string(result[0]["playlistId"]) == "0000000000000001"); - time = result[0]["start"]; - CPPUNIT_ASSERT(time.tm_year == 2004); - CPPUNIT_ASSERT(time.tm_mon == 7); - CPPUNIT_ASSERT(time.tm_mday == 31); - CPPUNIT_ASSERT(time.tm_hour == 10); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - time = result[0]["end"]; - CPPUNIT_ASSERT(time.tm_year == 2004); - CPPUNIT_ASSERT(time.tm_mon == 7); - CPPUNIT_ASSERT(time.tm_mday == 31); - CPPUNIT_ASSERT(time.tm_hour == 11); - CPPUNIT_ASSERT(time.tm_min == 30); - CPPUNIT_ASSERT(time.tm_sec == 0); - - // check for the interval 2004-07-31 between 9 and 13 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 9; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 13; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 2); - CPPUNIT_ASSERT(result[0].hasMember("playlistId")); - CPPUNIT_ASSERT(result[0]["playlistId"].getType() - == XmlRpcValue::TypeString); - CPPUNIT_ASSERT(std::string(result[0]["playlistId"]) == "0000000000000001"); - time = result[0]["start"]; - CPPUNIT_ASSERT(time.tm_year == 2004); - CPPUNIT_ASSERT(time.tm_mon == 7); - CPPUNIT_ASSERT(time.tm_mday == 31); - CPPUNIT_ASSERT(time.tm_hour == 10); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - time = result[0]["end"]; - CPPUNIT_ASSERT(time.tm_year == 2004); - CPPUNIT_ASSERT(time.tm_mon == 7); - CPPUNIT_ASSERT(time.tm_mday == 31); - CPPUNIT_ASSERT(time.tm_hour == 11); - CPPUNIT_ASSERT(time.tm_min == 30); - CPPUNIT_ASSERT(time.tm_sec == 0); - - CPPUNIT_ASSERT(result[1].hasMember("playlistId")); - CPPUNIT_ASSERT(result[1]["playlistId"].getType() - == XmlRpcValue::TypeString); - CPPUNIT_ASSERT(std::string(result[1]["playlistId"]) == "0000000000000001"); - time = result[1]["start"]; - CPPUNIT_ASSERT(time.tm_year == 2004); - CPPUNIT_ASSERT(time.tm_mon == 7); - CPPUNIT_ASSERT(time.tm_mday == 31); - CPPUNIT_ASSERT(time.tm_hour == 12); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - time = result[1]["end"]; - CPPUNIT_ASSERT(time.tm_year == 2004); - CPPUNIT_ASSERT(time.tm_mon == 7); - CPPUNIT_ASSERT(time.tm_mday == 31); - CPPUNIT_ASSERT(time.tm_hour == 13); - CPPUNIT_ASSERT(time.tm_min == 30); - CPPUNIT_ASSERT(time.tm_sec == 0); - - // check for the interval 2004-07-31 between 8 and 9 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 8; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 2004; - time.tm_mon = 7; - time.tm_mday = 31; - time.tm_hour = 9; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 0); -} - - diff --git a/src/products/scheduler/src/DisplayScheduleMethodTest.h b/src/products/scheduler/src/DisplayScheduleMethodTest.h deleted file mode 100644 index e81b6c1b6..000000000 --- a/src/products/scheduler/src/DisplayScheduleMethodTest.h +++ /dev/null @@ -1,138 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef DisplayScheduleMethodTest_h -#define DisplayScheduleMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the DisplayScheduleMethod class. - * - * @see DisplayScheduleMethod - */ -class DisplayScheduleMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(DisplayScheduleMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(intervalTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The schedule used during the test. - */ - Ptr::Ref schedule; - - /** - * The authentication client produced by the factory. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Insert some entries into the schedule to provide test data. - */ - void - insertEntries(void) throw (CPPUNIT_NS::Exception); - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Look at some intervals, and check them against the test data. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - intervalTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // DisplayScheduleMethodTest_h - diff --git a/src/products/scheduler/src/GeneratePlayReportMethod.cxx b/src/products/scheduler/src/GeneratePlayReportMethod.cxx deleted file mode 100644 index 7ba6820fd..000000000 --- a/src/products/scheduler/src/GeneratePlayReportMethod.cxx +++ /dev/null @@ -1,136 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "PlayLogInterface.h" -#include "PlayLogFactory.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "GeneratePlayReportMethod.h" - - -using namespace boost; -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string GeneratePlayReportMethod::methodName = "generatePlayReport"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int GeneratePlayReportMethod::errorId = 1500; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -GeneratePlayReportMethod :: GeneratePlayReportMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the stop XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -GeneratePlayReportMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref fromTime; - try { - fromTime = XmlRpcTools::extractFromTime(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, "missing or invalid 'from' argument", - returnValue); - return; - } - - Ptr::Ref toTime; - try { - toTime = XmlRpcTools::extractToTime(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "missing or invalid 'to' argument", - returnValue); - return; - } - - Ptr::Ref plf = PlayLogFactory::getInstance(); - Ptr::Ref playLog = plf->getPlayLog(); - - Ptr::Ref> >::Ref playLogVector - = playLog->getPlayLogEntries(fromTime, toTime); - - XmlRpcTools::playLogVectorToXmlRpcValue(playLogVector, returnValue); -} diff --git a/src/products/scheduler/src/GeneratePlayReportMethod.h b/src/products/scheduler/src/GeneratePlayReportMethod.h deleted file mode 100644 index 8ea014c36..000000000 --- a/src/products/scheduler/src/GeneratePlayReportMethod.h +++ /dev/null @@ -1,162 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GeneratePlayReportMethod_h -#define GeneratePlayReportMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/PlayLogEntry.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to return the list of audio clips which were - * played during a specified time interval. - * - * The name of the method when called through XML-RPC is "generatePlayReport". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
  • from - datetime - the start of the interval to give the playlog - * from, inclusive.
  • - *
  • to - datetime - the end of the interval to give the playlog - * to, non-inclusive.
  • - *
- * - * The XML-RPC function returns an XML-RPC array, containing a structure - * for each play log item in the interval. An array of size 0 means there - * are no play log entries. Each structure is as follows: - *
    - *
  • audioClipId - string - the id of the audio clip played
  • - *
  • timestamp - datetime - the time the clip was played (started)
  • - *
- * - * The audioClipId parameter is a string containing the hexadecimal value of - * the audio clip ID. - * It is up to 8 characters long, representing a value between 0 and 2^31-1, - * inclusive. - * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 1501 - invalid argument format
  • - *
  • 1502 - missing or invalid 'from' argument
  • - *
  • 1503 - missing or invalid 'to' argument
  • - *
  • 1520 - missing session ID argument
  • - *
- * - */ -class GeneratePlayReportMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - GeneratePlayReportMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - GeneratePlayReportMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the generatePlayReport command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // GeneratePlayReportMethod_h - diff --git a/src/products/scheduler/src/GeneratePlayReportMethodTest.cxx b/src/products/scheduler/src/GeneratePlayReportMethodTest.cxx deleted file mode 100644 index 4f8cdde48..000000000 --- a/src/products/scheduler/src/GeneratePlayReportMethodTest.cxx +++ /dev/null @@ -1,391 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" - -#include "SchedulerDaemon.h" -#include "PlayLogFactory.h" -#include "UploadPlaylistMethod.h" -#include "GeneratePlayReportMethod.h" -#include "GeneratePlayReportMethodTest.h" - -using namespace std; - -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::Authentication; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(GeneratePlayReportMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -GeneratePlayReportMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - Ptr::Ref storage = scheduler->getStorage(); - storage->reset(); - - playLog = scheduler->getPlayLog(); - insertEntries(); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } catch (std::exception &e) { - CPPUNIT_FAIL(e.what()); - } - - authentication = scheduler->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::string eMsg = "could not log in:\n"; - eMsg += e.what(); - CPPUNIT_FAIL(eMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -GeneratePlayReportMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -GeneratePlayReportMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new GeneratePlayReportMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - - // set up a structure for the parameters - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 101; // 2001 - time.tm_mon = 10; // November - time.tm_mday = 12; - time.tm_hour = 18; - time.tm_min = 31; - time.tm_sec = 1; - parameters["from"] = &time; - time.tm_year = 101; // 2001 - time.tm_mon = 10; // November - time.tm_mday = 12; - time.tm_hour = 19; - time.tm_min = 31; - time.tm_sec = 1; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.size() == 0); -} - - -/*------------------------------------------------------------------------------ - * Insert some entries into the play log - *----------------------------------------------------------------------------*/ -void -GeneratePlayReportMethodTest :: insertEntries(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref audioClipId(new UniqueId(10001)); - Ptr::Ref timestamp(new ptime(time_from_string( - "2004-10-26 14:00:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - audioClipId.reset(new UniqueId(10017)); - timestamp.reset(new ptime(time_from_string("2004-10-26 15:30:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - audioClipId.reset(new UniqueId(10003)); - timestamp.reset(new ptime(time_from_string("2004-10-27 10:01:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); -} - - -/*------------------------------------------------------------------------------ - * Look at some intervals and check against test data - *----------------------------------------------------------------------------*/ -void -GeneratePlayReportMethodTest :: intervalTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new GeneratePlayReportMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - - // check for the interval 2004-10-26 between 13 and 15 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 13; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 15; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 1); - CPPUNIT_ASSERT(result[0].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[0]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - UniqueId newAudioClipId = UniqueId(std::string(result[0]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10001); - - CPPUNIT_ASSERT(result[0].hasMember("timestamp")); - CPPUNIT_ASSERT(result[0]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[0]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 26); - CPPUNIT_ASSERT(time.tm_hour == 14); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - - - // check for the interval 2004-10-26 between 14 o'clock and 15:30 - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 14; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 15; - time.tm_min = 30; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 1); - CPPUNIT_ASSERT(result[0].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[0]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - newAudioClipId = UniqueId(std::string(result[0]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10001); - - CPPUNIT_ASSERT(result[0].hasMember("timestamp")); - CPPUNIT_ASSERT(result[0]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[0]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 26); - CPPUNIT_ASSERT(time.tm_hour == 14); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - - - // check for the interval 2004-10-26 15:00 to 2012-08-01 midnight - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 15; - time.tm_min = 30; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 112; // 2012 - time.tm_mon = 7; // August - time.tm_mday = 1; - time.tm_hour = 0; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 2); - CPPUNIT_ASSERT(result[0].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[0]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - newAudioClipId = UniqueId(std::string(result[0]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10017); - - CPPUNIT_ASSERT(result[0].hasMember("timestamp")); - CPPUNIT_ASSERT(result[0]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[0]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 26); - CPPUNIT_ASSERT(time.tm_hour == 15); - CPPUNIT_ASSERT(time.tm_min == 30); - CPPUNIT_ASSERT(time.tm_sec == 0); - - CPPUNIT_ASSERT(result[1].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[1]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - newAudioClipId = UniqueId(std::string(result[1]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10003); - - CPPUNIT_ASSERT(result[1].hasMember("timestamp")); - CPPUNIT_ASSERT(result[1]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[1]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 27); - CPPUNIT_ASSERT(time.tm_hour == 10); - CPPUNIT_ASSERT(time.tm_min == 01); - CPPUNIT_ASSERT(time.tm_sec == 0); - - - // check for the interval 2004-10-26 16 o'clock to 2004-10-27 10 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 16; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 27; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // check the returned values - CPPUNIT_ASSERT(result.size() == 0); -} - - diff --git a/src/products/scheduler/src/GeneratePlayReportMethodTest.h b/src/products/scheduler/src/GeneratePlayReportMethodTest.h deleted file mode 100644 index 2c7906224..000000000 --- a/src/products/scheduler/src/GeneratePlayReportMethodTest.h +++ /dev/null @@ -1,138 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GeneratePlayReportMethodTest_h -#define GeneratePlayReportMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the GeneratePlayReportMethod class. - * - * @see GeneratePlayReportMethod - */ -class GeneratePlayReportMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(GeneratePlayReportMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(intervalTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The play log used during the test. - */ - Ptr::Ref playLog; - - /** - * The authentication client produced by the factory. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Insert some entries into the play log to provide test data. - */ - void - insertEntries(void) throw (CPPUNIT_NS::Exception); - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Look at some intervals, and check them against the test data. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - intervalTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // GeneratePlayReportMethodTest_h - diff --git a/src/products/scheduler/src/GetSchedulerTimeMethod.cxx b/src/products/scheduler/src/GetSchedulerTimeMethod.cxx deleted file mode 100644 index f2bcb2345..000000000 --- a/src/products/scheduler/src/GetSchedulerTimeMethod.cxx +++ /dev/null @@ -1,102 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include -#include - -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "GetSchedulerTimeMethod.h" - - -using namespace boost::posix_time; -using namespace boost::gregorian; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string GetSchedulerTimeMethod::methodName - = "getSchedulerTime"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int GetSchedulerTimeMethod::errorId = 1900; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -GetSchedulerTimeMethod :: GetSchedulerTimeMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the stop XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -GetSchedulerTimeMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - Ptr::Ref schedulerPTime = TimeConversion::now(); - struct tm schedulerTime; - TimeConversion::ptimeToTm(schedulerPTime, schedulerTime); - returnValue["schedulerTime"] = & schedulerTime; -} - diff --git a/src/products/scheduler/src/GetSchedulerTimeMethod.h b/src/products/scheduler/src/GetSchedulerTimeMethod.h deleted file mode 100644 index 9591318f2..000000000 --- a/src/products/scheduler/src/GetSchedulerTimeMethod.h +++ /dev/null @@ -1,139 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GetSchedulerTimeMethod_h -#define GetSchedulerTimeMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to report the local time on the computer where - * the scheduler daemon is running. - * - * The name of the method when called through XML-RPC is - * "getSchedulerTime". - * - * No input parameters are expected. - * - * The XML-RPC function returns an XML-RPC structure containing a single - * ISO 8601 DateTime field: - *
    - *
  • schedulerTime - datetime - the local time on the scheduler
  • - *
- * - * This method does not generate any fault responses. - * - */ -class GetSchedulerTimeMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - GetSchedulerTimeMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - GetSchedulerTimeMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the getSchedulerTime command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // GetSchedulerTimeMethod_h - diff --git a/src/products/scheduler/src/GetSchedulerTimeMethodTest.cxx b/src/products/scheduler/src/GetSchedulerTimeMethodTest.cxx deleted file mode 100644 index ebbb10f7a..000000000 --- a/src/products/scheduler/src/GetSchedulerTimeMethodTest.cxx +++ /dev/null @@ -1,129 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include -#include - -#include "SchedulerDaemon.h" -#include "GetSchedulerTimeMethodTest.h" - -using namespace std; -using namespace XmlRpc; -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(GetSchedulerTimeMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -GetSchedulerTimeMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -GetSchedulerTimeMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ -} - - -/*------------------------------------------------------------------------------ - * Test a simple query, resulting in an empty result set. - *----------------------------------------------------------------------------*/ -void -GetSchedulerTimeMethodTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref - getSchedulerTimeMethod(new GetSchedulerTimeMethod()); - -// XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; -// rootParameter[0] = parameters; - XmlRpcValue result; - struct tm time1, - time2; - result.clear(); - try { - getSchedulerTimeMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("schedulerTime")); - time1 = result["schedulerTime"]; - - result.clear(); - try { - getSchedulerTimeMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("schedulerTime")); - time2 = result["schedulerTime"]; - - CPPUNIT_ASSERT(time1.tm_year == time2.tm_year); - // could fail on New Year's Eve, but we don't work on New Year's Eve - - CPPUNIT_ASSERT(time1.tm_hour <= time2.tm_hour); - CPPUNIT_ASSERT(time1.tm_min <= time2.tm_min); - CPPUNIT_ASSERT(time1.tm_min + 1 >= time2.tm_min); -} - diff --git a/src/products/scheduler/src/GetSchedulerTimeMethodTest.h b/src/products/scheduler/src/GetSchedulerTimeMethodTest.h deleted file mode 100644 index a00d3a00d..000000000 --- a/src/products/scheduler/src/GetSchedulerTimeMethodTest.h +++ /dev/null @@ -1,101 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GetSchedulerTimeMethodTest_h -#define GetSchedulerTimeMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the getSchedulerTime XML-RPC call. - * - * @see SchedulerDaemon - */ -class GetSchedulerTimeMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(GetSchedulerTimeMethodTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * Simple test for an empty query. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // GetSchedulerTimeMethodTest_h - diff --git a/src/products/scheduler/src/GetVersionMethod.cxx b/src/products/scheduler/src/GetVersionMethod.cxx deleted file mode 100644 index 465b22459..000000000 --- a/src/products/scheduler/src/GetVersionMethod.cxx +++ /dev/null @@ -1,94 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "GetVersionMethod.h" - - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string GetVersionMethod::methodName = "getVersion"; - - -/*------------------------------------------------------------------------------ - * The version string. - *----------------------------------------------------------------------------*/ -const std::string GetVersionMethod::versionStr = - "LiveSupport Scheduler Daemon " - PACKAGE_VERSION " " - "(" __DATE__ ")"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -GetVersionMethod :: GetVersionMethod ( - Ptr::Ref xmlRpcServer) throw () - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the stop XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -GetVersionMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - returnValue["version"] = versionStr; -} - diff --git a/src/products/scheduler/src/GetVersionMethod.h b/src/products/scheduler/src/GetVersionMethod.h deleted file mode 100644 index 66bd2fd35..000000000 --- a/src/products/scheduler/src/GetVersionMethod.h +++ /dev/null @@ -1,133 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GetVersionMethod_h -#define GetVersionMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to return the version string for the - * scheduler daemon. - * - * The name of the method when called through XML-RPC is "getVersion". - * - * There are no expected parameters for this method. - * - * The XML-RPC function returns an XML-RPC structure, containing the following - * fields: - *
    - *
  • version - string - the version string of the Scheduler Daemon
  • - *
- * - * There are no possible internal error condititons for this function. - * - */ -class GetVersionMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The version string, returned by this method. - */ - static const std::string versionStr; - - - public: - /** - * A default constructor, for testing purposes. - */ - GetVersionMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - GetVersionMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the create playlist command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // GetVersionMethod_h - diff --git a/src/products/scheduler/src/GetVersionMethodTest.cxx b/src/products/scheduler/src/GetVersionMethodTest.cxx deleted file mode 100644 index aa38b4554..000000000 --- a/src/products/scheduler/src/GetVersionMethodTest.cxx +++ /dev/null @@ -1,107 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "GetVersionMethod.h" -#include "GetVersionMethodTest.h" - -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(GetVersionMethodTest); - -/** - * The prefix of the persumed version string. - */ -static const std::string versionPrefix = "LiveSupport Scheduler Daemon"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -GetVersionMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -GetVersionMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -GetVersionMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new GetVersionMethod()); - XmlRpc::XmlRpcValue rootParameter; - XmlRpc::XmlRpcValue result; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("version")); - std::string versionStr = result["version"]; - CPPUNIT_ASSERT(versionStr.find(versionPrefix) == 0); -} - diff --git a/src/products/scheduler/src/GetVersionMethodTest.h b/src/products/scheduler/src/GetVersionMethodTest.h deleted file mode 100644 index 207a5f063..000000000 --- a/src/products/scheduler/src/GetVersionMethodTest.h +++ /dev/null @@ -1,105 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef GetVersionMethodTest_h -#define GetVersionMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the GetVersionMethod class. - * - * @see GetVersionMethod - */ -class GetVersionMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(GetVersionMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // GetVersionMethodTest_h - diff --git a/src/products/scheduler/src/LoginMethod.cxx b/src/products/scheduler/src/LoginMethod.cxx deleted file mode 100644 index 7c31a0859..000000000 --- a/src/products/scheduler/src/LoginMethod.cxx +++ /dev/null @@ -1,119 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "LoginMethod.h" - - -using namespace LiveSupport::Authentication; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string LoginMethod::methodName = "login"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int LoginMethod::errorId = 2000; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -LoginMethod :: LoginMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the XML-RPC function call. - * (Overrides 'execute' in XmlRpcServerMethod.) - *----------------------------------------------------------------------------*/ -void -LoginMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref loginName; - try{ - loginName = XmlRpcTools::extractLoginName(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, "missing login argument", - returnValue); - return; - } - - Ptr::Ref password; - try{ - password = XmlRpcTools::extractPassword(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "missing password argument", - returnValue); - return; - } - - Ptr::Ref - acf = AuthenticationClientFactory::getInstance(); - Ptr::Ref - authentication = acf->getAuthenticationClient(); - - Ptr::Ref sessionId; - try { - sessionId = authentication->login(*loginName, *password); - } catch (Core::XmlRpcException &e) { - std::string eMsg = "authentication login() returned error:\n"; - eMsg += e.what(); - XmlRpcTools::markError(errorId+4, eMsg, returnValue); - return; - } - - XmlRpcTools::sessionIdToXmlRpcValue(sessionId, returnValue); -} - diff --git a/src/products/scheduler/src/LoginMethod.h b/src/products/scheduler/src/LoginMethod.h deleted file mode 100644 index 7291c9ba4..000000000 --- a/src/products/scheduler/src/LoginMethod.h +++ /dev/null @@ -1,142 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LoginMethod_h -#define LoginMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to log in using the authentication server. - * - * The name of the method when called through XML-RPC is "login". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • login - string - the login name
  • - *
  • password - string - the password.
  • - *
- * - * The XML-RPC function returns an XML-RPC structure, containing the following - * fields: - *
    - *
  • sessionId - string - a new session ID.
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 2001 - invalid argument format
  • - *
  • 2002 - missing login argument
  • - *
  • 2003 - missing password argument
  • - *
  • 2004 - the authentication server reported an error
  • - *
- * - */ -class LoginMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - LoginMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - LoginMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the login command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // LoginMethod_h - diff --git a/src/products/scheduler/src/LogoutMethod.cxx b/src/products/scheduler/src/LogoutMethod.cxx deleted file mode 100644 index e88b67c5b..000000000 --- a/src/products/scheduler/src/LogoutMethod.cxx +++ /dev/null @@ -1,107 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "LogoutMethod.h" - - -using namespace LiveSupport::Authentication; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string LogoutMethod::methodName = "logout"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int LogoutMethod::errorId = 2100; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -LogoutMethod :: LogoutMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the XML-RPC function call. - * (Overrides 'execute' in XmlRpcServerMethod.) - *----------------------------------------------------------------------------*/ -void -LogoutMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, "missing logout argument", - returnValue); - return; - } - - Ptr::Ref - acf = AuthenticationClientFactory::getInstance(); - Ptr::Ref - authentication = acf->getAuthenticationClient(); - - try { - authentication->logout(sessionId); - } catch (Core::XmlRpcException &e) { - std::string eMsg = "authentication logout() returned error:\n"; - eMsg += e.what(); - XmlRpcTools::markError(errorId+4, eMsg, returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/LogoutMethod.h b/src/products/scheduler/src/LogoutMethod.h deleted file mode 100644 index d93325cd9..000000000 --- a/src/products/scheduler/src/LogoutMethod.h +++ /dev/null @@ -1,134 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef LogoutMethod_h -#define LogoutMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to log out from the authentication server. - * - * The name of the method when called through XML-RPC is "logout". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID returned by login.
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 2101 - invalid argument format
  • - *
  • 2120 - missing session ID argument
  • - *
  • 2104 - the authentication server reported an error
  • - *
- * - */ -class LogoutMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - LogoutMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - LogoutMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the logout command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // LogoutMethod_h - diff --git a/src/products/scheduler/src/PlayLogFactory.cxx b/src/products/scheduler/src/PlayLogFactory.cxx deleted file mode 100644 index 78a63cdc4..000000000 --- a/src/products/scheduler/src/PlayLogFactory.cxx +++ /dev/null @@ -1,110 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "PostgresqlPlayLog.h" -#include "PlayLogFactory.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string PlayLogFactory::configElementNameStr = - "playLogFactory"; - -/*------------------------------------------------------------------------------ - * The singleton instance of PlayLogFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref PlayLogFactory::singleton; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance to PlayLogFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref -PlayLogFactory :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new PlayLogFactory()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the play log factory. - *----------------------------------------------------------------------------*/ -void -PlayLogFactory :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - playLog.reset(); - - Ptr::Ref cmf = - ConnectionManagerFactory::getInstance(); - Ptr::Ref cm = cmf->getConnectionManager(); - - // try to look for a PostgresqlPlayLog configuration element - xmlpp::Node::NodeList nodes = - element.get_children(PostgresqlPlayLog::getConfigElementName()); - if (nodes.size() >= 1) { - const xmlpp::Element * configElement = - dynamic_cast (*(nodes.begin())); - Ptr::Ref dbs(new PostgresqlPlayLog(cm)); - dbs->configure(*configElement); - playLog = dbs; - } - - if (!playLog) { - throw std::invalid_argument("no play log factories to configure"); - } -} - diff --git a/src/products/scheduler/src/PlayLogFactory.h b/src/products/scheduler/src/PlayLogFactory.h deleted file mode 100644 index 1c2cf8b6b..000000000 --- a/src/products/scheduler/src/PlayLogFactory.h +++ /dev/null @@ -1,176 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlayLogFactory_h -#define PlayLogFactory_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Configurable.h" -#include "PlayLogInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The factory to create appropriate PlayLog objects. - * - * This object has to be configured with an element that contains - * the configuration element that the factory should build. - * Currently only PostgresqlPlayLog is supported by this factory. - * - * An example configuration element is the following: - * - *

- *      <playLogFactory>
- *          <postgresqlPlayLog/>
- *      </playLogFactory>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT playLogFactory (postgresqlPlayLog) >
- *  
- * - * For details on the <postgreslPlayLog> element, see the - * PostgresqlPlayLog documentation. - * - * @see PostgresqlPlayLog - */ -class PlayLogFactory : virtual public Configurable -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The play log created by this factory. - */ - Ptr::Ref playLog; - - /** - * The default constructor. - */ - PlayLogFactory(void) throw() - { - } - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PlayLogFactory(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuration information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Return a play log. - * - * @return the appropriate play log, according to the - * configuration of this factory. - */ - Ptr::Ref - getPlayLog(void) throw () - { - return playLog; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PlayLogFactory_h - diff --git a/src/products/scheduler/src/PlayLogInterface.h b/src/products/scheduler/src/PlayLogInterface.h deleted file mode 100644 index 0ef99c787..000000000 --- a/src/products/scheduler/src/PlayLogInterface.h +++ /dev/null @@ -1,117 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlayLogInterface_h -#define PlayLogInterface_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Playlist.h" -#include "LiveSupport/Core/PlayLogEntry.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The generic interface for the component scheduling events. - * - */ -class PlayLogInterface -{ - public: - /** - * Add a new entry to the play log. - * - * @param audioClipId the audio clip played. - * @param timeStamp the time the clip was played (started). - * @return the id of the newly created play log entry. - */ - virtual Ptr::Ref - addPlayLogEntry(Ptr::Ref audioClipId, - Ptr::Ref timeStamp) - throw (std::invalid_argument) - = 0; - - /** - * Return the list of play log entries for a specified time interval. - * - * @param fromTime the start of the time of the interval queried, - * inclusive - * @param toTime to end of the time of the interval queried, - * non-inclusive - * @return a vector of the play log entries for the time region. - */ - virtual Ptr::Ref> >::Ref - getPlayLogEntries(Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (std::invalid_argument) - = 0; - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PlayLogInterface(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PlayLogInterface_h - diff --git a/src/products/scheduler/src/PlaylistEvent.cxx b/src/products/scheduler/src/PlaylistEvent.cxx deleted file mode 100644 index b31c00399..000000000 --- a/src/products/scheduler/src/PlaylistEvent.cxx +++ /dev/null @@ -1,182 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_UNISTD_H -#include -#else -#error need unistd.h -#endif - -#include - -#define DEBUG_PREFIX "Scheduler" -#include "LiveSupport/Core/Debug.h" - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Core/SessionId.h" - -#include "PlaylistEvent.h" - -using namespace boost; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -PlaylistEvent :: PlaylistEvent( - Ptr::Ref sessionId, - Ptr::Ref audioPlayer, - Ptr::Ref storage, - Ptr::Ref playLog, - Ptr::Ref scheduleEntry) - throw () -{ - this->sessionId = sessionId; - this->audioPlayer = audioPlayer; - this->storage = storage; - this->playLog = playLog; - this->scheduleEntry = scheduleEntry; - - // this init time is a wild guess, say 10 seconds should be enough - initTime.reset(new posix_time::time_duration(0, 0, 10, 0)); - - state = created; -} - - -/*------------------------------------------------------------------------------ - * Initialize the event object. - *----------------------------------------------------------------------------*/ -void -PlaylistEvent :: initialize(void) throw (std::exception) -{ - //DEBUG_BLOCK - - if (state != created) { - throw std::logic_error("PlaylistEvent in bad state"); - } - - state = initializing; - // some ugliness because getPlaylistId() returns a const pointer - Ptr::Ref playlistId(new UniqueId(scheduleEntry->getPlaylistId() - ->getId())); - try { - playlist = storage->acquirePlaylist(sessionId, playlistId); - } catch (Core::XmlRpcException &e) { - std::string errorMessage = "storage server error: "; - errorMessage += e.what(); - throw std::logic_error(errorMessage); - } - - audioPlayer->preload(*playlist->getUri()); - state = initialized; -} - - -/*------------------------------------------------------------------------------ - * De-initialize the event object. - *----------------------------------------------------------------------------*/ -void -PlaylistEvent :: deInitialize(void) throw () -{ - DEBUG_BLOCK - - try { - storage->releasePlaylist(playlist); - } catch (XmlRpcException &e) { - std::cerr << e.what() << std::endl; - // TODO: handle error? - } - playlist.reset(); - state = deInitialized; -} - - -/*------------------------------------------------------------------------------ - * Initialize the event object. - *----------------------------------------------------------------------------*/ -void -PlaylistEvent :: start(Ptr::Ref offset) throw () -{ - DEBUG_BLOCK - - if (state != initialized) { - initialize(); - } - - try { - audioPlayer->open(*playlist->getUri(), (gint64)playlist->getId()->getId(), offset->total_nanoseconds()); - audioPlayer->start(); - - playLog->addPlayLogEntry(playlist->getId(), TimeConversion::now()); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - // TODO: handle error? - } catch (std::runtime_error &e) { - std::cerr << e.what() << std::endl; - // TODO: handle error? - } - state = running; -} - - -/*------------------------------------------------------------------------------ - * Initialize the event object. - *----------------------------------------------------------------------------*/ -void -PlaylistEvent :: stop(void) throw () -{ - DEBUG_BLOCK - - try { - audioPlayer->stop(); - audioPlayer->close(); - } catch (std::logic_error &e) { - // TODO: handle error - // NOTE: this may not be an error, because the user may have stopped - // the playback manually (see Scheduler::StopCurrentlyPlayingMethod) - std::cerr << "PlaylistEvent::stop error: " << std::endl; - std::cerr << e.what() << std::endl; - } - state = stopped; -} - diff --git a/src/products/scheduler/src/PlaylistEvent.h b/src/products/scheduler/src/PlaylistEvent.h deleted file mode 100644 index fcb7f8820..000000000 --- a/src/products/scheduler/src/PlaylistEvent.h +++ /dev/null @@ -1,240 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlaylistEvent_h -#define PlaylistEvent_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Core/ScheduleEntry.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "LiveSupport/EventScheduler/ScheduledEventInterface.h" - -#include "PlayLogInterface.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::EventScheduler; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::StorageClient; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A scheduled event for playing a playlist. - * - */ -class PlaylistEvent : public virtual ScheduledEventInterface -{ - private: - /** - * Enumeration describing the possible states of the event. - */ - typedef enum { created, - initializing, - initialized, - running, - stopped, - deInitialized } State; - - private: - /** - * The audio player to play the playlist with. - */ - Ptr::Ref audioPlayer; - - /** - * The play log facility. - */ - Ptr::Ref playLog; - - /** - * The storage containing the playlist and all related audio clips. - */ - Ptr::Ref storage; - - /** - * The schedule entry this event is playing. - */ - Ptr::Ref scheduleEntry; - - /** - * The maximum time this event should get initialized in. - */ - Ptr::Ref initTime; - - /** - * The Playlist this event is playing. - */ - Ptr::Ref playlist; - - /** - * The session ID used for authentication at the storage server. - */ - Ptr::Ref sessionId; - - /** - * The current state of the event. - */ - State state; - - - public: - /** - * Constructor. - * - * @param sessionId the session id used to access the storage. - * @param audioPlayer the audio player to play the playlist with. - * @param storage the storage containing the playlist to play, - * and all the related audio clips. - * @param playLog the play log facility. - * @param scheduleEntry the schedule entry this event is - * playing. - */ - PlaylistEvent(Ptr::Ref sessionId, - Ptr::Ref audioPlayer, - Ptr::Ref storage, - Ptr::Ref playLog, - Ptr::Ref scheduleEntry) - throw (); - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PlaylistEvent(void) throw () - { - } - - /** - * Tell the time this event is scheduled for. - * - * @return the time this event is scheduled for. - */ - virtual Ptr::Ref - getScheduledTime(void) throw () - { - return scheduleEntry->getStartTime(); - } - - /** - * Initialize the event object. - * This should finishin at most maxTimeToInitialize() time. - * Use this call to allocate any resources that will be needed - * by the event itself. - * - * @exception std::exception on initialization problems. - * a raised exception will result in the cancellation - * of the event. - * @see #maxTimeToInitialize - */ - virtual void - initialize(void) throw (std::exception); - - /** - * The maximum time for the initalize() function to complete. - * It is the responsibility of the ScheduledEventInterface object to - * complete the initialization in that time. - * - * @return the maximum time for the initialize() function to complete. - * @see #initialize - */ - virtual Ptr::Ref - maxTimeToInitialize(void) throw () - { - return initTime; - } - - /** - * De-initialize the event object. - */ - virtual void - deInitialize(void) throw (); - - /** - * Start the event. - * This function call should start the execution of the event in - * a separate thread, and return immediately. - */ - virtual void - start(Ptr::Ref offset) throw (); - - /** - * The length of the event. - * The scheduler will call stop() when this much time has passed - * after calling start(). - * - * @return the length of the event, in time. - */ - virtual Ptr::Ref - eventLength(void) throw () - { - return scheduleEntry->getPlaylength(); - } - - /** - * Stop the event. - * This function call should result in the event stopping, if - * this has not happened yet. The processing of this event should - * persue in a seperate thread, and the function itself should - * return immediately. - */ - virtual void - stop(void) throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - - -#endif // PlaylistEvent_h - diff --git a/src/products/scheduler/src/PlaylistEventContainer.cxx b/src/products/scheduler/src/PlaylistEventContainer.cxx deleted file mode 100644 index a299b4551..000000000 --- a/src/products/scheduler/src/PlaylistEventContainer.cxx +++ /dev/null @@ -1,114 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_UNISTD_H -#include -#else -#error need unistd.h -#endif - - -#include "PlaylistEventContainer.h" -#include "PlaylistEvent.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::EventScheduler; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Constructor. - *----------------------------------------------------------------------------*/ -PlaylistEventContainer :: PlaylistEventContainer( - Ptr::Ref sessionId, - Ptr::Ref storage, - Ptr::Ref schedule, - Ptr::Ref audioPlayer, - Ptr::Ref playLog) - throw () -{ - this->sessionId = sessionId; - this->storage = storage; - this->schedule = schedule; - this->audioPlayer = audioPlayer; - this->playLog = playLog; -} - - -/*------------------------------------------------------------------------------ - * Return the first scheduled event after the specified timepoint - *----------------------------------------------------------------------------*/ -Ptr::Ref -PlaylistEventContainer :: getNextEvent(Ptr::Ref when) throw () -{ - Ptr::Ref entry = schedule->getNextEntry(when); - Ptr::Ref event; - - if (entry.get()) { - event.reset(new PlaylistEvent(sessionId, - audioPlayer, - storage, - playLog, - entry)); - } - - return event; -} - -/*------------------------------------------------------------------------------ - * Return the first scheduled event after the specified timepoint - *----------------------------------------------------------------------------*/ -Ptr::Ref -PlaylistEventContainer :: getCurrentEvent() throw () -{ - Ptr::Ref entry = schedule->getCurrentEntry(); - Ptr::Ref event; - - if (entry.get()) { - event.reset(new PlaylistEvent(sessionId, - audioPlayer, - storage, - playLog, - entry)); - } - - return event; -} - diff --git a/src/products/scheduler/src/PlaylistEventContainer.h b/src/products/scheduler/src/PlaylistEventContainer.h deleted file mode 100644 index 70624389b..000000000 --- a/src/products/scheduler/src/PlaylistEventContainer.h +++ /dev/null @@ -1,162 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlaylistEventContainer_h -#define PlaylistEventContainer_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "LiveSupport/EventScheduler/EventContainerInterface.h" - -#include "PlayLogInterface.h" -#include "ScheduleInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::EventScheduler; -using namespace LiveSupport::StorageClient; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An event container holding the scheduled playlists. - * - */ -class PlaylistEventContainer : public virtual EventContainerInterface -{ - private: - /** - * The session id, passed on to PlaylistEvents, to access - * resources from the storage. - */ - Ptr::Ref sessionId; - - /** - * The storage containing the playlists to play. - */ - Ptr::Ref storage; - - /** - * The schedule interface to get the events from. - */ - Ptr::Ref schedule; - - /** - * The audio player to play the playlist with. - */ - Ptr::Ref audioPlayer; - - /** - * The play log facility. - */ - Ptr::Ref playLog; - - - public: - /** - * Constructor. - * - * @param sessionId the session id that will be accepted by - * calls to storage - * @param storage the storage containing the playlist and related - * audio clips - * @param schedule the schedule to get the events from. - * @param audioPlayer the audio player to play the playlists with. - * @param playLog the play log facility. - */ - PlaylistEventContainer(Ptr::Ref sessionId, - Ptr::Ref storage, - Ptr::Ref schedule, - Ptr::Ref audioPlayer, - Ptr::Ref playLog) - throw (); - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PlaylistEventContainer(void) throw () - { - } - - /** - * Return the first event after the specified timepoint. - * - * @param when return the first event after this timepoint, - * @return the first event to schedule after the specified - * timepoint. may be a reference to 0, if currently - * there are no known events after the specified time. - */ - virtual Ptr::Ref - getNextEvent(Ptr::Ref when) throw (); - - - /** - * Return current event - * - * @param - * @return the first event to schedule at this point in time - * may be a reference to 0, if there are no known events at this time - */ - virtual Ptr::Ref - getCurrentEvent() throw (); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - - -#endif // PlaylistEventContainer_h - diff --git a/src/products/scheduler/src/PlaylistEventContainerTest.cxx b/src/products/scheduler/src/PlaylistEventContainerTest.cxx deleted file mode 100644 index e5be1dfb9..000000000 --- a/src/products/scheduler/src/PlaylistEventContainerTest.cxx +++ /dev/null @@ -1,184 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "PlayLogFactory.h" - -#include "SchedulerDaemon.h" -#include "PlaylistEventContainer.h" -#include "PlaylistEventContainerTest.h" - - -using namespace boost::posix_time; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::Authentication; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(PlaylistEventContainerTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -PlaylistEventContainerTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - audioPlayer = scheduler->getAudioPlayer(); - storage = scheduler->getStorage(); - storage->reset(); - schedule = scheduler->getSchedule(); - authentication = scheduler->getAuthentication(); - playLog = scheduler->getPlayLog(); - - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - audioPlayer->initialize(); - - if (!(sessionId = authentication->login("root", "q"))) { - CPPUNIT_FAIL("could not log in to authentication server"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -PlaylistEventContainerTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - audioPlayer->deInitialize(); - - playLog.reset(); - schedule.reset(); - storage.reset(); - audioPlayer.reset(); - - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * A simple smoke test. - *----------------------------------------------------------------------------*/ -void -PlaylistEventContainerTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref container; - container.reset(new PlaylistEventContainer(sessionId, - storage, - schedule, - audioPlayer, - playLog)); - - // see that there are no events scheduled - Ptr::Ref scheduledEvent; - scheduledEvent = container->getNextEvent(TimeConversion::now()); - CPPUNIT_ASSERT(!scheduledEvent.get()); -} - - -/*------------------------------------------------------------------------------ - * Schedule something, and see if we can get it back. - *----------------------------------------------------------------------------*/ -void -PlaylistEventContainerTest :: scheduleTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref container; - container.reset(new PlaylistEventContainer(sessionId, - storage, - schedule, - audioPlayer, - playLog)); - - // schedule playlist 1 at 10 seconds from now - Ptr::Ref playlistId(new UniqueId(1)); - Ptr::Ref playlist = storage->getPlaylist(sessionId, - playlistId); - CPPUNIT_ASSERT(playlist.get()); - Ptr::Ref now = TimeConversion::now(); - Ptr::Ref from(new ptime(*now + seconds(10))); - - try { - schedule->schedulePlaylist(playlist, from); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } - - Ptr::Ref scheduledEvent; - - // see if we can get back the scheduled playlist - scheduledEvent = container->getNextEvent(now); - CPPUNIT_ASSERT(scheduledEvent.get()); - CPPUNIT_ASSERT(*scheduledEvent->eventLength() - == *playlist->getPlaylength()); - - // see that there are no events scheduled after from - scheduledEvent = container->getNextEvent(from); - CPPUNIT_ASSERT(!scheduledEvent.get()); -} - diff --git a/src/products/scheduler/src/PlaylistEventContainerTest.h b/src/products/scheduler/src/PlaylistEventContainerTest.h deleted file mode 100644 index 3eb266698..000000000 --- a/src/products/scheduler/src/PlaylistEventContainerTest.h +++ /dev/null @@ -1,159 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlaylistEventContainerTest_h -#define PlaylistEventContainerTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "ScheduleInterface.h" -#include "PlayLogInterface.h" -#include "ScheduleFactory.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::StorageClient; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the PlaylistEventContainer class - * - * @see PlaylistEventContainer - */ -class PlaylistEventContainerTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(PlaylistEventContainerTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(scheduleTest); - CPPUNIT_TEST_SUITE_END(); - - private: - /** - * The audio player used by the test. - */ - Ptr::Ref audioPlayer; - - /** - * The storage used by the container. - */ - Ptr::Ref storage; - - /** - * The schedule used by the container. - */ - Ptr::Ref schedule; - - /** - * An authentication client. - */ - Ptr::Ref authentication; - - /** - * A playlog interface. - */ - Ptr::Ref playLog; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - - protected: - - /** - * Simple smoke test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test to see if we can get back a scheduled event. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - scheduleTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PlaylistEventContainerTest_h - diff --git a/src/products/scheduler/src/PlaylistEventTest.cxx b/src/products/scheduler/src/PlaylistEventTest.cxx deleted file mode 100644 index 82b58bea8..000000000 --- a/src/products/scheduler/src/PlaylistEventTest.cxx +++ /dev/null @@ -1,202 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerFactory.h" - -#include "SchedulerDaemon.h" -#include "PlayLogFactory.h" -#include "PlaylistEvent.h" -#include "PlaylistEventTest.h" - - -using namespace boost::posix_time; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::PlaylistExecutor; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(PlaylistEventTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -PlaylistEventTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - audioPlayer = scheduler->getAudioPlayer(); - storage = scheduler->getStorage(); - storage->reset(); - authentication = scheduler->getAuthentication(); - playLog = scheduler->getPlayLog(); - - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - - audioPlayer->initialize(); - - duration.reset(new time_duration(seconds(30))); - - if (!(sessionId = authentication->login("root", "q"))) { - CPPUNIT_FAIL("could not log in to authentication server"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -PlaylistEventTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - audioPlayer->deInitialize(); - - duration.reset(); - storage.reset(); - audioPlayer.reset(); - playLog.reset(); - - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Create a sample playlist event - *----------------------------------------------------------------------------*/ -Ptr::Ref -PlaylistEventTest :: createTestEvent(void) throw (CPPUNIT_NS::Exception) -{ - // create a fake schedule entry, with id 1 for playlist 1, starting - // 10 seconds from now, and lasting 30 seconds - Ptr::Ref entryId(new UniqueId(1)); - Ptr::Ref playlistId(new UniqueId(1)); - Ptr::Ref now = TimeConversion::now(); - Ptr::Ref startTime(new ptime(*now + seconds(10))); - Ptr::Ref endTime(new ptime(*startTime + *duration)); - Ptr::Ref scheduleEntry(new ScheduleEntry(entryId, - playlistId, - startTime, - endTime)); - - Ptr::Ref playlistEvent(new PlaylistEvent(sessionId, - audioPlayer, - storage, - playLog, - scheduleEntry)); - - return playlistEvent; -} - - -/*------------------------------------------------------------------------------ - * A simple smoke test. - *----------------------------------------------------------------------------*/ -void -PlaylistEventTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref playlistEvent = createTestEvent(); - - CPPUNIT_ASSERT(*playlistEvent->eventLength() == seconds(30)); -} - - -/*------------------------------------------------------------------------------ - * See if the playlist event can be initialized. - *----------------------------------------------------------------------------*/ -void -PlaylistEventTest :: initializeTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref playlistEvent = createTestEvent(); - - try { - playlistEvent->initialize(); - playlistEvent->deInitialize(); - } catch (std::logic_error &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * See if the playlist can be played - *----------------------------------------------------------------------------*/ -void -PlaylistEventTest :: playTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref playlistEvent = createTestEvent(); - - try { - playlistEvent->initialize(); - playlistEvent->start(); - TimeConversion::sleep(duration); - playlistEvent->stop(); - playlistEvent->deInitialize(); - } catch (std::logic_error &e) { - CPPUNIT_FAIL(e.what()); - } catch (std::exception &e) { - CPPUNIT_FAIL(e.what()); - } -} - diff --git a/src/products/scheduler/src/PlaylistEventTest.h b/src/products/scheduler/src/PlaylistEventTest.h deleted file mode 100644 index aa4e329d7..000000000 --- a/src/products/scheduler/src/PlaylistEventTest.h +++ /dev/null @@ -1,168 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PlaylistEventTest_h -#define PlaylistEventTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "PlayLogInterface.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::PlaylistExecutor; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the PlaylistEvent class - * - * @see PlaylistEvent - */ -class PlaylistEventTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(PlaylistEventTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(initializeTest); - CPPUNIT_TEST(playTest); - CPPUNIT_TEST_SUITE_END(); - - private: - /** - * The audio player used by the test. - */ - Ptr::Ref audioPlayer; - - /** - * The storage used by the interface. - */ - Ptr::Ref storage; - - /** - * The duration of the testing events. - */ - Ptr::Ref duration; - - /** - * An authentication client. - */ - Ptr::Ref authentication; - - /** - * A playlog interface. - */ - Ptr::Ref playLog; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Create a playlist event for testing purposes. - */ - Ptr::Ref - createTestEvent(void) throw (CPPUNIT_NS::Exception); - - - protected: - - /** - * Simple smoke test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to see if the playlist event can be initialized. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - initializeTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to see if the playlist event can be played. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - playTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PlaylistEventTest_h - diff --git a/src/products/scheduler/src/PostgresqlBackup.cxx b/src/products/scheduler/src/PostgresqlBackup.cxx deleted file mode 100644 index b9875f3e7..000000000 --- a/src/products/scheduler/src/PostgresqlBackup.cxx +++ /dev/null @@ -1,429 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Core/FileTools.h" -#include "LiveSupport/Core/XmlRpcInvalidArgumentException.h" -#include "LiveSupport/Core/XmlRpcMethodFaultException.h" -#include "LiveSupport/Core/XmlRpcIOException.h" -#include "LiveSupport/Db/Conversion.h" -#include "PostgresqlBackup.h" - -using namespace odbc; -using namespace boost::posix_time; -using namespace xmlpp; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string PostgresqlBackup::configElementNameStr - = "postgresqlBackup"; - -namespace { - -/*------------------------------------------------------------------------------ - * The name of the schedule export element - *----------------------------------------------------------------------------*/ -const std::string scheduleExportElementName = "scheduleExport"; - - -/*------------------------------------------------------------------------------ - * The name of the fromTime attribute - *----------------------------------------------------------------------------*/ -const std::string fromTimeAttrName = "fromTime"; - -/*------------------------------------------------------------------------------ - * The name of the toTime attribute - *----------------------------------------------------------------------------*/ -const std::string toTimeAttrName = "toTime"; - - -/*------------------------------------------------------------------------------ - * The working backup state - *----------------------------------------------------------------------------*/ -const std::string workingState = "working"; - -/*------------------------------------------------------------------------------ - * The finished / success backup state - *----------------------------------------------------------------------------*/ -const std::string successState = "success"; - -/*------------------------------------------------------------------------------ - * The finished / failure backup state - *----------------------------------------------------------------------------*/ -const std::string failureState = "fault"; - - -/*------------------------------------------------------------------------------ - * The name of the schedule export fie in the export tarbal; - *----------------------------------------------------------------------------*/ -const std::string scheduleExportFileName = "meta-inf/scheduler.xml"; - - -/*------------------------------------------------------------------------------ - * A statement to check if the database can be accessed. - *----------------------------------------------------------------------------*/ -const std::string check1Stmt = "SELECT 1"; - -/*------------------------------------------------------------------------------ - * A statement to check if the backup table exists. - *----------------------------------------------------------------------------*/ -const std::string backupCountStmt = "SELECT COUNT(*) FROM backup"; - -/*------------------------------------------------------------------------------ - * A statement to store a backup entry. - * - token - the token of the backup - * - status - the status of the backup, either 'working', 'success' or 'fault' - * - fromTime - the start time of the schedule backup - * - toTime - the end time of the schedule backup - *----------------------------------------------------------------------------*/ -const std::string storeBackupStmt = - "INSERT INTO backup(token, sessionId, status, fromTime, toTime) " - "VALUES(?, ?, ?, ?, ?)"; - -/*------------------------------------------------------------------------------ - * Get a backup from the database. - * - token - the token of an existing backup - *----------------------------------------------------------------------------*/ -const std::string getBackupStmt = - "SELECT token, sessionId, status, fromTime, toTime FROM backup " - "WHERE token = ?"; - -/*------------------------------------------------------------------------------ - * A statement to update a backup entry. - * - status - the new status of the backup - * - token - the token of an existing backup - *----------------------------------------------------------------------------*/ -const std::string updateBackupStmt = - "UPDATE backup SET status = ? WHERE token = ?"; - -/*------------------------------------------------------------------------------ - * A statement to delete a backup entry - * - token - the token of an existing backup - *----------------------------------------------------------------------------*/ -const std::string deleteBackupStmt = "DELETE FROM backup WHERE token = ?"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the backup. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackup :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - // nothing to do here, really -} - - -/*------------------------------------------------------------------------------ - * Start a backup process. - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlBackup ::createBackupOpen(Ptr::Ref sessionId, - Ptr::Ref criteria, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (XmlRpcException) -{ - Ptr::Ref token; - Ptr::Ref conn; - bool result = false; - - // open up a backup process with the storage server - token = storage->createBackupOpen(sessionId, criteria); - - // store the details of the backup, with a pending status - try { - conn = connectionManager->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - storeBackupStmt)); - pstmt->setString(1, *token); - pstmt->setString(2, sessionId->getId()); - pstmt->setString(3, asyncStateToString(AsyncState::pendingState)); - - timestamp = Conversion::ptimeToTimestamp(fromTime); - pstmt->setTimestamp(4, *timestamp); - - timestamp = Conversion::ptimeToTimestamp(toTime); - pstmt->setTimestamp(5, *timestamp); - - result = pstmt->executeUpdate() == 1; - - connectionManager->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - connectionManager->returnConnection(conn); - } - throw XmlRpcMethodFaultException(e.what()); - } - - if (!result) { - throw XmlRpcMethodFaultException("couldn't insert into database"); - } - - return token; -} - - -/*------------------------------------------------------------------------------ - * Check on the status of a backup process. - *----------------------------------------------------------------------------*/ -AsyncState -PostgresqlBackup ::createBackupCheck( - const Glib::ustring & token, - Ptr::Ref & url, - Ptr::Ref & path, - Ptr::Ref & errorMessage) - throw (XmlRpcException) -{ - Ptr::Ref conn; - AsyncState status; - Ptr::Ref fromTime; - Ptr::Ref toTime; - bool result; - - // first, check on the status ourselves - try { - Ptr::Ref timestamp; - - conn = connectionManager->getConnection(); - Ptr::Ref pstmt(conn->prepareStatement( - getBackupStmt)); - - pstmt->setString(1, token); - - Ptr::Ref rs(pstmt->executeQuery()); - if (rs->next()) { - status = stringToAsyncState(rs->getString(3)); - - timestamp.reset(new Timestamp(rs->getTimestamp(4))); - fromTime = Conversion::timestampToPtime(timestamp); - - timestamp.reset(new Timestamp(rs->getTimestamp(5))); - toTime = Conversion::timestampToPtime(timestamp); - } - - connectionManager->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - connectionManager->returnConnection(conn); - } - // TODO: report error - return status; - } - - if (status == AsyncState::pendingState) { - status = storage->createBackupCheck(token, url, path, errorMessage); - - if (status == AsyncState::finishedState) { - putScheduleExportIntoTar(path, fromTime, toTime); - } - } - - // update the status - try { - conn = connectionManager->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - updateBackupStmt)); - pstmt->setString(1, asyncStateToString(status)); - pstmt->setString(2, token); - - result = pstmt->executeUpdate() == 1; - - connectionManager->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - connectionManager->returnConnection(conn); - } - throw XmlRpcMethodFaultException(e.what()); - } - - if (!result) { - throw XmlRpcMethodFaultException("couldn't insert into database"); - } - - return status; -} - - -/*------------------------------------------------------------------------------ - * Close a backup process, and free up all resources. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackup ::putScheduleExportIntoTar( - Ptr::Ref & path, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (std::runtime_error) -{ - Ptr::Ref document(new Document()); - Element * root = document->create_root_node("scheduler"); - std::string tmpFileName = FileTools::tempnam(); - - // create the export, and write it to a temporary file - schedule->exportScheduleEntries(root, fromTime, toTime); - document->write_to_file(tmpFileName); - - try { - FileTools::appendFileToTarball(*path, - tmpFileName, - scheduleExportFileName); - } catch (std::runtime_error &e) { - remove(tmpFileName.c_str()); - throw; - } - - remove(tmpFileName.c_str()); -} - - -/*------------------------------------------------------------------------------ - * Close a backup process, and free up all resources. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackup ::createBackupClose(const Glib::ustring & token) - throw (XmlRpcException) -{ - Ptr::Ref conn; - bool result; - - storage->createBackupClose(token); - - // delete the backup from our database - try { - conn = connectionManager->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - deleteBackupStmt)); - pstmt->setString(1, token); - - result = pstmt->executeUpdate() == 1; - - connectionManager->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - connectionManager->returnConnection(conn); - } - throw XmlRpcInvalidArgumentException(e.what()); - } - - if (!result) { - throw XmlRpcMethodFaultException("couldn't insert into database"); - } -} - - -/*------------------------------------------------------------------------------ - * Convert a string status to an AsyncState. - *----------------------------------------------------------------------------*/ -AsyncState -PostgresqlBackup ::stringToAsyncState(const std::string & statusString) - throw () -{ - return AsyncState::fromBackupString(statusString); -} - - -/*------------------------------------------------------------------------------ - * Convert an AsyncState to a string. - *----------------------------------------------------------------------------*/ -std::string -PostgresqlBackup ::asyncStateToString(AsyncState status) - throw () -{ - return *status.toBackupString(); -} - - -/*------------------------------------------------------------------------------ - * Restore a schedule backup. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackup :: restoreBackup(Ptr::Ref sessionId, - Ptr::Ref path) - throw (XmlRpcException) -{ - //TODO: check the session ID - - std::string tmpFileName = FileTools::tempnam(); - try { - FileTools::extractFileFromTarball(*path, - scheduleExportFileName, - tmpFileName); - } catch (std::runtime_error &e) { - remove(tmpFileName.c_str()); - std::string errorMsg = "error opening the schedule backup file:\n"; - errorMsg += e.what(); - throw XmlRpcIOException(errorMsg); - } - - Ptr::Ref parser(new DomParser(tmpFileName, - false /* do not expect a DTD */)); - const Document * document = parser->get_document(); - const Element * xmlSchedule = document->get_root_node(); - const Node::NodeList children = xmlSchedule->get_children( - "scheduleExport"); - const Element * xmlScheduleExport - = (const Element *) children.front(); - try { - schedule->importScheduleEntries(xmlScheduleExport); - } catch (std::invalid_argument &e) { - std::string errorMsg = "error restoring the schedule backup:\n"; - errorMsg += e.what(); - throw XmlRpcMethodFaultException(errorMsg); - } -} - diff --git a/src/products/scheduler/src/PostgresqlBackup.h b/src/products/scheduler/src/PostgresqlBackup.h deleted file mode 100644 index 93e91cda1..000000000 --- a/src/products/scheduler/src/PostgresqlBackup.h +++ /dev/null @@ -1,306 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PostgresqlBackup_h -#define PostgresqlBackup_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Db/ConnectionManagerInterface.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "ScheduleInterface.h" -#include "BackupInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An object for creating and restoring combined schedule and storage backups. - * - * This an implementation of the BackupInterface type. It stores the token - * used for the createBackupXxxx() functions in a PostgreSQL database. - * - * This object has to be configured with a simple empty element, as - * the following: - * - *

- *      <postgresqlBackup/>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT postgresqlBackup EMPTY >
- *  
- * - */ -class PostgresqlBackup : public Configurable, - public BackupInterface -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The database connection manager to use for connecting to the - * database. - */ - Ptr::Ref connectionManager; - - /** - * The storage client to use for connecting to the storage server. - */ - Ptr::Ref storage; - - /** - * The schedule to use for reading the schedule entries from. - */ - Ptr::Ref schedule; - - /** - * The default constructor. - */ - PostgresqlBackup(void) throw() - { - } - - /** - * Insert a schedule export XML file into an existing tarball. - * - * @param path the file path to the existing tarball. - * @param fromTime the time to generate the XML export from - * @param toTime the time to generate the XML export to - * @throws std::runtime_error on file / tarball handling issues. - */ - void - putScheduleExportIntoTar( - Ptr::Ref & path, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (std::runtime_error); - - /** - * Convert a string status to an AsyncState. - * It converts - *
    - *
  • "working" -> pendingState
  • - *
  • "success" -> finishedState
  • - *
  • "fault" -> failedState
  • - *
  • anything else -> invalidState
  • - *
- */ - AsyncState - stringToAsyncState(const std::string & statusString) throw (); - - /** - * Convert an AsyncState to a string. - * It converts - *
    - *
  • initState or pendingState -> "working"
  • - *
  • finishedState -> "success"
  • - *
  • failedState -> "fault"
  • - *
  • anything else -> "invalid"
  • - *
- */ - std::string - asyncStateToString(AsyncState status) - throw (); - - - public: - /** - * Construct a PostgresqlBackup. - * - * @param cm the connection manager the PostgresqlBackup will use to - * connect to the database. - */ - PostgresqlBackup( - Ptr::Ref connectionManager, - Ptr::Ref storage, - Ptr::Ref schedule) - throw () - : connectionManager(connectionManager), - storage(storage), - schedule(schedule) - { - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PostgresqlBackup(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Configure the object based on the XML element supplied. - * The supplied element is expected to be of the name - * returned by configElementName(). - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Start to create a backup by calling the storage, and also - * adding a backup of the schedule. - * To check if the backup procedure is still pending, call - * createBackupCheck() regularly. - * Make sure to close the backup by calling createBackupClose(). - * - * @param sessionId a valid session ID to use for accessing the - * storage - * @param criteria the criteria to use for backing up the storage - * @param fromTime entries are included in the schedule export starting - * from this time. - * @param toTime entries as included in the schedule export - * up to but not including this time. - * @return a token, which can be used to query the backup process. - * @exception XmlRpcException on XML-RPC issues. - * @see #createBackupCheck - * @see #createBackupClose - */ - virtual Ptr::Ref - createBackupOpen(Ptr::Ref sessionId, - Ptr::Ref criteria, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (XmlRpcException); - - /** - * Check the status of a storage backup. - * - * @param token the identifier of this backup task. - * @param url return parameter; - * if the status is "success", it contains the - * URL of the created backup file. - * @param path return parameter; - * if the status is "success", it contains the - * local access path of the created backup file. - * @param errorMessage return parameter; - * if the status is "fault", it contains the - * fault string. - * @return the state of the backup process: one of pendingState, - * finishedState, or failedState. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - * @see #createBackupOpen - * @see #createBackupClose - */ - virtual AsyncState - createBackupCheck(const Glib::ustring & token, - Ptr::Ref & url, - Ptr::Ref & path, - Ptr::Ref & errorMessage) - throw (XmlRpcException); - - /** - * Close the storage backup process. - * Frees up all resources allocated to the backup. - * - * @param token the identifier of this backup task. - * @exception XmlRpcException if there is a problem with the XML-RPC - * call. - * @see #createBackupOpen - * @see #createBackupCheck - */ - virtual void - createBackupClose(const Glib::ustring & token) - throw (XmlRpcException); - - /** - * Restore a schedule backup. - * - * All playlist IDs contained in the backup should already be in the - * storage. If this is a combined backup, with both storage and - * schedule components, then restore this backup to the storage - * first, and then call this function. - * - * @param sessionId a valid session ID to identify the user. - * @param path the location of the archive to upload. - * @exception XmlRpcException if there is an error. - */ - virtual void - restoreBackup(Ptr::Ref sessionId, - Ptr::Ref path) - throw (XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PostgresqlBackup_h - diff --git a/src/products/scheduler/src/PostgresqlBackupTest.cxx b/src/products/scheduler/src/PostgresqlBackupTest.cxx deleted file mode 100644 index 00d69e640..000000000 --- a/src/products/scheduler/src/PostgresqlBackupTest.cxx +++ /dev/null @@ -1,231 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include - -#include "LiveSupport/Core/FileTools.h" -#include "SchedulerDaemon.h" -#include "PostgresqlBackup.h" -#include "PostgresqlBackupTest.h" - - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(PostgresqlBackupTest); - -namespace { - -/** - * The location of the temporary backup file - */ -const std::string tempBackupTarFileName = "tmp/scheduleBackup.tar"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -PostgresqlBackupTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - try { - Ptr::Ref connectionManager; - Ptr::Ref storage; - Ptr::Ref schedule; - - connectionManager = daemon->getConnectionManager(); - storage = daemon->getStorage(); - schedule = daemon->getSchedule(); - - backup.reset(new PostgresqlBackup(connectionManager, - storage, - schedule)); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } - - authentication = daemon->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::string eMsg = "could not log in:\n"; - eMsg += e.what(); - CPPUNIT_FAIL(eMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -PostgresqlBackupTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT_NO_THROW( - authentication->logout(sessionId); - ); - - remove(tempBackupTarFileName.c_str()); -} - - -/*------------------------------------------------------------------------------ - * Create the backup. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackupTest :: createBackup(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref criteria(new SearchCriteria); - criteria->setLimit(10); - Ptr::Ref from(new ptime(time_from_string("2004-07-23 10:00:00"))); - Ptr::Ref to(new ptime(time_from_string("2004-07-23 11:00:00"))); - - Ptr::Ref token; - CPPUNIT_ASSERT_NO_THROW( - token = backup->createBackupOpen(sessionId, criteria, from, to); - ); - CPPUNIT_ASSERT(token); - - Ptr::Ref url; - Ptr::Ref path; - Ptr::Ref errorMessage; - AsyncState status; - int iterations = 20; - do { - std::cerr << "-/|\\"[iterations%4] << '\b'; - sleep(1); - CPPUNIT_ASSERT_NO_THROW( - status = backup->createBackupCheck(*token, url, path, errorMessage); - ); - CPPUNIT_ASSERT(status == AsyncState::pendingState - || status == AsyncState::finishedState - || status == AsyncState::failedState); - } while (--iterations && status == AsyncState::pendingState); - - CPPUNIT_ASSERT_EQUAL(AsyncState::finishedState, status); - CPPUNIT_ASSERT(url); - CPPUNIT_ASSERT(path); - - // copy the backup file - CPPUNIT_ASSERT_NO_THROW( - remove(tempBackupTarFileName.c_str()); - std::ifstream ifs(path->c_str(), std::ios::binary); - std::ofstream ofs(tempBackupTarFileName.c_str(), std::ios::binary); - ofs << ifs.rdbuf(); - ); - - CPPUNIT_ASSERT_NO_THROW( - backup->createBackupClose(*token); - ); -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can create backups. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackupTest :: createBackupTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT_NO_THROW( - createBackup() - ); - - bool exists; - std::string schedulerBackupInTarball = "meta-inf/scheduler.xml"; - CPPUNIT_ASSERT_NO_THROW( - exists = FileTools::existsInTarball(tempBackupTarFileName, - schedulerBackupInTarball) - ); - CPPUNIT_ASSERT(exists); - - std::string extractedTempFileName = "tmp/scheduler.tmp.xml"; - FILE * file; - - remove(extractedTempFileName.c_str()); - file = fopen(extractedTempFileName.c_str(), "r"); - CPPUNIT_ASSERT(file == 0); - - CPPUNIT_ASSERT_NO_THROW( - FileTools::extractFileFromTarball(tempBackupTarFileName, - schedulerBackupInTarball, - extractedTempFileName) - ); - - file = fopen(extractedTempFileName.c_str(), "r"); - CPPUNIT_ASSERT(file != 0); - CPPUNIT_ASSERT(fclose(file) == 0); - - CPPUNIT_ASSERT(remove(extractedTempFileName.c_str()) == 0); - file = fopen(extractedTempFileName.c_str(), "r"); - CPPUNIT_ASSERT(file == 0); -} - - -/*------------------------------------------------------------------------------ - * Test to see if we can restore backups. - *----------------------------------------------------------------------------*/ -void -PostgresqlBackupTest :: restoreBackupTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT_NO_THROW( - createBackup() - ); - - Ptr::Ref backupFile(new const Glib::ustring( - tempBackupTarFileName)); - CPPUNIT_ASSERT_NO_THROW( - backup->restoreBackup(sessionId, backupFile) - ); - // TODO: try this with a non-empty backup file, too -} - diff --git a/src/products/scheduler/src/PostgresqlBackupTest.h b/src/products/scheduler/src/PostgresqlBackupTest.h deleted file mode 100644 index acaa06f4b..000000000 --- a/src/products/scheduler/src/PostgresqlBackupTest.h +++ /dev/null @@ -1,136 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PostgresqlBackupTest_h -#define PostgresqlBackupTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "PostgresqlBackup.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the PostgresqlBackup class. - * - * @see PostgresqlBackup - */ -class PostgresqlBackupTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(PostgresqlBackupTest); - CPPUNIT_TEST(createBackupTest); - CPPUNIT_TEST(restoreBackupTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The PostgresqlBackup object which does the backup operations. - */ - Ptr::Ref backup; - - /** - * The authentication client used to log in. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Auxiliary method: create the backup file. Used by both tests. - */ - void - createBackup(void) throw (CPPUNIT_NS::Exception); - - - protected: - - /** - * Test to see if the backup works as expected - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - createBackupTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test to see if the backup works as expected - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - restoreBackupTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PostgresqlBackupTest_h - diff --git a/src/products/scheduler/src/PostgresqlPlayLog.cxx b/src/products/scheduler/src/PostgresqlPlayLog.cxx deleted file mode 100644 index a9883205a..000000000 --- a/src/products/scheduler/src/PostgresqlPlayLog.cxx +++ /dev/null @@ -1,201 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Db/Conversion.h" -#include "PostgresqlPlayLog.h" - -using namespace odbc; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string PostgresqlPlayLog::configElementNameStr = - "postgresqlPlayLog"; - -/*------------------------------------------------------------------------------ - * A statement to check if the database can be accessed. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlPlayLog::check1Stmt = "SELECT 1"; - -/*------------------------------------------------------------------------------ - * A statement to check if the log table exists. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlPlayLog::logCountStmt = - "SELECT COUNT(*) FROM playLog"; - -/*------------------------------------------------------------------------------ - * The SQL statement for adding a play log entry. - * It's a simple insert. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlPlayLog::addPlayLogEntryStmt = - "INSERT INTO playLog(id, audioClipId, timeStamp) VALUES(?, ?, ?)"; - -/*------------------------------------------------------------------------------ - * The SQL statement for querying scheduled entries for a time interval - * The parameters for this call are: from, to - * and returns the properties: audioClipId, timeStamp for all - * play log entries between from and to, ordered by timeStamp. - * TODO: the below query only lists entries starting inside [from:to[ - * but what about entries starting before, but flowing into [from:to[ ? - *----------------------------------------------------------------------------*/ -const std::string PostgresqlPlayLog::getPlayLogEntriesStmt = - "SELECT id, audioClipId, timeStamp FROM playLog WHERE " - "(? <= timeStamp) AND (timeStamp < ?) " - "ORDER BY timeStamp"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the schedule. - *----------------------------------------------------------------------------*/ -void -PostgresqlPlayLog :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - // nothing to do here, really -} - - -/*------------------------------------------------------------------------------ - * Add a new play log entry - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlPlayLog :: addPlayLogEntry( - Ptr::Ref audioClipId, - Ptr::Ref clipTimestamp) - throw (std::invalid_argument) -{ - Ptr::Ref conn; - bool result = false; - Ptr::Ref id; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - addPlayLogEntryStmt)); - id = UniqueId::generateId(); - pstmt->setLong(1, id->getId()); - - pstmt->setLong(2, audioClipId->getId()); - - timestamp = Conversion::ptimeToTimestamp(clipTimestamp); - pstmt->setTimestamp(3, *timestamp); - - result = (pstmt->executeUpdate() == 1); - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument(e.what()); - } - - if (!result) { - throw std::invalid_argument("couldn't insert into database"); - } - - return id; -} - - -/*------------------------------------------------------------------------------ - * Get the play log entries for a given time interval - *----------------------------------------------------------------------------*/ -Ptr::Ref> >::Ref -PostgresqlPlayLog :: getPlayLogEntries( - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (std::invalid_argument) -{ - Ptr::Ref conn; - Ptr::Ref> >::Ref result( - new std::vector::Ref>()); - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - getPlayLogEntriesStmt)); - timestamp = Conversion::ptimeToTimestamp(fromTime); - pstmt->setTimestamp(1, *timestamp); - timestamp = Conversion::ptimeToTimestamp(toTime); - pstmt->setTimestamp(2, *timestamp); - - Ptr::Ref rs(pstmt->executeQuery()); - while (rs->next()) { - Ptr::Ref id(new UniqueId(rs->getLong(1))); - Ptr::Ref audioClipId(new UniqueId(rs->getLong(2))); - - *timestamp = rs->getTimestamp(3); - Ptr::Ref clipTimestamp - = Conversion::timestampToPtime(timestamp); - - Ptr::Ref entry(new PlayLogEntry(id, - audioClipId, - clipTimestamp)); - result->push_back(entry); - } - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument("couldn't get play log entries"); - } - - return result; -} - diff --git a/src/products/scheduler/src/PostgresqlPlayLog.h b/src/products/scheduler/src/PostgresqlPlayLog.h deleted file mode 100644 index 5805ae018..000000000 --- a/src/products/scheduler/src/PostgresqlPlayLog.h +++ /dev/null @@ -1,208 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PostgresqlPlayLog_h -#define PostgresqlPlayLog_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Db/ConnectionManagerInterface.h" -#include "PlayLogInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An object containing a log of the clips played in a PostreSQL database. - * - * This object has to be configured with a simple empty element, as - * the following: - * - *

- *      <postgresqlPlayLog/>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT postgresqlPlayLog EMPTY >
- *  
- * - */ -class PostgresqlPlayLog : public Configurable, - public PlayLogInterface -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * A SQL statement to check if the database can be accessed. - */ - static const std::string check1Stmt; - - /** - * A SQL statement to check if the log table exists. - */ - static const std::string logCountStmt; - - /** - * The SQL statement for adding a play log entry. - */ - static const std::string addPlayLogEntryStmt; - - /** - * The SQL statement for getting the play log for a time interval - */ - static const std::string getPlayLogEntriesStmt; - - /** - * The database connection manager to use for connecting the - * database. - */ - Ptr::Ref cm; - - /** - * The default constructor. - */ - PostgresqlPlayLog(void) throw() - { - } - - - public: - /** - * Construct a PostgresqlPlayLog. - * - * @param cm the connection manager the PostgresqlPlayLog will use to - * connect to the database. - */ - PostgresqlPlayLog(Ptr::Ref cm) - throw () - { - this->cm = cm; - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PostgresqlPlayLog(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Configure the object based on the XML element supplied. - * The supplied element is expected to be of the name - * returned by configElementName(). - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Add a new entry to the play log. - * - * @param audioClipId the audio clip played. - * @param timeStamp the time the clip was played (started). - * @return the id of the newly created play log entry. - */ - virtual Ptr::Ref - addPlayLogEntry(Ptr::Ref audioClipId, - Ptr::Ref timeStamp) - throw (std::invalid_argument); - - /** - * Return the list of play log entries for a specified time interval. - * - * @param fromTime the start of the time of the interval queried, - * inclusive - * @param toTime to end of the time of the interval queried, - * non-inclusive - * @return a vector of the play log entries for the time region. - */ - virtual Ptr::Ref> >::Ref - getPlayLogEntries(Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (std::invalid_argument); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PostgresqlPlayLog_h - diff --git a/src/products/scheduler/src/PostgresqlPlayLogTest.cxx b/src/products/scheduler/src/PostgresqlPlayLogTest.cxx deleted file mode 100644 index 66939701d..000000000 --- a/src/products/scheduler/src/PostgresqlPlayLogTest.cxx +++ /dev/null @@ -1,179 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "SchedulerDaemon.h" -#include "PostgresqlPlayLog.h" -#include "PostgresqlPlayLogTest.h" - - -using namespace boost::posix_time; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(PostgresqlPlayLogTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -PostgresqlPlayLogTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - cm = scheduler->getConnectionManager(); - - playLog.reset(new PostgresqlPlayLog(cm)); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -PostgresqlPlayLogTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - playLog.reset(); - cm.reset(); -} - - -/*------------------------------------------------------------------------------ - * Add a single item to the play log. - *----------------------------------------------------------------------------*/ -void -PostgresqlPlayLogTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref audioClipId = UniqueId::generateId(); - Ptr::Ref timestamp(new ptime(time_from_string( - "2004-10-25 16:09:00"))); - - try { - playLog->addPlayLogEntry(audioClipId, timestamp); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * See if getPlayLogEntries() returns correct lists - *----------------------------------------------------------------------------*/ -void -PostgresqlPlayLogTest :: getPlayLogEntriesTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref audioClipId; - Ptr::Ref timestamp; - Ptr::Ref fromTime; - Ptr::Ref toTime; - - Ptr::Ref> >::Ref entries; - Ptr::Ref entry; - - try { - audioClipId.reset(new UniqueId(10001)); - timestamp.reset(new ptime(time_from_string("2004-10-25 10:00:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - audioClipId.reset(new UniqueId(10002)); - timestamp.reset(new ptime(time_from_string("2004-10-25 10:12:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - audioClipId.reset(new UniqueId(10003)); - timestamp.reset(new ptime(time_from_string("2004-10-25 12:00:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - // first interval - fromTime.reset(new ptime(time_from_string("2004-10-25 10:00:00"))); - toTime.reset( new ptime(time_from_string("2004-10-25 12:00:00"))); - entries = playLog->getPlayLogEntries(fromTime, toTime); - - CPPUNIT_ASSERT(entries->size() == 2); - entry = (*entries)[0]; - CPPUNIT_ASSERT(entry->getAudioClipId()->getId() == 10001); - timestamp.reset(new ptime(time_from_string("2004-10-25 10:00:00"))); - CPPUNIT_ASSERT(*(entry->getTimestamp()) == *timestamp); - entry = (*entries)[1]; - CPPUNIT_ASSERT(entry->getAudioClipId()->getId() == 10002); - timestamp.reset(new ptime(time_from_string("2004-10-25 10:12:00"))); - CPPUNIT_ASSERT(*(entry->getTimestamp()) == *timestamp); - - // second interval - fromTime.reset(new ptime(time_from_string("2004-10-25 10:10:00"))); - toTime.reset( new ptime(time_from_string("2005-10-25 00:00:00"))); - entries = playLog->getPlayLogEntries(fromTime, toTime); - - CPPUNIT_ASSERT(entries->size() == 2); - entry = (*entries)[0]; - CPPUNIT_ASSERT(entry->getAudioClipId()->getId() == 10002); - timestamp.reset(new ptime(time_from_string("2004-10-25 10:12:00"))); - CPPUNIT_ASSERT(*(entry->getTimestamp()) == *timestamp); - entry = (*entries)[1]; - CPPUNIT_ASSERT(entry->getAudioClipId()->getId() == 10003); - timestamp.reset(new ptime(time_from_string("2004-10-25 12:00:00"))); - CPPUNIT_ASSERT(*(entry->getTimestamp()) == *timestamp); - - // third interval -- this one's empty - fromTime.reset(new ptime(time_from_string("2004-10-25 13:00:00"))); - toTime.reset( new ptime(time_from_string("2005-10-25 13:00:00"))); - entries = playLog->getPlayLogEntries(fromTime, toTime); - - CPPUNIT_ASSERT(entries->size() == 0); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} diff --git a/src/products/scheduler/src/PostgresqlPlayLogTest.h b/src/products/scheduler/src/PostgresqlPlayLogTest.h deleted file mode 100644 index f24f38be8..000000000 --- a/src/products/scheduler/src/PostgresqlPlayLogTest.h +++ /dev/null @@ -1,128 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PostgresqlPlayLogTest_h -#define PostgresqlPlayLogTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Db/ConnectionManagerInterface.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Db; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the PostgresqlPlayLog class. - * - * @see PostgresqlPlayLog - */ -class PostgresqlPlayLogTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(PostgresqlPlayLogTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(getPlayLogEntriesTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The connection manager used for testing. - */ - Ptr::Ref cm; - - /** - * The schedule used for testing. - */ - Ptr::Ref playLog; - - - protected: - - /** - * Add a single play log entry. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Add a few play log entries, then query time intervals around them. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - getPlayLogEntriesTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PostgresqlScheduleTest_h - diff --git a/src/products/scheduler/src/PostgresqlSchedule.cxx b/src/products/scheduler/src/PostgresqlSchedule.cxx deleted file mode 100644 index a3c4084ea..000000000 --- a/src/products/scheduler/src/PostgresqlSchedule.cxx +++ /dev/null @@ -1,761 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Db/Conversion.h" -#include "PostgresqlSchedule.h" - -using namespace odbc; -using namespace boost::posix_time; - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::configElementNameStr = - "postgresqlSchedule"; - -/*------------------------------------------------------------------------------ - * The name of the schedule export element - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::scheduleExportElementName - = "scheduleExport"; - - -/*------------------------------------------------------------------------------ - * The name of the fromTime attribute - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::fromTimeAttrName = "fromTime"; - - -/*------------------------------------------------------------------------------ - * The name of the toTime attribute - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::toTimeAttrName = "toTime"; - - -/*------------------------------------------------------------------------------ - * A statement to check if the database can be accessed. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::check1Stmt = "SELECT 1"; - -/*------------------------------------------------------------------------------ - * A statement to check if the schedule table exists. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::scheduleCountStmt = - "SELECT COUNT(*) FROM schedule"; - -/*------------------------------------------------------------------------------ - * The SQL statement for querying if a timeframe is available. - * The parameters for this call are: starts, starts, ends, ends, starts, ends, - * and returns the number of items falling into the quieried timeframe. - * Basically checks if the starts or ends value falls within the queried frame - * or starts before and ends after the queried timeframe. - *----------------------------------------------------------------------------*/ -//const std::string PostgresqlSchedule::isTimeframaAvailableStmt = -// "SELECT COUNT(*) FROM schedule WHERE " -// "((starts <= ? AND ? < ends) OR (starts < ? AND ? <= ends)) " -// "OR (? <= starts AND ends <= ?)"; - -//new criteria is that playlists cannot start at the same time -const std::string PostgresqlSchedule::isTimeframaAvailableStmt = - "SELECT COUNT(*) FROM schedule WHERE " - "starts = ?"; - -/*------------------------------------------------------------------------------ - * The SQL statement for scheduling a playlist. - * It's a simple insert. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::schedulePlaylistStmt = - "INSERT INTO schedule(id, playlist, starts, ends) VALUES(?, ?, ?, ?)"; - -/*------------------------------------------------------------------------------ - * The SQL statement for getting a schedule entry based on its id - * The parameters for this call are: entryId - * and returns the properties: id, playlist, starts, ends for the entry - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::getScheduleEntryStmt = - "SELECT id, playlist, starts, ends FROM schedule WHERE id = ?"; - -/*------------------------------------------------------------------------------ - * The SQL statement for rescheduling a playlist (an UPDATE call). - * There parameters for this call are: new start, new end, id. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::reschedulePlaylistStmt = - "UPDATE schedule SET starts = ?, ends = ? WHERE id = ?"; - -/*------------------------------------------------------------------------------ - * The SQL statement for querying scheduled entries for a time interval - * The parameters for this call are: from, to - * and returns the properties: id, playlist, starts, ends for all - * schedule entries between from and to, ordered by starts. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::getScheduleEntriesStmt = - "SELECT id, playlist, starts, ends FROM schedule WHERE " - "(? < ends) AND (starts < ?) " - "ORDER BY starts"; - -/*------------------------------------------------------------------------------ - * The SQL statement for getting the currently playing schedule entry. - * The parameters for this call are: from - * and returns the properties: id, playlist, starts, ends for the next - * schedule entry after the specified timepoint - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::getCurrentlyPlayingStmt = - "SELECT id, playlist, starts, ends FROM schedule " - " WHERE starts <= ? AND ? < ends"; - -/*------------------------------------------------------------------------------ - * The SQL statement for querying the next scheduled entry from the - * specified timepoint. - * The parameters for this call are: from - * and returns the properties: id, playlist, starts, ends for the next - * schedule entry after the specified timepoint - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::getNextEntryStmt = - "SELECT id, playlist, starts, ends FROM schedule WHERE ? < starts " - "ORDER BY starts"; - -/*------------------------------------------------------------------------------ - * The SQL statement for querying current scheduled entry - * The parameters for this call are: from - * and returns the properties: id, playlist, starts, ends for the current - * schedule entry - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::getCurrentEntryStmt = - "SELECT id, playlist, starts, ends FROM schedule WHERE starts <= ? AND ? < ends " - "ORDER BY starts"; - -/*------------------------------------------------------------------------------ - * The SQL statement for querying if a schedule entry exists. - * Expects a single argument, the id of the schedule to check. - * Returns 1 if the entry exists, 0 otherwise. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::scheduleEntryExistsStmt = - "SELECT COUNT(*) FROM schedule WHERE id = ?"; - -/*------------------------------------------------------------------------------ - * The SQL statement for removing a schedule. - * Expects a single argument, the id of the schedule to remove. - *----------------------------------------------------------------------------*/ -const std::string PostgresqlSchedule::removeFromScheduleStmt = - "DELETE FROM schedule WHERE id = ?"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the schedule. - *----------------------------------------------------------------------------*/ -void -PostgresqlSchedule :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - // nothing to do here, really -} - - -/*------------------------------------------------------------------------------ - * Check if a timeframe is available. - *----------------------------------------------------------------------------*/ -bool -PostgresqlSchedule :: isTimeframeAvailable( - Ptr::Ref from, - Ptr::Ref to) throw () -{ - Ptr::Ref conn; - bool result = false; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - isTimeframaAvailableStmt)); - timestamp = Conversion::ptimeToTimestamp(from, Conversion::roundDown); - pstmt->setTimestamp(1, *timestamp); -// pstmt->setTimestamp(2, *timestamp); -// pstmt->setTimestamp(5, *timestamp); -// -// timestamp = Conversion::ptimeToTimestamp(to, Conversion::roundUp); -// pstmt->setTimestamp(3, *timestamp); -// pstmt->setTimestamp(4, *timestamp); -// pstmt->setTimestamp(6, *timestamp); - - Ptr::Ref rs(pstmt->executeQuery()); - result = (rs->next()) ? (rs->getLong(1) == 0) : false; - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - return false; - } - - return result; -} - - -/*------------------------------------------------------------------------------ - * Schedule a playlist - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlSchedule :: schedulePlaylist( - Ptr::Ref playlist, - Ptr::Ref playtime) - throw (std::invalid_argument) -{ - Ptr::Ref conn; - bool result = false; - Ptr::Ref id; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref ends; - Ptr::Ref pstmt(conn->prepareStatement( - schedulePlaylistStmt)); - id = UniqueId::generateId(); - pstmt->setLong(1, id->getId()); - pstmt->setLong(2, playlist->getId()->getId()); - - timestamp = Conversion::ptimeToTimestamp(playtime, - Conversion::roundNearest); - pstmt->setTimestamp(3, *timestamp); - - ends.reset(new ptime((*playtime) + *(playlist->getPlaylength()))); - timestamp = Conversion::ptimeToTimestamp(ends, - Conversion::roundUp); - pstmt->setTimestamp(4, *timestamp); - - result = pstmt->executeUpdate() == 1; - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument(e.what()); - } - - if (!result) { - throw std::invalid_argument("couldn't insert into database"); - } - - return id; -} - - -/*------------------------------------------------------------------------------ - * Insert a schedule entry into the database - *----------------------------------------------------------------------------*/ -void -PostgresqlSchedule :: storeScheduleEntry( - Ptr::Ref scheduleEntry) - throw (std::invalid_argument) -{ - Ptr::Ref conn; - bool result = false; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref ends; - Ptr::Ref pstmt(conn->prepareStatement( - schedulePlaylistStmt)); - - pstmt->setLong(1, scheduleEntry->getId()->getId()); - pstmt->setLong(2, scheduleEntry->getPlaylistId()->getId()); - - timestamp = Conversion::ptimeToTimestamp(scheduleEntry->getStartTime(), - Conversion::roundDown); - pstmt->setTimestamp(3, *timestamp); - - timestamp = Conversion::ptimeToTimestamp(scheduleEntry->getEndTime(), - Conversion::roundUp); - pstmt->setTimestamp(4, *timestamp); - - result = pstmt->executeUpdate() == 1; - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument(e.what()); - } - - if (!result) { - throw std::invalid_argument("couldn't insert into database"); - } -} - - -/*------------------------------------------------------------------------------ - * Get the scheduled entries for a given timepoint - *----------------------------------------------------------------------------*/ -Ptr::Ref> >::Ref -PostgresqlSchedule :: getScheduleEntries( - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw () -{ - Ptr::Ref conn; - Ptr::Ref> >::Ref result( - new std::vector::Ref>()); - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - getScheduleEntriesStmt)); - timestamp = Conversion::ptimeToTimestamp(fromTime, - Conversion::roundDown); - pstmt->setTimestamp(1, *timestamp); - timestamp = Conversion::ptimeToTimestamp(toTime, - Conversion::roundUp); - pstmt->setTimestamp(2, *timestamp); - - Ptr::Ref rs(pstmt->executeQuery()); - while (rs->next()) { - Ptr::Ref id(new UniqueId(rs->getLong(1))); - Ptr::Ref playlistId(new UniqueId(rs->getLong(2))); - - *timestamp = rs->getTimestamp(3); - Ptr::Ref startTime = Conversion::timestampToPtime(timestamp); - - *timestamp = rs->getTimestamp(4); - Ptr::Ref endTime = Conversion::timestampToPtime(timestamp); - - Ptr::Ref entry(new ScheduleEntry(id, - playlistId, - startTime, - endTime)); - result->push_back(entry); - } - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - // TODO: report error - return result; - } - - return result; -} - - -/*------------------------------------------------------------------------------ - * Export schedule entries to an XML file. - *----------------------------------------------------------------------------*/ -void -PostgresqlSchedule :: exportScheduleEntries( - xmlpp::Element * element, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw () -{ - xmlpp::Element * scheduleExport; - Ptr::Ref> >::Ref entries; - std::vector::Ref>::iterator it; - - scheduleExport = element->add_child(scheduleExportElementName); - scheduleExport->set_attribute(fromTimeAttrName, to_iso_string(*fromTime)); - scheduleExport->set_attribute(toTimeAttrName, to_iso_string(*toTime)); - - entries = getScheduleEntries(fromTime, toTime); - it = entries->begin(); - while (it != entries->end()) { - Ptr::Ref entry = *it; - - entry->toDom(scheduleExport); - - ++it; - } -} - - -/*------------------------------------------------------------------------------ - * Import schedule entries from an XML file. - *----------------------------------------------------------------------------*/ -void -PostgresqlSchedule :: importScheduleEntries(const xmlpp::Element * element) - throw (std::invalid_argument) -{ - if (element->get_name() != scheduleExportElementName) { - std::string eMsg = "bad configuration element "; - eMsg += element->get_name(); - throw std::invalid_argument(eMsg); - } - - xmlpp::Node::NodeList children = - element->get_children(ScheduleEntry::getElementName()); - xmlpp::Node::NodeList::iterator it = children.begin(); - while (it != children.end()) { - xmlpp::Element * node = dynamic_cast (*it); - Ptr::Ref scheduleEntry; - - scheduleEntry.reset(new ScheduleEntry(node)); - storeScheduleEntry(scheduleEntry); - - ++it; - } -} - - -/*------------------------------------------------------------------------------ - * Get the currently playing entry - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlSchedule :: getCurrentlyPlaying(void) throw () -{ - Ptr::Ref conn; - Ptr::Ref result; - Ptr::Ref now = TimeConversion::now(); - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - getCurrentlyPlayingStmt)); - timestamp = Conversion::ptimeToTimestamp(now, Conversion::roundNearest); - pstmt->setTimestamp(1, *timestamp); - pstmt->setTimestamp(2, *timestamp); - - Ptr::Ref rs(pstmt->executeQuery()); - if (rs->next()) { - Ptr::Ref id(new UniqueId(rs->getLong(1))); - Ptr::Ref playlistId(new UniqueId(rs->getLong(2))); - - *timestamp = rs->getTimestamp(3); - Ptr::Ref startTime = Conversion::timestampToPtime(timestamp); - - *timestamp = rs->getTimestamp(4); - Ptr::Ref endTime = Conversion::timestampToPtime(timestamp); - - result.reset(new ScheduleEntry(id, playlistId, startTime, endTime)); - } - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - // TODO: report error - return result; - } - - return result; -} - - -/*------------------------------------------------------------------------------ - * Get the next schedule entry after a specified timepoint - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlSchedule :: getNextEntry(Ptr::Ref fromTime) - throw () -{ - Ptr::Ref conn; - Ptr::Ref result; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - getNextEntryStmt)); - timestamp = Conversion::ptimeToTimestamp(fromTime, - Conversion::roundDown); - pstmt->setTimestamp(1, *timestamp); - - Ptr::Ref rs(pstmt->executeQuery()); - if (rs->next()) { - Ptr::Ref id(new UniqueId(rs->getLong(1))); - Ptr::Ref playlistId(new UniqueId(rs->getLong(2))); - - *timestamp = rs->getTimestamp(3); - Ptr::Ref startTime = Conversion::timestampToPtime(timestamp); - - *timestamp = rs->getTimestamp(4); - Ptr::Ref endTime = Conversion::timestampToPtime(timestamp); - - result.reset(new ScheduleEntry(id, playlistId, startTime, endTime)); - } - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - // TODO: report error - return result; - } - - return result; -} - - -/*------------------------------------------------------------------------------ - * Get current schedule entry - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlSchedule :: getCurrentEntry() - throw () -{ - Ptr::Ref conn; - Ptr::Ref result; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - getCurrentEntryStmt)); - timestamp = Conversion::ptimeToTimestamp(TimeConversion::now(), - Conversion::roundDown); - - pstmt->setTimestamp(1, *timestamp); - pstmt->setTimestamp(2, *timestamp); - - Ptr::Ref rs(pstmt->executeQuery()); - if (rs->next()) { - Ptr::Ref id(new UniqueId(rs->getLong(1))); - Ptr::Ref playlistId(new UniqueId(rs->getLong(2))); - - *timestamp = rs->getTimestamp(3); - Ptr::Ref startTime = Conversion::timestampToPtime(timestamp); - - *timestamp = rs->getTimestamp(4); - Ptr::Ref endTime = Conversion::timestampToPtime(timestamp); - - result.reset(new ScheduleEntry(id, playlistId, startTime, endTime)); - } - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - // TODO: report error - return result; - } - - return result; -} - -/*------------------------------------------------------------------------------ - * Tell if a schedule entry exists. - *----------------------------------------------------------------------------*/ -bool -PostgresqlSchedule :: scheduleEntryExists( - Ptr::Ref entryId) - throw () -{ - Ptr::Ref conn; - bool result = false; - - try { - conn = cm->getConnection(); - Ptr::Ref pstmt(conn->prepareStatement( - scheduleEntryExistsStmt)); - pstmt->setLong(1, entryId->getId()); - - Ptr::Ref rs(pstmt->executeQuery()); - result = (rs->next()) ? (rs->getLong(1) == 1) : false; - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument(e.what()); - } - - return result; -} - - -/*------------------------------------------------------------------------------ - * Remove a schedule entry from a schedule - *----------------------------------------------------------------------------*/ -void -PostgresqlSchedule :: removeFromSchedule( - Ptr::Ref entryId) - throw (std::invalid_argument) -{ - Ptr::Ref conn; - bool result = false; - - try { - conn = cm->getConnection(); - Ptr::Ref pstmt(conn->prepareStatement( - removeFromScheduleStmt)); - pstmt->setLong(1, entryId->getId()); - - result = pstmt->executeUpdate() == 1; - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument(e.what()); - } - - if (!result) { - throw std::invalid_argument("specified schedule entry does not exist"); - } -} - - -/*------------------------------------------------------------------------------ - * Get a ScheduleEntry based on a schedule entry id. - *----------------------------------------------------------------------------*/ -Ptr::Ref -PostgresqlSchedule :: getScheduleEntry(Ptr::Ref entryId) - throw (std::invalid_argument) -{ - Ptr::Ref conn; - Ptr::Ref entry; - - try { - conn = cm->getConnection(); - Ptr::Ref pstmt(conn->prepareStatement( - getScheduleEntryStmt)); - pstmt->setLong(1, entryId->getId()); - - Ptr::Ref rs(pstmt->executeQuery()); - if (rs->next()) { - Ptr::Ref timestamp(new Timestamp()); - - Ptr::Ref id(new UniqueId(rs->getLong(1))); - Ptr::Ref playlistId(new UniqueId(rs->getLong(2))); - - *timestamp = rs->getTimestamp(3); - Ptr::Ref startTime = Conversion::timestampToPtime(timestamp); - - *timestamp = rs->getTimestamp(4); - Ptr::Ref endTime = Conversion::timestampToPtime(timestamp); - - entry.reset(new ScheduleEntry(id, playlistId, startTime, endTime)); - } - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - // TODO: report error - return entry; - } - - if (!entry) { - throw std::invalid_argument("no schedule entry by the specified id"); - } - - return entry; -} - - -/*------------------------------------------------------------------------------ - * Reschedule an entry - *----------------------------------------------------------------------------*/ -void -PostgresqlSchedule :: reschedule(Ptr::Ref entryId, - Ptr::Ref playtime) - throw (std::invalid_argument) -{ - Ptr::Ref entry = getScheduleEntry(entryId); - - Ptr::Ref ends(new ptime((*playtime) - + *(entry->getPlaylength()))); - - if (!isTimeframeAvailable(playtime, ends)) { - throw std::invalid_argument("new playtime not available"); - } - - Ptr::Ref conn; - bool result = false; - - try { - conn = cm->getConnection(); - Ptr::Ref timestamp; - Ptr::Ref pstmt(conn->prepareStatement( - reschedulePlaylistStmt)); - - timestamp = Conversion::ptimeToTimestamp(playtime, - Conversion::roundNearest); - pstmt->setTimestamp(1, *timestamp); - - timestamp = Conversion::ptimeToTimestamp(ends, - Conversion::roundUp); - pstmt->setTimestamp(2, *timestamp); - - pstmt->setLong(3, entryId->getId()); - - result = pstmt->executeUpdate() == 1; - - cm->returnConnection(conn); - } catch (std::exception &e) { - if (conn) { - cm->returnConnection(conn); - } - throw std::invalid_argument(e.what()); - } - - if (!result) { - throw std::invalid_argument("couldn't insert into database"); - } -} - - diff --git a/src/products/scheduler/src/PostgresqlSchedule.h b/src/products/scheduler/src/PostgresqlSchedule.h deleted file mode 100644 index 7e0dab3d3..000000000 --- a/src/products/scheduler/src/PostgresqlSchedule.h +++ /dev/null @@ -1,401 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PostgresqlSchedule_h -#define PostgresqlSchedule_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Db/ConnectionManagerInterface.h" -#include "ScheduleInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An object containing the schedule of events in a PostreSQL database. - * - * This object has to be configured with a simple empty element, as - * the following: - * - *

- *      <postgresqlSchedule/>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT postgresqlSchedule EMPTY >
- *  
- * - */ -class PostgresqlSchedule : public Configurable, - public ScheduleInterface -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The name of the schedule export element - */ - static const std::string scheduleExportElementName; - - /** - * The name of the fromTime attribute - */ - static const std::string fromTimeAttrName; - - /** - * The name of the toTime attribute - */ - static const std::string toTimeAttrName; - - /** - * A SQL statement to check if the database can be accessed. - */ - static const std::string check1Stmt; - - /** - * A SQL statement to check if the schedule table exists. - */ - static const std::string scheduleCountStmt; - - /** - * The SQL statement for querying if a time frame is available. - */ - static const std::string isTimeframaAvailableStmt; - - /** - * The SQL statement for scheduling a playlist. - */ - static const std::string schedulePlaylistStmt; - - /** - * The SQL statement for rescheduling an entry. - */ - static const std::string reschedulePlaylistStmt; - - /** - * The SQL statement for getting a schedule entry based on its id - */ - static const std::string getScheduleEntryStmt; - - /** - * The SQL statement for getting the schedules for a time interval - */ - static const std::string getScheduleEntriesStmt; - - /** - * The SQL statement for getting the currently playing schedule - * entry. - */ - static const std::string getCurrentlyPlayingStmt; - - /** - * The SQL statement for getting the next schedule entry after a - * timepoint. - */ - static const std::string getNextEntryStmt; - - /** - * The SQL statement for getting current schedule entry - */ - static const std::string getCurrentEntryStmt; - - /** - * The SQL statement for telling if a schedule entry exists. - */ - static const std::string scheduleEntryExistsStmt; - - /** - * The SQL statement for removing a schedule entry. - */ - static const std::string removeFromScheduleStmt; - - /** - * The database connection manager to use for connecting the - * database. - */ - Ptr::Ref cm; - - /** - * The default constructor. - */ - PostgresqlSchedule(void) throw() - { - } - - - public: - /** - * Construct a PostgresqlSchedule. - * - * @param cm the connection manager the PostgresqlSchedule will use to - * connect to the database. - */ - PostgresqlSchedule(Ptr::Ref cm) - throw () - { - this->cm = cm; - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~PostgresqlSchedule(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Configure the object based on the XML element supplied. - * The supplied element is expected to be of the name - * returned by configElementName(). - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Check if a timeframe is available for scheduling. - * - * @param from the start time of the timeframe. - * @param to the end time of the timeframe. - * @return true if the timeframe is available, false otherwise. - */ - virtual bool - isTimeframeAvailable(Ptr::Ref from, - Ptr::Ref to) throw (); - - /** - * Schedule a playlist. - * - * @param playlist the playlist to schedule. - * @param playtime the time to schedule the playlist for. - * @return the id of the newly created playlist. - * @exception std::invalid_argument if the there is something - * already scheduled for the duration of the playlist. - */ - virtual Ptr::Ref - schedulePlaylist(Ptr::Ref playlist, - Ptr::Ref playtime) - throw (std::invalid_argument); - - /** - * Return the list of scheduled entries for a specified time interval. - * It returns all entries which intersect the interval (i.e., start - * before toTime, and end later than fromTime). - * - * @param fromTime the start of the time of the interval queried - * @param toTime to end of the time of the interval queried - * @return a vector of the scheduled entries for the time region. - */ - virtual Ptr::Ref - getScheduleEntries(Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (); - - /** - * Export schedule entries to a DOM tree. - * - * @param element a new DOM element will be added as a child to - * this element, which will contain the export. - * @param fromTime entries are included in the export starting - * from this time. - * @param toTime entries as included in the export up to - * but not including this time. - * @return a DOM element, which is the export. - * it is the responsibility of the caller to free up the - * returned element. - * @see #importScheduleEntries - */ - virtual void - exportScheduleEntries(xmlpp::Element * element, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw (); - - /** - * Import schedule entries from a DOM tree. - * - * @param element the DOM element containing schedule entries - * to import. - * @exception std::invalid_argument if the supplied DOM tree - * is not valid. - * @see #exportScheduleEntries - */ - virtual void - importScheduleEntries(const xmlpp::Element * element) - throw (std::invalid_argument); - - /** - * Return the schedule entry that is being played at the moment. - * - * @return the schedule entry that is being played at the monent, - * or a reference to null, if nothing is playing currently. - */ - virtual Ptr::Ref - getCurrentlyPlaying(void) throw (); - - /** - * Return the next schedule entry, after (but not including) - * the specified timepoint. - * - * @param fromTime the start of the time of the interval queried, - * inclusive - * @return the first schedule entry, after the specified timepoint. - */ - virtual Ptr::Ref - getNextEntry(Ptr::Ref fromTime) - throw (); - - /** - * Return current schedule entry - * - * @param - * - * @return the first schedule entry at this point in time - */ - virtual Ptr::Ref - getCurrentEntry() - throw (); - - /** - * Tell if a schedule entry exists by the give name. - * - * @param entryId the id of the schedule entry to check for. - * @return true if the schedule entry exists in the Schedule, - * false otherwise. - */ - virtual bool - scheduleEntryExists(Ptr::Ref entryId) - throw (); - - /** - * Remove a schedule entry from the schedule. - * - * @param entryId the id of the schedule to remove. - * @exception std::invalid_argument if no schedule with the specified - * id exists. - */ - virtual void - removeFromSchedule(Ptr::Ref entryId) - throw (std::invalid_argument); - - /** - * Return a schedule entry for a specified id. - * - * @param entryId the id of the entry to get. - * @return the ScheduleEntry for the specified id. - * @exception std::invalid_argument if no entry by the specified - * id exists. - */ - virtual Ptr::Ref - getScheduleEntry(Ptr::Ref entryId) - throw (std::invalid_argument); - - /** - * Insert a schedule entry into the database. - * - * @param scheduleEntry the schedule entry to process. - * @exception std::invalid_argument if the there is something - * already scheduled for the duration of the playlist. - */ - virtual void - storeScheduleEntry(Ptr::Ref scheduleEntry) - throw (std::invalid_argument); - - /** - * Reschedule an event to a different time. - * - * @param entryId the id of the entry to reschedule. - * @param playtime the new time for the schedule. - * @exception std::invalid_argument if there is something already - * scheduled for the new duration. - */ - virtual void - reschedule(Ptr::Ref entryId, - Ptr::Ref playtime) - throw (std::invalid_argument); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PostgresqlSchedule_h - diff --git a/src/products/scheduler/src/PostgresqlScheduleTest.cxx b/src/products/scheduler/src/PostgresqlScheduleTest.cxx deleted file mode 100644 index 9eda6e485..000000000 --- a/src/products/scheduler/src/PostgresqlScheduleTest.cxx +++ /dev/null @@ -1,594 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "SchedulerDaemon.h" -#include "PostgresqlSchedule.h" -#include "PostgresqlScheduleTest.h" - - -using namespace boost::posix_time; -using namespace xmlpp; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(PostgresqlScheduleTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - cm = scheduler->getConnectionManager(); - - schedule.reset(new PostgresqlSchedule(cm)); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - schedule.reset(); - cm.reset(); -} - - -/*------------------------------------------------------------------------------ - * Test for an available timeframe in an empty schedule database. - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - // check with any two arbitary dates, the timeframe should be available - Ptr::Ref from(new ptime(time_from_string("2004-07-23 10:00:00"))); - Ptr::Ref to(new ptime(time_from_string("2004-07-23 11:00:00"))); - - CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to)); -} - - -/*------------------------------------------------------------------------------ - * Schedule a single playlist. - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: simpleScheduleTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist, from 10 o'clock 2004-07-23 - Ptr::Ref id = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(id, playlength)); - Ptr::Ref from(new ptime(time_from_string( - "2004-07-23 10:00:00"))); - - try { - schedule->schedulePlaylist(playlist, from); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Schedule a single playlist, and then query for available timeframes - * around it. - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: scheduleAndQueryTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist, from 10 o'clock 2004-07-23 - Ptr::Ref id = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(id, playlength)); - Ptr::Ref from(new ptime(time_from_string( - "2004-07-23 10:00:00"))); - - try { - schedule->schedulePlaylist(playlist, from); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } - - // check for available timeframes around the inserted one - Ptr::Ref to; - - // this is the exact same timeframe as the scheduled playlist - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 11:00:00"))); - - CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to)); - - // a timeframe before our playlist - from.reset(new ptime(time_from_string("2004-07-23 09:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 09:50:00"))); - - CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to)); - - // a timeframe after our playlist - from.reset(new ptime(time_from_string("2004-07-23 11:10:00"))); - to.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - - CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to)); - - // a timeframe inside ours - from.reset(new ptime(time_from_string("2004-07-23 10:10:00"))); - to.reset(new ptime(time_from_string("2004-07-23 10:50:00"))); - - CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to)); - - // a timeframe encapsulating ours - from.reset(new ptime(time_from_string("2004-07-23 09:50:00"))); - to.reset(new ptime(time_from_string("2004-07-23 11:10:00"))); - - CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to)); - - // a timeframe starting earlier, but flowing into ours - from.reset(new ptime(time_from_string("2004-07-23 09:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 10:10:00"))); - - CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to)); - - // a timeframe starting inside ours, and continuing afterwards - from.reset(new ptime(time_from_string("2004-07-23 10:50:00"))); - to.reset(new ptime(time_from_string("2004-07-23 11:50:00"))); - - CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to)); - - // a timeframe ending exaclty when ours starts, which is OK - from.reset(new ptime(time_from_string("2004-07-23 09:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - - CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to)); - - // a timeframe starting exactly when ours ends, which is OK - from.reset(new ptime(time_from_string("2004-07-23 11:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - - CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to)); -} - - -/*------------------------------------------------------------------------------ - * See if getScheduleEntries() returns correct lists - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: getScheduleEntriesTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref from; - Ptr::Ref to; - - Ptr::Ref> >::Ref entries; - Ptr::Ref entry; - - try { - // schedule our playlist for 2004-07-23, 10 o'clock - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 12 o'clock - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 14 o'clock - from.reset(new ptime(time_from_string("2004-07-23 14:00:00"))); - schedule->schedulePlaylist(playlist, from); - - // and now let's see what's scheduled for 2004-07-23 between - // 9:00 and 11:00 - from.reset(new ptime(time_from_string("2004-07-23 09:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 11:00:00"))); - entries = schedule->getScheduleEntries(from, to); - // see that it is a single entry starting from 10 to 11 o'clock - CPPUNIT_ASSERT(entries->size() == 1); - entry = (*entries)[0]; - CPPUNIT_ASSERT(*(entry->getPlaylistId()) == *(playlist->getId())); - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - CPPUNIT_ASSERT(*(entry->getStartTime()) == *from); - to.reset(new ptime(time_from_string("2004-07-23 11:00:00"))); - CPPUNIT_ASSERT(*(entry->getEndTime()) == *to); - - // let's see what's scheduled for 2004-07-23 between - // 9:00 and 13:00 - from.reset(new ptime(time_from_string("2004-07-23 09:00:00"))); - to.reset(new ptime(time_from_string("2004-07-23 13:00:00"))); - entries = schedule->getScheduleEntries(from, to); - // see that it is 2 entries, the one at 10 and the other at 12 o'clock - CPPUNIT_ASSERT(entries->size() == 2); - // see the one at 10 o'clock - entry = (*entries)[0]; - CPPUNIT_ASSERT(*(entry->getPlaylistId()) == *(playlist->getId())); - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - CPPUNIT_ASSERT(*(entry->getStartTime()) == *from); - to.reset(new ptime(time_from_string("2004-07-23 11:00:00"))); - CPPUNIT_ASSERT(*(entry->getEndTime()) == *to); - // see the other at 12 o'clock - entry = (*entries)[1]; - CPPUNIT_ASSERT(*(entry->getPlaylistId()) == *(playlist->getId())); - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - CPPUNIT_ASSERT(*(entry->getStartTime()) == *from); - to.reset(new ptime(time_from_string("2004-07-23 13:00:00"))); - CPPUNIT_ASSERT(*(entry->getEndTime()) == *to); - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * See if getNextEntry() returns correct entry - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: getNextEntryTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref from; - Ptr::Ref entry; - - try { - // schedule our playlist for 2004-07-23, 10 o'clock - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 12 o'clock - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 14 o'clock - from.reset(new ptime(time_from_string("2004-07-23 14:00:00"))); - schedule->schedulePlaylist(playlist, from); - - // see what gives after 2004-07-23 09:00:00 - from.reset(new ptime(time_from_string("2004-07-23 09:00:00"))); - entry = schedule->getNextEntry(from); - CPPUNIT_ASSERT(entry.get()); - // see that it is a single entry starting from 10 to 11 o'clock - CPPUNIT_ASSERT(*(entry->getPlaylistId()) == *(playlist->getId())); - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - CPPUNIT_ASSERT(*(entry->getStartTime()) == *from); - - // see what gives after 2004-07-23 10:00:00 - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - entry = schedule->getNextEntry(from); - CPPUNIT_ASSERT(entry.get()); - // see that it is a single entry starting from 10 to 11 o'clock - CPPUNIT_ASSERT(*(entry->getPlaylistId()) == *(playlist->getId())); - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - CPPUNIT_ASSERT(*(entry->getStartTime()) == *from); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * See if scheduleEntryExists() returns correct results - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: scheduleEntryExistsTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref from; - Ptr::Ref to; - - Ptr::Ref entryId1; - Ptr::Ref entryId2; - - // at the very first, check for a nonexistent entry - entryId1.reset(new UniqueId(9999)); - CPPUNIT_ASSERT(!schedule->scheduleEntryExists(entryId1)); - - try { - // schedule our playlist for 2004-07-23, 10 o'clock - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - entryId1 = schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 12 o'clock - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - entryId2 = schedule->schedulePlaylist(playlist, from); - - // now let's check if our entries exist - CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId1)); - CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId2)); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * See if removeFromSchedule() really removes - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: removeFromScheduleTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref from; - Ptr::Ref to; - - Ptr::Ref entryId1; - Ptr::Ref entryId2; - - // at the very first, try to remove something not scheduled - bool gotException = false; - try { - entryId1.reset(new UniqueId(9999)); - schedule->removeFromSchedule(entryId1); - } catch (std::invalid_argument &e) { - gotException = true; - } - CPPUNIT_ASSERT(gotException); - - try { - // schedule our playlist for 2004-07-23, 10 o'clock - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - entryId1 = schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 12 o'clock - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - entryId2 = schedule->schedulePlaylist(playlist, from); - - // now let's remove one of them, and see that it's not there anymore - CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId1)); - schedule->removeFromSchedule(entryId1); - CPPUNIT_ASSERT(!schedule->scheduleEntryExists(entryId1)); - - // now let's remove the other, and see that it's not there anymore - CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId2)); - schedule->removeFromSchedule(entryId2); - CPPUNIT_ASSERT(!schedule->scheduleEntryExists(entryId2)); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Test rescheduling. - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: rescheduleTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref from; - Ptr::Ref to; - - Ptr::Ref entryId1; - Ptr::Ref entryId2; - - Ptr::Ref entry; - - // at the very first, try to reschedule something not scheduled - bool gotException = false; - try { - entryId1.reset(new UniqueId(9999)); - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - schedule->reschedule(entryId1, from); - } catch (std::invalid_argument &e) { - gotException = true; - } - CPPUNIT_ASSERT(gotException); - - try { - // schedule our playlist for 2004-07-23, 10 o'clock - from.reset(new ptime(time_from_string("2004-07-23 10:00:00"))); - entryId1 = schedule->schedulePlaylist(playlist, from); - - // schedule our playlist for 2004-07-23, 12 o'clock - from.reset(new ptime(time_from_string("2004-07-23 12:00:00"))); - entryId2 = schedule->schedulePlaylist(playlist, from); - - // now let's reschedule the first to a valid timepoint - from.reset(new ptime(time_from_string("2004-07-23 08:00:00"))); - schedule->reschedule(entryId1, from); - entry = schedule->getScheduleEntry(entryId1); - CPPUNIT_ASSERT((bool) entry); - CPPUNIT_ASSERT(*(entry->getStartTime()) == *from); - - // try to reschedule the second one into the first, should fail - gotException = false; - try { - from.reset(new ptime(time_from_string("2004-07-23 08:30:00"))); - schedule->reschedule(entryId1, from); - } catch (std::invalid_argument &e) { - gotException = true; - } - CPPUNIT_ASSERT(gotException); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL(e.what()); - } -} - - -/*------------------------------------------------------------------------------ - * Test the return of the currently playing entry - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: currentlyPlayingTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref from; - Ptr::Ref to; - Ptr::Ref duration; - - Ptr::Ref entryId; - - Ptr::Ref entry; - - // at the very first, see if null is returned if nothing is playing - // currently - entry = schedule->getCurrentlyPlaying(); - CPPUNIT_ASSERT(!entry.get()); - - // schedule our playlist for 10 seconds from now - from = TimeConversion::now(); - *from += seconds(10); - entryId = schedule->schedulePlaylist(playlist, from); - - // wait 10 seconds, so that what we've scheduled is the currently - // playing entry - duration.reset(new time_duration(seconds(10))); - TimeConversion::sleep(duration); - - // now see if the entry returned for currently playing is indeed - // what we've scheduled - entry = schedule->getCurrentlyPlaying(); - CPPUNIT_ASSERT(entry.get()); - CPPUNIT_ASSERT(entry->getId()->getId() == entryId->getId()); -} - - -/*------------------------------------------------------------------------------ - * Test export / import - *----------------------------------------------------------------------------*/ -void -PostgresqlScheduleTest :: exportImportTest(void) - throw (CPPUNIT_NS::Exception) -{ - // create a 1 hour long playlist - Ptr::Ref playlistId = UniqueId::generateId(); - Ptr::Ref playlength(new time_duration(1, 0, 0)); - Ptr::Ref playlist(new Playlist(playlistId, playlength)); - - Ptr::Ref now; - Ptr::Ref from; - Ptr::Ref to; - Ptr::Ref duration; - - Ptr::Ref entryId; - - Ptr::Ref entry; - Ptr::Ref eentry; - Ptr::Ref entries; - - Element * element; - - now = TimeConversion::now(); - - // schedule our playlist for 10 seconds from now - from.reset(new ptime(*now)); - *from += seconds(10); - entryId = schedule->schedulePlaylist(playlist, from); - entry = schedule->getScheduleEntry(entryId); - - // export the schedule - Ptr::Ref document(new Document()); - Element * root = document->create_root_node("root"); - - from.reset(new ptime(*now)); - to.reset(new ptime(*now)); - *to += minutes(1); - schedule->exportScheduleEntries(root, from, to); - - // remove the scheduled entry from the schedule - schedule->removeFromSchedule(entryId); - CPPUNIT_ASSERT(schedule->getScheduleEntries(from, to)->size() == 0); - - // import the exported schedule - element = dynamic_cast (*(root->get_children().begin())); - schedule->importScheduleEntries(element); - - // check on the timeframe, and see that its the same as it should be - entries = schedule->getScheduleEntries(from, to); - CPPUNIT_ASSERT(entries->size() == 1); - eentry = *(entries->begin()); - CPPUNIT_ASSERT(*entry == *eentry); -} - - diff --git a/src/products/scheduler/src/PostgresqlScheduleTest.h b/src/products/scheduler/src/PostgresqlScheduleTest.h deleted file mode 100644 index bf6dadb30..000000000 --- a/src/products/scheduler/src/PostgresqlScheduleTest.h +++ /dev/null @@ -1,203 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef PostgresqlScheduleTest_h -#define PostgresqlScheduleTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Db/ConnectionManagerInterface.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Db; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the PostgresqlSchedule class. - * - * @see PostgresqlSchedule - */ -class PostgresqlScheduleTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(PostgresqlScheduleTest); - CPPUNIT_TEST(firstTest); - /* - CPPUNIT_TEST(simpleScheduleTest); - CPPUNIT_TEST(scheduleAndQueryTest); - CPPUNIT_TEST(getScheduleEntriesTest); - CPPUNIT_TEST(getNextEntryTest); - CPPUNIT_TEST(scheduleEntryExistsTest); - CPPUNIT_TEST(removeFromScheduleTest); - CPPUNIT_TEST(rescheduleTest); - CPPUNIT_TEST(currentlyPlayingTest); - */ - CPPUNIT_TEST(exportImportTest); - CPPUNIT_TEST_SUITE_END(); - - private: - /** - * The connection manager used for testing. - */ - Ptr::Ref cm; - - /** - * The schedule used for testing. - */ - Ptr::Ref schedule; - - protected: - - /** - * Test for an available timeframe in an empty schedule database. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule a single playlist. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleScheduleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule a single playlist, and then query for available timeframes - * around it. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - scheduleAndQueryTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule some playlists, then get the list of scheduled playlists - * for different time intervals. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - getScheduleEntriesTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule some playlists, then get the some playlists by - * specifying a time. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - getNextEntryTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule some playlists, then check if they exist. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - scheduleEntryExistsTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule some playlists, then remove them. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - removeFromScheduleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Schedule some playlists, then reschedule them. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - rescheduleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to see if the currently playing scheduled entry is - * returned properly. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - currentlyPlayingTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test XML export / import. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - exportImportTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // PostgresqlScheduleTest_h - diff --git a/src/products/scheduler/src/RemoveFromScheduleMethod.cxx b/src/products/scheduler/src/RemoveFromScheduleMethod.cxx deleted file mode 100644 index d721221e0..000000000 --- a/src/products/scheduler/src/RemoveFromScheduleMethod.cxx +++ /dev/null @@ -1,143 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "ScheduleInterface.h" -#include "ScheduleFactory.h" -#include "SchedulerDaemon.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "RemoveFromScheduleMethod.h" - - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string RemoveFromScheduleMethod::methodName = "removeFromSchedule"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int RemoveFromScheduleMethod::errorId = 1200; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -RemoveFromScheduleMethod :: RemoveFromScheduleMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the remove from schedule XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -RemoveFromScheduleMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref entryId; - try { - entryId = XmlRpcTools::extractScheduleEntryId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, "missing schedule entry ID argument", - returnValue); - return; - } - - - Ptr::Ref sf = ScheduleFactory::getInstance(); - Ptr::Ref schedule = sf->getSchedule(); - Ptr::Ref currentlyPlaying; - - try { - currentlyPlaying = schedule->getCurrentlyPlaying(); - if (currentlyPlaying.get() - && currentlyPlaying->getId()->getId() == entryId->getId()) { - XmlRpcTools::markError(errorId+4, - "the entry to be deleted is currently playing", - returnValue); - return; - } - schedule->removeFromSchedule(entryId); - - // tell the scheduler daemon to reload the scheduled events - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - scheduler->update(); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "schedule entry not found", - returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/RemoveFromScheduleMethod.h b/src/products/scheduler/src/RemoveFromScheduleMethod.h deleted file mode 100644 index 3448e3e58..000000000 --- a/src/products/scheduler/src/RemoveFromScheduleMethod.h +++ /dev/null @@ -1,144 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RemoveFromScheduleMethod_h -#define RemoveFromScheduleMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to remove a scheduled entry. - * - * The name of the method when called through XML-RPC is "removeFromSchedule". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
  • scheduleEntryId - string - the id of the scheduled entry - * to remove
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 1201 - invalid argument format
  • - *
  • 1202 - missing schedule entry ID argument
  • - *
  • 1203 - schedule entry not found
  • - *
  • 1204 - the entry to be deleted is currently playing
  • - *
  • 1220 - missing session ID argument
  • - *
- * - */ -class RemoveFromScheduleMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - RemoveFromScheduleMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - RemoveFromScheduleMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the remove from schedule command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RemoveFromScheduleMethod_h - diff --git a/src/products/scheduler/src/RemoveFromScheduleMethodTest.cxx b/src/products/scheduler/src/RemoveFromScheduleMethodTest.cxx deleted file mode 100644 index 9177a9eb9..000000000 --- a/src/products/scheduler/src/RemoveFromScheduleMethodTest.cxx +++ /dev/null @@ -1,270 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "ScheduleFactory.h" -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" - -#include "SchedulerDaemon.h" -#include "UploadPlaylistMethod.h" -#include "RemoveFromScheduleMethod.h" -#include "RemoveFromScheduleMethodTest.h" - - -using namespace boost::posix_time; - -using namespace LiveSupport::Authentication; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RemoveFromScheduleMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RemoveFromScheduleMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - Ptr::Ref storage = scheduler->getStorage(); - storage->reset(); - - schedule = scheduler->getSchedule(); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } catch (std::exception &e) { - CPPUNIT_FAIL(e.what()); - } - - authentication = scheduler->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::string eMsg = "could not log in:\n"; - eMsg += e.what(); - CPPUNIT_FAIL(eMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RemoveFromScheduleMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -RemoveFromScheduleMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref uploadMethod( - new UploadPlaylistMethod()); - Ptr::Ref removeMethod( - new RemoveFromScheduleMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - Ptr::Ref entryId; - - // first schedule (upload) a playlist - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - uploadMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - entryId.reset(new UniqueId(std::string(result["scheduleEntryId"]))); - - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - rootParameter[0] = parameters; - - result.clear(); - try { - removeMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } -} - - -/*------------------------------------------------------------------------------ - * A test to try to remove a not-scheduled entry - *----------------------------------------------------------------------------*/ -void -RemoveFromScheduleMethodTest :: negativeTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref removeMethod( - new RemoveFromScheduleMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - Ptr::Ref entryId(new UniqueId(9999)); - - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - rootParameter[0] = parameters; - - result.clear(); - try { - removeMethod->execute(rootParameter, result); - CPPUNIT_FAIL("allowed to remove non-existent schedule entry"); - } catch (XmlRpc::XmlRpcException &e) { - } -} - - -/*------------------------------------------------------------------------------ - * A test to try to remove a currently playing entry. - *----------------------------------------------------------------------------*/ -void -RemoveFromScheduleMethodTest :: currentlyPlayingTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref uploadMethod( - new UploadPlaylistMethod()); - Ptr::Ref removeMethod( - new RemoveFromScheduleMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - Ptr::Ref now; - struct tm time; - Ptr::Ref duration; - Ptr::Ref entryId; - bool gotException; - - // first schedule (upload) a playlist, for 10 seconds from now - now = TimeConversion::now(); - *now += seconds(10); - TimeConversion::ptimeToTm(now, time); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - uploadMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - entryId.reset(new UniqueId(std::string(result["scheduleEntryId"]))); - - // wait 10 seconds, so that what we've scheduled is the currently playing - // entry - duration.reset(new time_duration(seconds(10))); - TimeConversion::sleep(duration); - - // now try to remove what we've scheduled, this should fail - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - rootParameter[0] = parameters; - - result.clear(); - gotException = false; - try { - removeMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - gotException = true; - } - CPPUNIT_ASSERT(gotException); -} - - diff --git a/src/products/scheduler/src/RemoveFromScheduleMethodTest.h b/src/products/scheduler/src/RemoveFromScheduleMethodTest.h deleted file mode 100644 index b9d6dee5c..000000000 --- a/src/products/scheduler/src/RemoveFromScheduleMethodTest.h +++ /dev/null @@ -1,141 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RemoveFromScheduleMethodTest_h -#define RemoveFromScheduleMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the RemoveFromScheduleMethod class. - * - * @see RemoveFromScheduleMethod - */ -class RemoveFromScheduleMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(RemoveFromScheduleMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(negativeTest); - CPPUNIT_TEST(currentlyPlayingTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The schedule used during the test. - */ - Ptr::Ref schedule; - - /** - * The authentication client produced by the factory. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A simple test for trying to remove a non-existent entry. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - negativeTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to try to remove an entry that's currently playing. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - currentlyPlayingTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RemoveFromScheduleMethodTest_h - diff --git a/src/products/scheduler/src/RescheduleMethod.cxx b/src/products/scheduler/src/RescheduleMethod.cxx deleted file mode 100644 index e2d8e70e3..000000000 --- a/src/products/scheduler/src/RescheduleMethod.cxx +++ /dev/null @@ -1,161 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "ScheduleInterface.h" -#include "ScheduleFactory.h" -#include "SchedulerDaemon.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "RescheduleMethod.h" - - -using namespace boost; -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string RescheduleMethod::methodName = "reschedule"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int RescheduleMethod::errorId = 1300; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -RescheduleMethod :: RescheduleMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the upload playlist method XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -RescheduleMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref entryId; - try { - entryId = XmlRpcTools::extractScheduleEntryId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, "missing schedule entry ID argument", - returnValue); - return; - } - - Ptr::Ref playschedule; - try { - playschedule = XmlRpcTools::extractPlayschedule(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "missing playtime argument", - returnValue); - return; - } - - Ptr::Ref scheduleEntryId; - - Ptr::Ref sf = ScheduleFactory::getInstance(); - Ptr::Ref schedule = sf->getSchedule(); - Ptr::Ref currentlyPlaying; - - if (!schedule->scheduleEntryExists(entryId)) { - XmlRpcTools::markError(errorId+4, "schedule entry not found", - returnValue); - return; - } - currentlyPlaying = schedule->getCurrentlyPlaying(); - if (currentlyPlaying.get() - && currentlyPlaying->getId()->getId() == entryId->getId()) { - XmlRpcTools::markError(errorId+6, - "the entry to be rescheduled is currently playing", - returnValue); - return; - } - try { - schedule->reschedule(entryId, playschedule); - - // tell the scheduler daemon to reload the scheduled events - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - scheduler->update(); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+5, e.what(), - returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/RescheduleMethod.h b/src/products/scheduler/src/RescheduleMethod.h deleted file mode 100644 index bc9228f38..000000000 --- a/src/products/scheduler/src/RescheduleMethod.h +++ /dev/null @@ -1,147 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RescheduleMethod_h -#define RescheduleMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to reschedule an already scheduled event. - * - * The name of the method when called through XML-RPC is "reschedule". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
  • scheduleEntryId - string - the id of the schedule entry - * to reschedule
  • - *
  • playtime - datetime - the new playing time for the entry
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 1301 - invalid argument format
  • - *
  • 1302 - missing schedule entry ID argument
  • - *
  • 1303 - missing playtime argument
  • - *
  • 1304 - schedule entry not found
  • - *
  • 1305 - could not reschedule entry
  • - *
  • 1306 - the entry to be rescheduled is currently playing
  • - *
  • 1320 - missing session ID argument
  • - *
- * - */ -class RescheduleMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - RescheduleMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - RescheduleMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the upload playlist command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RescheduleMethod_h - diff --git a/src/products/scheduler/src/RescheduleMethodTest.cxx b/src/products/scheduler/src/RescheduleMethodTest.cxx deleted file mode 100644 index 10080eeb0..000000000 --- a/src/products/scheduler/src/RescheduleMethodTest.cxx +++ /dev/null @@ -1,271 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include - -#include "LiveSupport/Core/TimeConversion.h" -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" - -#include "SchedulerDaemon.h" -#include "ScheduleFactory.h" -#include "UploadPlaylistMethod.h" -#include "RescheduleMethod.h" -#include "RescheduleMethodTest.h" - -using namespace LiveSupport::Db; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::Authentication; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RescheduleMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RescheduleMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - Ptr::Ref storage = scheduler->getStorage(); - storage->reset(); - - schedule = scheduler->getSchedule(); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } catch (std::exception &e) { - CPPUNIT_FAIL(e.what()); - } - - authentication = scheduler->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::string eMsg = "could not log in:\n"; - eMsg += e.what(); - CPPUNIT_FAIL(eMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RescheduleMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -RescheduleMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref uploadMethod(new UploadPlaylistMethod()); - Ptr::Ref rescheduleMethod(new RescheduleMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - Ptr::Ref entryId; - - // let's upload something so we can reschedule it - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 18; - time.tm_min = 31; - time.tm_sec = 1; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - uploadMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - entryId.reset(new UniqueId(std::string(result["scheduleEntryId"]))); - - // now let's reschedule it - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 12; - time.tm_min = 31; - time.tm_sec = 1; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - rescheduleMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - - // now let's reschedule unto itself, should fail - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 12; - time.tm_min = 51; - time.tm_sec = 1; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - rescheduleMethod->execute(rootParameter, result); - CPPUNIT_FAIL("allowed to schedule playlist onto itself"); - } catch (XmlRpc::XmlRpcException &e) { - CPPUNIT_ASSERT(e.getCode() == 1305); - } -} - - -/*------------------------------------------------------------------------------ - * Test to see if rescheduling the currently playing entry works (should not) - *----------------------------------------------------------------------------*/ -void -RescheduleMethodTest :: currentlyPlayingTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref uploadMethod(new UploadPlaylistMethod()); - Ptr::Ref rescheduleMethod(new RescheduleMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - Ptr::Ref now; - Ptr::Ref duration; - bool gotException; - Ptr::Ref entryId; - - // let's upload something so we can reschedule it - now = TimeConversion::now(); - *now += seconds(10); - TimeConversion::ptimeToTm(now, time); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - uploadMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - entryId.reset(new UniqueId(std::string(result["scheduleEntryId"]))); - - // wait 10 seconds, so that what we've scheduled is the currently playing - // entry - duration.reset(new time_duration(seconds(10))); - TimeConversion::sleep(duration); - - // now let's try reschedule it, which should fail - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 12; - time.tm_min = 31; - time.tm_sec = 1; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - gotException = false; - try { - rescheduleMethod->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - gotException = true; - } - CPPUNIT_ASSERT(gotException); -} - diff --git a/src/products/scheduler/src/RescheduleMethodTest.h b/src/products/scheduler/src/RescheduleMethodTest.h deleted file mode 100644 index 9202a2e0d..000000000 --- a/src/products/scheduler/src/RescheduleMethodTest.h +++ /dev/null @@ -1,133 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RescheduleMethodTest_h -#define RescheduleMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the RescheduleMethod class. - * - * @see RescheduleMethod - */ -class RescheduleMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(RescheduleMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(currentlyPlayingTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The schedule used during the test. - */ - Ptr::Ref schedule; - - /** - * The authentication client produced by the factory. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to see if rescheduling the currently playing entry works. - * (should not) - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - currentlyPlayingTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RescheduleMethodTest_h - diff --git a/src/products/scheduler/src/ResetStorageMethod.cxx b/src/products/scheduler/src/ResetStorageMethod.cxx deleted file mode 100644 index bdf5212dc..000000000 --- a/src/products/scheduler/src/ResetStorageMethod.cxx +++ /dev/null @@ -1,94 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Core/XmlRpcTools.h" - -#include "ResetStorageMethod.h" - - -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string ResetStorageMethod::methodName = "resetStorage"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int ResetStorageMethod::errorId = 3000; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -ResetStorageMethod :: ResetStorageMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the XML-RPC function call. - * (Overrides 'execute' in XmlRpcServerMethod.) - *----------------------------------------------------------------------------*/ -void -ResetStorageMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - Ptr::Ref scf - = StorageClientFactory::getInstance(); - Ptr::Ref storage - = scf->getStorageClient(); - - try { - storage->reset(); - } catch (Core::XmlRpcException &e) { - std::string eMsg = "storage reset() returned error:\n"; - eMsg += e.what(); - XmlRpcTools::markError(errorId+1, eMsg, returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/ResetStorageMethod.h b/src/products/scheduler/src/ResetStorageMethod.h deleted file mode 100644 index a089edf17..000000000 --- a/src/products/scheduler/src/ResetStorageMethod.h +++ /dev/null @@ -1,128 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ResetStorageMethod_h -#define ResetStorageMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to reset the storage to its initial value. - * - * The name of the method when called through XML-RPC is "resetStorage". - * - * No parameters are required, and normally nothing is returned. - * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 3001 - storage client reported an error
  • - *
- * - */ -class ResetStorageMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - ResetStorageMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - ResetStorageMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the reset storage command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // ResetStorageMethod_h - diff --git a/src/products/scheduler/src/ResetStorageMethodTest.cxx b/src/products/scheduler/src/ResetStorageMethodTest.cxx deleted file mode 100644 index 937cd1334..000000000 --- a/src/products/scheduler/src/ResetStorageMethodTest.cxx +++ /dev/null @@ -1,84 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include - -#include "ResetStorageMethodTest.h" - - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(ResetStorageMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -ResetStorageMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -ResetStorageMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ -} - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -ResetStorageMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/ResetStorageMethodTest.h b/src/products/scheduler/src/ResetStorageMethodTest.h deleted file mode 100644 index 89f5f10a4..000000000 --- a/src/products/scheduler/src/ResetStorageMethodTest.h +++ /dev/null @@ -1,102 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ResetStorageMethodTest_h -#define ResetStorageMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "BaseTestMethod.h" - - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the ResetStorageMethod class. - * - * @see ResetStorageMethod - */ -class ResetStorageMethodTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(ResetStorageMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST_SUITE_END(); - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // ResetStorageMethodTest_h - diff --git a/src/products/scheduler/src/RestoreBackupMethod.cxx b/src/products/scheduler/src/RestoreBackupMethod.cxx deleted file mode 100644 index 5e27d2c23..000000000 --- a/src/products/scheduler/src/RestoreBackupMethod.cxx +++ /dev/null @@ -1,123 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision$ - Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/branches/scheduler_export/livesupport/src/products/scheduler/src/RestoreBackupMethod.cxx $ - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include "LiveSupport/Core/XmlRpcTools.h" -#include "LiveSupport/Core/XmlRpcException.h" -#include "BackupFactory.h" - -#include "RestoreBackupMethod.h" - - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string RestoreBackupMethod::methodName = "restoreBackup"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int RestoreBackupMethod::errorId = 4500; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -RestoreBackupMethod :: RestoreBackupMethod ( - Ptr::Ref xmlRpcServer) - throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the upload playlist method XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -RestoreBackupMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref path; - try{ - path = XmlRpcTools::extractPath(parameters); - - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, - "missing path argument", - returnValue); - return; - } - - Ptr::Ref bf = BackupFactory::getInstance(); - Ptr::Ref backup = bf->getBackup(); - try { - backup->restoreBackup(sessionId, path); - - } catch (Core::XmlRpcException &e) { - XmlRpcTools::markError(errorId+10, e.what(), returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/RestoreBackupMethod.h b/src/products/scheduler/src/RestoreBackupMethod.h deleted file mode 100644 index 67c4f8632..000000000 --- a/src/products/scheduler/src/RestoreBackupMethod.h +++ /dev/null @@ -1,141 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision$ - Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/branches/scheduler_export/livesupport/src/products/scheduler/src/RestoreBackupMethod.h $ - -------------------------------------------------------------------------------*/ -#ifndef RestoreBackupMethod_h -#define RestoreBackupMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to restore a schedule backup. - * - * The name of the method when called through XML-RPC is "restoreBackup". - * - * The expected parameter is an XML-RPC structure with these members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client;
  • - *
  • path - string - the local path and filename of the backup - * archive to be restored.
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 4501 - invalid argument format
  • - *
  • 4502 - missing path argument
  • - *
  • 4510 - error reported by the scheduler daemon
  • - *
  • 4520 - missing session ID argument
  • - *
- * - * @author $Author: fgerlits $ - * @version $Revision$ - */ -class RestoreBackupMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - RestoreBackupMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - RestoreBackupMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the createBackupOpen command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RestoreBackupMethod_h - diff --git a/src/products/scheduler/src/RpcBackupTest.cxx b/src/products/scheduler/src/RpcBackupTest.cxx deleted file mode 100644 index 28bb4c792..000000000 --- a/src/products/scheduler/src/RpcBackupTest.cxx +++ /dev/null @@ -1,315 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include - -#include -#include - -#include "LiveSupport/Core/UniqueId.h" -#include "LiveSupport/Core/XmlRpcTools.h" -#include "LiveSupport/Core/FileTools.h" -#include "SchedulerDaemon.h" -#include "PlayLogFactory.h" - -#include "RpcBackupTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcBackupTest); - -namespace { - -/** - * The name of the configuration file for the scheduler daemon - */ -const std::string configFileName = "etc/scheduler.xml"; - -/** - * The location of the temporary backup file - */ -const std::string tempBackupTarFileName = "tmp/scheduleBackup.tar"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcBackupTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcBackupTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); - - remove(tempBackupTarFileName.c_str()); -} - - -/*------------------------------------------------------------------------------ - * Create the backup. - *----------------------------------------------------------------------------*/ -void -RpcBackupTest :: createBackup(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - Ptr::Ref criteria(new SearchCriteria); - criteria->setLimit(10); - Ptr::Ref from(new ptime(time_from_string("2004-07-23 10:00:00"))); - Ptr::Ref to(new ptime(time_from_string("2004-07-23 11:00:00"))); - - XmlRpcTools::sessionIdToXmlRpcValue(sessionId, parameters); - XmlRpcTools::searchCriteriaToXmlRpcValue(criteria, parameters); - XmlRpcTools::fromTimeToXmlRpcValue(from, parameters); - XmlRpcTools::toTimeToXmlRpcValue(to, parameters); - - CPPUNIT_ASSERT(xmlRpcClient.execute("createBackupOpen", - parameters, - result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - Ptr::Ref token; - CPPUNIT_ASSERT_NO_THROW( - token = XmlRpcTools::extractToken(result); - ); - - AsyncState status; - parameters.clear(); - XmlRpcTools::tokenToXmlRpcValue(token, parameters); - int iterations = 20; - do { - std::cerr << "-/|\\"[iterations%4] << '\b'; - sleep(1); - result.clear(); - CPPUNIT_ASSERT(xmlRpcClient.execute("createBackupCheck", - parameters, - result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - CPPUNIT_ASSERT_NO_THROW( - status = XmlRpcTools::extractBackupStatus(result); - ); - CPPUNIT_ASSERT(status == AsyncState::pendingState - || status == AsyncState::finishedState - || status == AsyncState::failedState); - } while (--iterations && status == AsyncState::pendingState); - - CPPUNIT_ASSERT_EQUAL(AsyncState::finishedState, status); - // TODO: test accessibility of the URL? - - Ptr::Ref url; - Ptr::Ref path; - Ptr::Ref errorMessage; - - CPPUNIT_ASSERT_NO_THROW( - url = XmlRpcTools::extractUrl(result); - ); - CPPUNIT_ASSERT_NO_THROW( - path = XmlRpcTools::extractPath(result); - ); - - // copy the backup file - CPPUNIT_ASSERT_NO_THROW( - remove(tempBackupTarFileName.c_str()); - std::ifstream ifs(path->c_str(), std::ios::binary); - std::ofstream ofs(tempBackupTarFileName.c_str(), std::ios::binary); - ofs << ifs.rdbuf(); - ); - - parameters.clear(); - XmlRpcTools::tokenToXmlRpcValue(token, parameters); - result.clear(); - CPPUNIT_ASSERT(xmlRpcClient.execute("createBackupClose", - parameters, - result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Test the createBackupXxxx methods. - *----------------------------------------------------------------------------*/ -void -RpcBackupTest :: createBackupTest(void) - throw (CPPUNIT_NS::Exception) -{ - // Create the backup. - CPPUNIT_ASSERT_NO_THROW( - createBackup() - ); - - // Check the backup file. - bool exists; - std::string schedulerBackupInTarball = "meta-inf/scheduler.xml"; - CPPUNIT_ASSERT_NO_THROW( - exists = FileTools::existsInTarball(tempBackupTarFileName, - schedulerBackupInTarball) - ); - CPPUNIT_ASSERT(exists); - - std::string extractedTempFileName = "tmp/scheduler.tmp.xml"; - FILE * file; - - remove(extractedTempFileName.c_str()); - file = fopen(extractedTempFileName.c_str(), "r"); - CPPUNIT_ASSERT(file == 0); - - CPPUNIT_ASSERT_NO_THROW( - FileTools::extractFileFromTarball(tempBackupTarFileName, - schedulerBackupInTarball, - extractedTempFileName) - ); - - file = fopen(extractedTempFileName.c_str(), "r"); - CPPUNIT_ASSERT(file != 0); - CPPUNIT_ASSERT(fclose(file) == 0); - - CPPUNIT_ASSERT(remove(extractedTempFileName.c_str()) == 0); - file = fopen(extractedTempFileName.c_str(), "r"); - CPPUNIT_ASSERT(file == 0); -} - - -/*------------------------------------------------------------------------------ - * Test the restoreBackup method. - *----------------------------------------------------------------------------*/ -void -RpcBackupTest :: restoreBackupTest(void) - throw (CPPUNIT_NS::Exception) -{ - // Create the backup. - CPPUNIT_ASSERT_NO_THROW( - createBackup() - ); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(sessionId); - Ptr::Ref path(new const Glib::ustring( - tempBackupTarFileName)); - - XmlRpcTools::sessionIdToXmlRpcValue(sessionId, parameters); - XmlRpcTools::pathToXmlRpcValue(path, parameters); - - CPPUNIT_ASSERT(xmlRpcClient.execute("restoreBackup", - parameters, - result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); - // TODO: try this with a non-empty backup file, too -} - diff --git a/src/products/scheduler/src/RpcBackupTest.h b/src/products/scheduler/src/RpcBackupTest.h deleted file mode 100644 index cc8538a5b..000000000 --- a/src/products/scheduler/src/RpcBackupTest.h +++ /dev/null @@ -1,128 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcBackupTest_h -#define RpcBackupTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the BackupMethod class. - * - * @see BackupMethod - */ -class RpcBackupTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcBackupTest); - CPPUNIT_TEST(createBackupTest); - CPPUNIT_TEST(restoreBackupTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Auxiliary method: create the backup file. Used by both tests. - */ - void - createBackup(void) throw (CPPUNIT_NS::Exception); - - - protected: - - /** - * Test the createBackupXxxx methods. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - createBackupTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test the restoreBackup method. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - restoreBackupTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcBackupTest_h - diff --git a/src/products/scheduler/src/RpcDisplayScheduleTest.cxx b/src/products/scheduler/src/RpcDisplayScheduleTest.cxx deleted file mode 100644 index 9080db191..000000000 --- a/src/products/scheduler/src/RpcDisplayScheduleTest.cxx +++ /dev/null @@ -1,238 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include - -#include "SchedulerDaemon.h" - -#include "RpcDisplayScheduleTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcDisplayScheduleTest); - -/** - * The name of the configuration file for the scheduler daemon. - */ -static const std::string configFileName = "etc/scheduler.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcDisplayScheduleTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcDisplayScheduleTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Test a simple query, resulting in an empty result set. - *----------------------------------------------------------------------------*/ -void -RpcDisplayScheduleTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpcValue parameters; - XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // list the schedules for an interval (as the database is empty, - // it's going to return an empty result set) - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 2044; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 2044; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 11; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - - result.clear(); - xmlRpcClient.execute("displaySchedule", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.size() == 0); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Testing some error conditions. - *----------------------------------------------------------------------------*/ -void -RpcDisplayScheduleTest :: faultTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - result.clear(); - xmlRpcClient.execute("displaySchedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("faultCode")); - CPPUNIT_ASSERT(int(result["faultCode"]) == 1101); - - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["from"] = "the beginning"; - parameters["to"] = "the end"; - - result.clear(); - xmlRpcClient.execute("displaySchedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("faultCode")); - CPPUNIT_ASSERT(int(result["faultCode"]) == 1102); -/* - struct tm time; - - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 2044; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 2044; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 11; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - - result.clear(); - xmlRpcClient.execute("displaySchedule", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.size() == 0); -*/ - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/RpcDisplayScheduleTest.h b/src/products/scheduler/src/RpcDisplayScheduleTest.h deleted file mode 100644 index b209404ff..000000000 --- a/src/products/scheduler/src/RpcDisplayScheduleTest.h +++ /dev/null @@ -1,120 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcDisplayScheduleTest_h -#define RpcDisplayScheduleTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the displaySchedule XML-RPC call. - * - * @see SchedulerDaemon - */ -class RpcDisplayScheduleTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcDisplayScheduleTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(faultTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - protected: - - /** - * Simple test for an empty query. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Test some error conditions. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - faultTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcDisplayScheduleTest_h - diff --git a/src/products/scheduler/src/RpcGeneratePlayReportTest.cxx b/src/products/scheduler/src/RpcGeneratePlayReportTest.cxx deleted file mode 100644 index 045315001..000000000 --- a/src/products/scheduler/src/RpcGeneratePlayReportTest.cxx +++ /dev/null @@ -1,389 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "LiveSupport/Core/UniqueId.h" -#include "SchedulerDaemon.h" -#include "PlayLogFactory.h" - -#include "RpcGeneratePlayReportTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcGeneratePlayReportTest); - -/** - * The name of the configuration file for the scheduler daemon - */ -static const std::string configFileName = "etc/scheduler.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcGeneratePlayReportTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - - insertEntries(); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcGeneratePlayReportTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Insert some entries into the play log - *----------------------------------------------------------------------------*/ -void -RpcGeneratePlayReportTest :: insertEntries(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref plf = PlayLogFactory::getInstance(); - Ptr::Ref playLog = plf->getPlayLog(); - - Ptr::Ref audioClipId(new UniqueId(10001)); - Ptr::Ref timestamp(new ptime(time_from_string( - "2004-10-26 14:00:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - audioClipId.reset(new UniqueId(10017)); - timestamp.reset(new ptime(time_from_string("2004-10-26 15:30:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); - - audioClipId.reset(new UniqueId(10003)); - timestamp.reset(new ptime(time_from_string("2004-10-27 10:01:00"))); - playLog->addPlayLogEntry(audioClipId, timestamp); -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -RpcGeneratePlayReportTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // set up a structure for the parameters - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 101; // 2001 - time.tm_mon = 10; // November - time.tm_mday = 12; - time.tm_hour = 18; - time.tm_min = 31; - time.tm_sec = 1; - parameters["from"] = &time; - time.tm_year = 101; // 2001 - time.tm_mon = 10; // November - time.tm_mday = 12; - time.tm_hour = 19; - time.tm_min = 31; - time.tm_sec = 1; - parameters["to"] = &time; - - CPPUNIT_ASSERT(xmlRpcClient.execute("generatePlayReport", - parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.size() == 0); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Look at some intervals and check against test data - *----------------------------------------------------------------------------*/ -void -RpcGeneratePlayReportTest :: intervalTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // check for the interval 2004-10-26 between 13 and 15 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 13; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 15; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - - CPPUNIT_ASSERT(xmlRpcClient.execute("generatePlayReport", - parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - // check the returned values - CPPUNIT_ASSERT(result.size() == 1); - CPPUNIT_ASSERT(result[0].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[0]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - UniqueId newAudioClipId = UniqueId(std::string(result[0]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10001); - - CPPUNIT_ASSERT(result[0].hasMember("timestamp")); - CPPUNIT_ASSERT(result[0]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[0]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 26); - CPPUNIT_ASSERT(time.tm_hour == 14); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - - - // check for the interval 2004-10-26 between 14 o'clock and 15:30 - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 14; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 15; - time.tm_min = 30; - time.tm_sec = 0; - parameters["to"] = &time; - - result.clear(); - CPPUNIT_ASSERT(xmlRpcClient.execute("generatePlayReport", - parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - // check the returned values - CPPUNIT_ASSERT(result.size() == 1); - CPPUNIT_ASSERT(result[0].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[0]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - newAudioClipId = UniqueId(std::string(result[0]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10001); - - CPPUNIT_ASSERT(result[0].hasMember("timestamp")); - CPPUNIT_ASSERT(result[0]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[0]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 26); - CPPUNIT_ASSERT(time.tm_hour == 14); - CPPUNIT_ASSERT(time.tm_min == 0); - CPPUNIT_ASSERT(time.tm_sec == 0); - - - // check for the interval 2004-10-26 15:00 to 2012-08-01 midnight - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 15; - time.tm_min = 30; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 112; // 2012 - time.tm_mon = 7; // August - time.tm_mday = 1; - time.tm_hour = 0; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - - result.clear(); - CPPUNIT_ASSERT(xmlRpcClient.execute("generatePlayReport", - parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - // check the returned values - CPPUNIT_ASSERT(result.size() == 2); - CPPUNIT_ASSERT(result[0].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[0]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - newAudioClipId = UniqueId(std::string(result[0]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10017); - - CPPUNIT_ASSERT(result[0].hasMember("timestamp")); - CPPUNIT_ASSERT(result[0]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[0]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 26); - CPPUNIT_ASSERT(time.tm_hour == 15); - CPPUNIT_ASSERT(time.tm_min == 30); - CPPUNIT_ASSERT(time.tm_sec == 0); - - CPPUNIT_ASSERT(result[1].hasMember("audioClipId")); - CPPUNIT_ASSERT(result[1]["audioClipId"].getType() - == XmlRpc::XmlRpcValue::TypeString); - newAudioClipId = UniqueId(std::string(result[1]["audioClipId"])); - CPPUNIT_ASSERT(newAudioClipId.getId() == 10003); - - CPPUNIT_ASSERT(result[1].hasMember("timestamp")); - CPPUNIT_ASSERT(result[1]["timestamp"].getType() - == XmlRpc::XmlRpcValue::TypeDateTime); - time = result[1]["timestamp"]; - CPPUNIT_ASSERT(time.tm_year == 104); // 2004 - CPPUNIT_ASSERT(time.tm_mon == 9); // October - CPPUNIT_ASSERT(time.tm_mday == 27); - CPPUNIT_ASSERT(time.tm_hour == 10); - CPPUNIT_ASSERT(time.tm_min == 01); - CPPUNIT_ASSERT(time.tm_sec == 0); - - - // check for the interval 2004-10-26 16 o'clock to 2004-10-27 10 o'clock - parameters["sessionId"] = sessionId->getId(); - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 26; - time.tm_hour = 16; - time.tm_min = 0; - time.tm_sec = 0; - parameters["from"] = &time; - time.tm_year = 104; // 2004 - time.tm_mon = 9; // October - time.tm_mday = 27; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["to"] = &time; - - result.clear(); - CPPUNIT_ASSERT(xmlRpcClient.execute("generatePlayReport", - parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - // check the returned values - CPPUNIT_ASSERT(result.size() == 0); - - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/RpcGeneratePlayReportTest.h b/src/products/scheduler/src/RpcGeneratePlayReportTest.h deleted file mode 100644 index 54c4a93b2..000000000 --- a/src/products/scheduler/src/RpcGeneratePlayReportTest.h +++ /dev/null @@ -1,126 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcGeneratePlayReportTest_h -#define RpcGeneratePlayReportTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the GeneratePlayReportMethod class. - * - * @see GeneratePlayReportMethod - */ -class RpcGeneratePlayReportTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcGeneratePlayReportTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(intervalTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Insert some entries into the play log to provide test data. - */ - void - insertEntries(void) throw (CPPUNIT_NS::Exception); - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Look at some intervals, and check them against the test data. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - intervalTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcGeneratePlayReportTest_h - diff --git a/src/products/scheduler/src/RpcGetSchedulerTimeTest.cxx b/src/products/scheduler/src/RpcGetSchedulerTimeTest.cxx deleted file mode 100644 index d7ee29f27..000000000 --- a/src/products/scheduler/src/RpcGetSchedulerTimeTest.cxx +++ /dev/null @@ -1,131 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "SchedulerDaemon.h" - -#include "RpcGetSchedulerTimeTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcGetSchedulerTimeTest); - -/** - * The name of the configuration file for the scheduler daemon. - */ -static const std::string configFileName = "etc/scheduler.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcGetSchedulerTimeTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcGetSchedulerTimeTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); -} - - -/*------------------------------------------------------------------------------ - * Test a simple query, resulting in an empty result set. - *----------------------------------------------------------------------------*/ -void -RpcGetSchedulerTimeTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - XmlRpcValue parameters; - XmlRpcValue result; - struct tm time1, - time2; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - result.clear(); - xmlRpcClient.execute("getSchedulerTime", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("schedulerTime")); - time1 = result["schedulerTime"]; - - result.clear(); - xmlRpcClient.execute("getSchedulerTime", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("schedulerTime")); - time2 = result["schedulerTime"]; - - CPPUNIT_ASSERT(time1.tm_year == time2.tm_year); - // could fail on New Year's Eve, but we don't work on New Year's Eve - - CPPUNIT_ASSERT(time1.tm_hour <= time2.tm_hour); - CPPUNIT_ASSERT(time1.tm_min <= time2.tm_min); - CPPUNIT_ASSERT(time1.tm_min + 1 >= time2.tm_min); - - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/RpcGetSchedulerTimeTest.h b/src/products/scheduler/src/RpcGetSchedulerTimeTest.h deleted file mode 100644 index bb769b604..000000000 --- a/src/products/scheduler/src/RpcGetSchedulerTimeTest.h +++ /dev/null @@ -1,101 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcGetSchedulerTimeTest_h -#define RpcGetSchedulerTimeTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the getSchedulerTime XML-RPC call. - * - * @see SchedulerDaemon - */ -class RpcGetSchedulerTimeTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcGetSchedulerTimeTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * Simple test for an empty query. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcGetSchedulerTimeTest_h - diff --git a/src/products/scheduler/src/RpcGetVersionTest.cxx b/src/products/scheduler/src/RpcGetVersionTest.cxx deleted file mode 100644 index bda4240e3..000000000 --- a/src/products/scheduler/src/RpcGetVersionTest.cxx +++ /dev/null @@ -1,101 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "SchedulerDaemon.h" - -#include "RpcGetVersionTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcGetVersionTest); - -/** - * The prefix of the persumed version string. - */ -static const std::string versionPrefix = "LiveSupport Scheduler Daemon"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcGetVersionTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcGetVersionTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); -} - - -/*------------------------------------------------------------------------------ - * Test a simple upload. - *----------------------------------------------------------------------------*/ -void -RpcGetVersionTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - result.clear(); - xmlRpcClient.execute("getVersion", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - CPPUNIT_ASSERT(result.hasMember("version")); - std::string versionStr = result["version"]; - CPPUNIT_ASSERT(versionStr.find(versionPrefix) == 0); - - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/RpcGetVersionTest.h b/src/products/scheduler/src/RpcGetVersionTest.h deleted file mode 100644 index aa0db30e9..000000000 --- a/src/products/scheduler/src/RpcGetVersionTest.h +++ /dev/null @@ -1,99 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcGetVersionTest_h -#define RpcGetVersionTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the getVersion XML-RPC call. - * - * @see SchedulerDaemon - */ -class RpcGetVersionTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcGetVersionTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST_SUITE_END(); - - protected: - - /** - * Simple test for playlist uploading. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcGetVersionTest_h - diff --git a/src/products/scheduler/src/RpcRemoveFromScheduleTest.cxx b/src/products/scheduler/src/RpcRemoveFromScheduleTest.cxx deleted file mode 100644 index 528d01eaf..000000000 --- a/src/products/scheduler/src/RpcRemoveFromScheduleTest.cxx +++ /dev/null @@ -1,235 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "SchedulerDaemon.h" -#include "LiveSupport/Core/TimeConversion.h" - -#include "RpcRemoveFromScheduleTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcRemoveFromScheduleTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcRemoveFromScheduleTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcRemoveFromScheduleTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A simple smoke test. - *----------------------------------------------------------------------------*/ -void -RpcRemoveFromScheduleTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpcValue parameters; - XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // first schedule a playlist, so that there is something to remove - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpcValue::TypeString); - Ptr::Ref entryId(new UniqueId(std::string( - result["scheduleEntryId"] ))); - parameters["scheduleEntryId"] = std::string(*entryId); - - result.clear(); - xmlRpcClient.execute("removeFromSchedule", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A simple negative test. - *----------------------------------------------------------------------------*/ -void -RpcRemoveFromScheduleTest :: negativeTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpcValue parameters; - XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = "0000000000009999"; - - result.clear(); - xmlRpcClient.execute("removeFromSchedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A test to try to remove a currently playing entry. - *----------------------------------------------------------------------------*/ -void -RpcRemoveFromScheduleTest :: currentlyPlayingTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpcValue parameters; - XmlRpcValue result; - Ptr::Ref now; - struct tm time; - Ptr::Ref duration; - Ptr::Ref entryId; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // first schedule (upload) a playlist, for 15 seconds from now - now = TimeConversion::now(); - *now += seconds(10); - TimeConversion::ptimeToTm(now, time); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpcValue::TypeString); - entryId.reset(new UniqueId(std::string(result["scheduleEntryId"] ))); - - // wait 10 seconds, so that what we've scheduled is the currently playing - // entry - duration.reset(new time_duration(seconds(10))); - TimeConversion::sleep(duration); - - // now try to remove what we've scheduled, this should fail - parameters["scheduleEntryId"] = std::string(*entryId); - - result.clear(); - xmlRpcClient.execute("removeFromSchedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} diff --git a/src/products/scheduler/src/RpcRemoveFromScheduleTest.h b/src/products/scheduler/src/RpcRemoveFromScheduleTest.h deleted file mode 100644 index 4d984bec1..000000000 --- a/src/products/scheduler/src/RpcRemoveFromScheduleTest.h +++ /dev/null @@ -1,129 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcRemoveFromScheduleTest_h -#define RpcRemoveFromScheduleTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the removeFromSchedule XML-RPC call. - * - * @see SchedulerDaemon - */ -class RpcRemoveFromScheduleTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcRemoveFromScheduleTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(negativeTest); - CPPUNIT_TEST(currentlyPlayingTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - protected: - - /** - * Simple smoke test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Simple negative test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - negativeTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to see if removing the currently playing entry works - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - currentlyPlayingTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcRemoveFromScheduleTest_h - diff --git a/src/products/scheduler/src/RpcRescheduleTest.cxx b/src/products/scheduler/src/RpcRescheduleTest.cxx deleted file mode 100644 index 4fb255ecd..000000000 --- a/src/products/scheduler/src/RpcRescheduleTest.cxx +++ /dev/null @@ -1,290 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "SchedulerDaemon.h" -#include "LiveSupport/Core/TimeConversion.h" - -#include "RpcRescheduleTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcRescheduleTest); - -/** - * The name of the configuration file for the scheduler daemon. - */ -static const std::string configFileName = "etc/scheduler.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcRescheduleTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcRescheduleTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A simple smoke test. - *----------------------------------------------------------------------------*/ -void -RpcRescheduleTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // first schedule a playlist, so that there is something to reschedule - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpcValue::TypeString); - Ptr::Ref entryId(new UniqueId(std::string( - result["scheduleEntryId"] ))); - - // now reschedule it - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 8; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("reschedule", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - // now reschedule it unto itself, should fail - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 8; - time.tm_min = 30; - time.tm_sec = 0; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("reschedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A simple negative test. - *----------------------------------------------------------------------------*/ -void -RpcRescheduleTest :: negativeTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = "0000000000009999"; - - result.clear(); - xmlRpcClient.execute("removeFromSchedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A test to see if the currently playing entry can be rescheduled (should not) - *----------------------------------------------------------------------------*/ -void -RpcRescheduleTest :: currentlyPlayingTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - Ptr::Ref now; - struct tm time; - Ptr::Ref duration; - Ptr::Ref entryId; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // first schedule (upload) a playlist, for 10 seconds from now - now = TimeConversion::now(); - *now += seconds(10); - TimeConversion::ptimeToTm(now, time); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - CPPUNIT_ASSERT(result["scheduleEntryId"].getType() - == XmlRpcValue::TypeString); - entryId.reset(new UniqueId(std::string(result["scheduleEntryId"] ))); - - // wait 10 seconds, so that what we've scheduled is the currently playing - // entry - duration.reset(new time_duration(seconds(10))); - TimeConversion::sleep(duration); - - // now try to reschedule it, should faile - parameters["sessionId"] = sessionId->getId(); - parameters["scheduleEntryId"] = std::string(*entryId); - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 8; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("reschedule", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - diff --git a/src/products/scheduler/src/RpcRescheduleTest.h b/src/products/scheduler/src/RpcRescheduleTest.h deleted file mode 100644 index 4edc3c447..000000000 --- a/src/products/scheduler/src/RpcRescheduleTest.h +++ /dev/null @@ -1,130 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcRescheduleTest_h -#define RpcRescheduleTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the removeFromSchedule XML-RPC call. - * - * @see SchedulerDaemon - */ -class RpcRescheduleTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcRescheduleTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(negativeTest); - CPPUNIT_TEST(currentlyPlayingTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - protected: - - /** - * Simple smoke test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Simple negative test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - negativeTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to see if the currently playing entry can be reschuled - * (should not) - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - currentlyPlayingTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcRescheduleTest_h - diff --git a/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.cxx b/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.cxx deleted file mode 100644 index aea3a92c6..000000000 --- a/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.cxx +++ /dev/null @@ -1,237 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision$ - Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/branches/scheduler_export/livesupport/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.cxx $ - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "SchedulerDaemon.h" -#include "LiveSupport/Core/TimeConversion.h" - -#include "RpcStopCurrentlyPlayingTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcStopCurrentlyPlayingTest); - -/** - * The name of the configuration file for the scheduler daemon. - */ -static const std::string configFileName = "etc/scheduler.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcStopCurrentlyPlayingTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcStopCurrentlyPlayingTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A simple smoke test. - *----------------------------------------------------------------------------*/ -void -RpcStopCurrentlyPlayingTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - schedulePlaylistToPlayNow(); - - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - CPPUNIT_ASSERT(daemon); - Ptr::Ref audioPlayer = daemon->getAudioPlayer(); - CPPUNIT_ASSERT(audioPlayer); - - sleep(10); - CPPUNIT_ASSERT(audioPlayer->isOpen()); - CPPUNIT_ASSERT(audioPlayer->isPlaying()); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // first schedule a playlist, so that there is something to reschedule - CPPUNIT_ASSERT(sessionId); - parameters["sessionId"] = sessionId->getId(); - - result.clear(); - xmlRpcClient.execute("stopCurrentlyPlaying", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); - - CPPUNIT_ASSERT(!audioPlayer->isPlaying()); - CPPUNIT_ASSERT(!audioPlayer->isOpen()); -} - - -/*------------------------------------------------------------------------------ - * A simple negative test. - *----------------------------------------------------------------------------*/ -void -RpcStopCurrentlyPlayingTest :: negativeTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(sessionId); - parameters["sessionId"] = sessionId->getId(); - - result.clear(); - xmlRpcClient.execute("stopCurrentlyPlaying", parameters, result); - CPPUNIT_ASSERT(xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Schedule a playlist to play now. - *----------------------------------------------------------------------------*/ -void -RpcStopCurrentlyPlayingTest :: schedulePlaylistToPlayNow(void) - throw (CPPUNIT_NS::Exception) -{ - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // try to schedule playlist #1 for the time in 5 seconds - parameters.clear(); - CPPUNIT_ASSERT(sessionId); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - Ptr::Ref now = TimeConversion::now(); - Ptr::Ref startTime(new ptime(*now + seconds(10))); - TimeConversion::ptimeToTm(startTime, time); - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.h b/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.h deleted file mode 100644 index e179bfa73..000000000 --- a/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.h +++ /dev/null @@ -1,138 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision$ - Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/branches/scheduler_export/livesupport/src/products/scheduler/src/RpcStopCurrentlyPlayingTest.h $ - -------------------------------------------------------------------------------*/ -#ifndef RpcStopCurrentlyPlayingTest_h -#define RpcStopCurrentlyPlayingTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the removeFromSchedule XML-RPC call. - * - * @author $Author: fgerlits $ - * @version $Revision$ - * @see SchedulerDaemon - */ -class RpcStopCurrentlyPlayingTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcStopCurrentlyPlayingTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(negativeTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - /** - * Schedule a playlist, so we can stop it. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - schedulePlaylistToPlayNow(void) throw (CPPUNIT_NS::Exception); - - - protected: - - /** - * Simple smoke test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Simple negative test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - negativeTest(void) throw (CPPUNIT_NS::Exception); - - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcStopCurrentlyPlayingTest_h - diff --git a/src/products/scheduler/src/RpcUploadPlaylistTest.cxx b/src/products/scheduler/src/RpcUploadPlaylistTest.cxx deleted file mode 100644 index 55433b605..000000000 --- a/src/products/scheduler/src/RpcUploadPlaylistTest.cxx +++ /dev/null @@ -1,209 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#include -#include -#include - -#include "SchedulerDaemon.h" - -#include "RpcUploadPlaylistTest.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(RpcUploadPlaylistTest); - -/** - * The name of the configuration file for the scheduler daemon. - */ -static const std::string configFileName = "etc/scheduler.xml"; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -RpcUploadPlaylistTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - if (!daemon->isConfigured()) { - try { - Ptr::Ref parser(new xmlpp::DomParser( - configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - const xmlpp::Element * root = document->get_root_node(); - daemon->configure(*root); - } catch (std::invalid_argument &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - std::cerr << e.what() << std::endl; - CPPUNIT_FAIL("error parsing configuration file"); - } - } - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - CPPUNIT_ASSERT(xmlRpcClient.execute("resetStorage", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - parameters["login"] = "root"; - parameters["password"] = "q"; - CPPUNIT_ASSERT(xmlRpcClient.execute("login", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("sessionId")); - - xmlRpcClient.close(); - - sessionId.reset(new SessionId(std::string(result["sessionId"]))); -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -RpcUploadPlaylistTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - parameters["sessionId"] = sessionId->getId(); - CPPUNIT_ASSERT(xmlRpcClient.execute("logout", parameters, result)); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * Test a simple upload. - *----------------------------------------------------------------------------*/ -void -RpcUploadPlaylistTest :: simpleTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // try to schedule playlist #1 for the time below - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - - -/*------------------------------------------------------------------------------ - * A test to try to schedule something that would have to have - * been already initialized (thus, the start time is in the - * future, but the initialize time is already in the past.) - * see http://bugs.campware.org/view.php?id=757 - *----------------------------------------------------------------------------*/ -void -RpcUploadPlaylistTest :: postInitTest(void) - throw (CPPUNIT_NS::Exception) -{ - CPPUNIT_ASSERT(sessionId); - - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue result; - struct tm time; - - XmlRpc::XmlRpcClient xmlRpcClient(getXmlRpcHost().c_str(), - getXmlRpcPort(), - "/RPC2", - false); - - // first, get the scheduler time - result.clear(); - xmlRpcClient.execute("getSchedulerTime", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - CPPUNIT_ASSERT(result.hasMember("schedulerTime")); - time = result["schedulerTime"]; - - // try to schedule playlist #1 in 4 seconds from now - parameters.clear(); - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - // TODO: hopefully time conversion will handle seconds > 60 OK - time.tm_sec += 4; - parameters["playtime"] = &time; - - result.clear(); - xmlRpcClient.execute("uploadPlaylist", parameters, result); - CPPUNIT_ASSERT(!xmlRpcClient.isFault()); - - xmlRpcClient.close(); -} - diff --git a/src/products/scheduler/src/RpcUploadPlaylistTest.h b/src/products/scheduler/src/RpcUploadPlaylistTest.h deleted file mode 100644 index 425337ed3..000000000 --- a/src/products/scheduler/src/RpcUploadPlaylistTest.h +++ /dev/null @@ -1,123 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef RpcUploadPlaylistTest_h -#define RpcUploadPlaylistTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/SessionId.h" - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test to test the uploadPlaylist XML-RPC call. - * - * @see SchedulerDaemon - */ -class RpcUploadPlaylistTest : public BaseTestMethod -{ - CPPUNIT_TEST_SUITE(RpcUploadPlaylistTest); - CPPUNIT_TEST(simpleTest); - CPPUNIT_TEST(postInitTest); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - protected: - - /** - * Simple test for playlist uploading. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - simpleTest(void) throw (CPPUNIT_NS::Exception); - - /** - * A test to try to schedule something that would have to have - * been already initialized (thus, the start time is in the - * future, but the initialize time is already in the past.) - * see http://bugs.campware.org/view.php?id=757 - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - postInitTest(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // RpcUploadPlaylistTest_h - diff --git a/src/products/scheduler/src/ScheduleFactory.cxx b/src/products/scheduler/src/ScheduleFactory.cxx deleted file mode 100644 index 1bad1a32d..000000000 --- a/src/products/scheduler/src/ScheduleFactory.cxx +++ /dev/null @@ -1,109 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "PostgresqlSchedule.h" -#include "ScheduleFactory.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string ScheduleFactory::configElementNameStr = - "scheduleFactory"; - -/*------------------------------------------------------------------------------ - * The singleton instance of Scheduleactory - *----------------------------------------------------------------------------*/ -Ptr::Ref ScheduleFactory::singleton; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instance to ScheduleFactory - *----------------------------------------------------------------------------*/ -Ptr::Ref -ScheduleFactory :: getInstance(void) throw () -{ - if (!singleton.get()) { - singleton.reset(new ScheduleFactory()); - } - - return singleton; -} - - -/*------------------------------------------------------------------------------ - * Configure the schedule factory. - *----------------------------------------------------------------------------*/ -void -ScheduleFactory :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - schedule.reset(); - - Ptr::Ref cmf = - ConnectionManagerFactory::getInstance(); - Ptr::Ref cm = cmf->getConnectionManager(); - - // try to look for a PostgresqlSchedule configuration element - xmlpp::Node::NodeList nodes = - element.get_children(PostgresqlSchedule::getConfigElementName()); - if (nodes.size() >= 1) { - const xmlpp::Element * configElement = - dynamic_cast (*(nodes.begin())); - Ptr::Ref dbs(new PostgresqlSchedule(cm)); - dbs->configure(*configElement); - schedule = dbs; - } - - if (!schedule) { - throw std::invalid_argument("no storage client factories to configure"); - } -} diff --git a/src/products/scheduler/src/ScheduleFactory.h b/src/products/scheduler/src/ScheduleFactory.h deleted file mode 100644 index 64776ea91..000000000 --- a/src/products/scheduler/src/ScheduleFactory.h +++ /dev/null @@ -1,176 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ScheduleFactory_h -#define ScheduleFactory_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Core/Configurable.h" -#include "ScheduleInterface.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The factory to create appropriate Schedule objects. - * - * This object has to be configured with an element that contains - * the configuration element that the factory should build. - * Currently only PostgresqlSchedule is supported by this factory. - * - * An example configuration element is the following: - * - *

- *      <scheduleFactory>
- *          <postgresqlSchedule/>
- *      </scheduleFactory>
- *  
- * - * The DTD for the above element is: - * - *

- *  <!ELEMENT scheduleFactory (postgresqlSchedule) >
- *  
- * - * For details on the <postgreslSchedule> element, see the - * PostgresqlSchedule documentation. - * - * @see PostgresqlSchedule - */ -class ScheduleFactory : virtual public Configurable -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The singleton instance of this object. - */ - static Ptr::Ref singleton; - - /** - * The schedule created by this factory. - */ - Ptr::Ref schedule; - - /** - * The default constructor. - */ - ScheduleFactory(void) throw() - { - } - - - public: - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~ScheduleFactory(void) throw () - { - } - - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Returns the singleton instance of this object. - * - * @return the singleton instance of this object. - */ - static Ptr::Ref - getInstance() throw (); - - /** - * Configure the object based on the XML element supplied. - * - * @param element the XML element to configure the object from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the object has already - * been configured, and can not be reconfigured. - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Return a schedule. - * - * @return the appropriate schedule, according to the - * configuration of this factory. - */ - Ptr::Ref - getSchedule(void) throw () - { - return schedule; - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Storage -} // namespace LiveSupport - -#endif // ScheduleFactory_h - diff --git a/src/products/scheduler/src/ScheduleInterface.h b/src/products/scheduler/src/ScheduleInterface.h deleted file mode 100644 index 5089cf13c..000000000 --- a/src/products/scheduler/src/ScheduleInterface.h +++ /dev/null @@ -1,257 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef ScheduleInterface_h -#define ScheduleInterface_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Playlist.h" -#include "LiveSupport/Core/ScheduleEntry.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; - - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * The generic interface for the component scheduling events. - * - */ -class ScheduleInterface -{ - public: - /** - * A vector of ScheduleEntry objects. - */ - typedef std::vector::Ref> ScheduleEntryList; - - - /** - * Check if a timeframe is available for scheduling. - * - * @param from the start time of the timeframe. - * @param to the end time of the timeframe. - * @return true if the timeframe is available, false otherwise. - */ - virtual bool - isTimeframeAvailable(Ptr::Ref from, - Ptr::Ref to) throw () - = 0; - - /** - * Schedule a playlist. - * - * @param playlist the playlist to schedule. - * @param playtime the time to schedule the playlist for. - * @return the id of the newly created playlist. - * @exception std::invalid_argument if there is something - * already scheduled for the duration of the playlist. - */ - virtual Ptr::Ref - schedulePlaylist(Ptr::Ref playlist, - Ptr::Ref playtime) - throw (std::invalid_argument) - = 0; - - /** - * Return the list of scheduled entries for a specified time interval. - * It returns all entries which intersect the interval (i.e., start - * before toTime, and end later than fromTime). - * - * @param fromTime the start of the time of the interval queried - * @param toTime to end of the time of the interval queried - * @return a vector of the scheduled entries for the time region. - */ - virtual Ptr::Ref - getScheduleEntries(Ptr::Ref fromTime, - Ptr::Ref toTime) - throw () - = 0; - - /** - * Export schedule entries to a DOM tree. - * - * @param element a new DOM element will be added as a child to - * this element, which will contain the export. - * @param fromTime entries are included in the export starting - * from this time. - * @param toTime entries as included in the export up to - * but not including this time. - * @return a DOM element, which is the export. - * it is the responsibility of the caller to free up the - * returned element. - * @see #importScheduleEntries - */ - virtual void - exportScheduleEntries(xmlpp::Element * element, - Ptr::Ref fromTime, - Ptr::Ref toTime) - throw () = 0; - - /** - * Import schedule entries from a DOM tree. - * - * @param domTree the DOM tree containing schedule entries, to import. - * @exception std::invalid_argument if the supplied DOM tree - * is not valid. - * @see #exportScheduleEntries - */ - virtual void - importScheduleEntries(const xmlpp::Element * domTree) - throw (std::invalid_argument) - = 0; - - /** - * Return the schedule entry that is being played at the moment. - * - * @return the schedule entry that is being played at the monent, - * or a reference to null, if nothing is playing currently. - */ - virtual Ptr::Ref - getCurrentlyPlaying(void) throw () - = 0; - - /** - * Return the next schedule entry, after (but not including) - * the specified timepoint. - * - * @param fromTime the start of the time of the interval queried, - * inclusive - * @return the first schedule entry, after the specified timepoint. - */ - virtual Ptr::Ref - getNextEntry(Ptr::Ref fromTime) - throw () - = 0; - - /** - * Return the current schedule entry. - * - * - * @param - * - * @return the current schedule entry - */ - virtual Ptr::Ref - getCurrentEntry() - throw () - = 0; - - /** - * Tell if a schedule entry exists by the give name. - * - * @param entryId the id of the schedule entry to check for. - * @return true if the schedule entry exists in the Schedule, - * false otherwise. - */ - virtual bool - scheduleEntryExists(Ptr::Ref entryId) - throw () - = 0; - - /** - * Remove a schedule entry from the schedule. - * - * @param entryId the id of the schedule to remove. - * @exception std::invalid_argument if no schedule with the specified - * id exists. - */ - virtual void - removeFromSchedule(Ptr::Ref entryId) - throw (std::invalid_argument) - = 0; - - /** - * Return a schedule entry for a specified id. - * - * @param entryId the id of the entry to get. - * @return the ScheduleEntry for the specified id. - * @exception std::invalid_argument if no entry by the specified - * id exists. - */ - virtual Ptr::Ref - getScheduleEntry(Ptr::Ref entryId) - throw (std::invalid_argument) - = 0; - - /** - * Reschedule an event to a different time. - * - * @param entryId the id of the entry to reschedule. - * @param playtime the new time for the schedule. - * @exception std::invalid_argument if there is something already - * scheduled for the new duration. - */ - virtual void - reschedule(Ptr::Ref entryId, - Ptr::Ref playtime) - throw (std::invalid_argument) - = 0; - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~ScheduleInterface(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // ScheduleInterface_h - diff --git a/src/products/scheduler/src/SchedulerDaemon.cxx b/src/products/scheduler/src/SchedulerDaemon.cxx deleted file mode 100644 index ecce5e6fd..000000000 --- a/src/products/scheduler/src/SchedulerDaemon.cxx +++ /dev/null @@ -1,365 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_SIGNAL_H -#include -#else -#error "Need signal.h" -#endif - -#if HAVE_SYS_STAT_H -#include -#else -#error "Need sys/stat.h" -#endif - - -#include -#include -#include -#include - -#include - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerFactory.h" -#include "ScheduleFactory.h" -#include "PlayLogFactory.h" -#include "BackupFactory.h" -#include "PlaylistEventContainer.h" - -#include "SchedulerDaemon.h" - -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * The singleton instance of the Scheduler daemon object. - */ -Ptr::Ref SchedulerDaemon::schedulerDaemon; - -namespace { - -/** - * The name of the XML configuration element for the Scheduler daemon. - */ -const std::string confElement = "scheduler"; - -/** - * The name of the XML configuration element for the XmlRpcDaemon inside. - */ -const std::string xmlRpcDaemonConfElement = "xmlRpcDaemon"; - -/** - * The name of the config child element for the login and password - */ -const std::string userConfigElementName = "user"; - -/** - * The name of the config element attribute for the login - */ -const std::string userLoginAttrName = "login"; - -/** - * The name of the config element attribute for the password - */ -const std::string userPasswordAttrName = "password"; - -} - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * The default constructor. - *----------------------------------------------------------------------------*/ -SchedulerDaemon :: SchedulerDaemon (void) throw () - : XmlRpcDaemon() -{ - displayScheduleMethod.reset(new DisplayScheduleMethod()); - generatePlayReportMethod.reset(new GeneratePlayReportMethod()); - getSchedulerTimeMethod.reset(new GetSchedulerTimeMethod()); - getVersionMethod.reset(new GetVersionMethod()); - removeFromScheduleMethod.reset(new RemoveFromScheduleMethod()); - rescheduleMethod.reset(new RescheduleMethod()); - uploadPlaylistMethod.reset(new UploadPlaylistMethod()); - loginMethod.reset(new LoginMethod()); - logoutMethod.reset(new LogoutMethod()); - resetStorageMethod.reset(new ResetStorageMethod()); - createBackupOpenMethod.reset(new CreateBackupOpenMethod()); - createBackupCheckMethod.reset(new CreateBackupCheckMethod()); - createBackupCloseMethod.reset(new CreateBackupCloseMethod()); - restoreBackupMethod.reset(new RestoreBackupMethod()); - stopCurrentlyPlayingMethod.reset(new StopCurrentlyPlayingMethod()); -} - - -/*------------------------------------------------------------------------------ - * Return the singleton instnace. - *----------------------------------------------------------------------------*/ -Ptr::Ref -SchedulerDaemon :: getInstance (void) throw () -{ - if (!schedulerDaemon) { - schedulerDaemon.reset(new SchedulerDaemon()); - } - - return schedulerDaemon; -} - - -/*------------------------------------------------------------------------------ - * Configure the scheduler daemon - *----------------------------------------------------------------------------*/ -void -SchedulerDaemon :: configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (element.get_name() != confElement) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - xmlpp::Node::NodeList nodes; - const xmlpp::Element * elem = 0; - const xmlpp::Attribute * attribute = 0; - - // read in the user data - - nodes = element.get_children(userConfigElementName); - if (nodes.size() < 1) { - throw std::invalid_argument("no user element"); - } - elem = dynamic_cast (*nodes.begin()); - if (!(attribute = elem->get_attribute(userLoginAttrName))) { - throw std::invalid_argument("missing login attribute"); - } - login = attribute->get_value(); - if (!(attribute = elem->get_attribute(userPasswordAttrName))) { - throw std::invalid_argument("missing password attribute"); - } - password = attribute->get_value(); - - // configure the ConnectionManagerFactory - nodes = - element.get_children(ConnectionManagerFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no connectionManagerFactory element"); - } - Ptr::Ref cmf - = ConnectionManagerFactory::getInstance(); - cmf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the AuthenticationClientFactory - nodes = - element.get_children(AuthenticationClientFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no authenticationClientFactory element"); - } - Ptr::Ref acf - = AuthenticationClientFactory::getInstance(); - acf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the StorageClientFactory - nodes = element.get_children(StorageClientFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no storageClientFactory element"); - } - Ptr::Ref scf = StorageClientFactory::getInstance(); - scf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the AudioPlayerFactory - nodes = element.get_children(AudioPlayerFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no audioPlayer element"); - } - Ptr::Ref apf = AudioPlayerFactory::getInstance(); - apf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the ScheduleFactory - nodes = element.get_children(ScheduleFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no scheduleFactory element"); - } - Ptr::Ref sf = ScheduleFactory::getInstance(); - sf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the PlayLogFactory - nodes = element.get_children(PlayLogFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no playLogFactory element"); - } - Ptr::Ref plf = PlayLogFactory::getInstance(); - plf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the BackupFactory - nodes = element.get_children(BackupFactory::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no backupFactory element"); - } - Ptr::Ref bf = BackupFactory::getInstance(); - bf->configure( *((const xmlpp::Element*) *(nodes.begin())) ); - - // configure the XmlRpcDaemon - nodes = element.get_children(XmlRpcDaemon::getConfigElementName()); - if (nodes.size() < 1) { - throw std::invalid_argument("no xmlRpcDaemon element"); - } - configureXmlRpcDaemon( *((const xmlpp::Element*) *(nodes.begin())) ); - - // do some initialization, using the configured objects - authentication = acf->getAuthenticationClient(); - connectionManager = cmf->getConnectionManager(); - storage = scf->getStorageClient(); - audioPlayer = apf->getAudioPlayer(); - schedule = sf->getSchedule(); - playLog = plf->getPlayLog(); -} - - -/*------------------------------------------------------------------------------ - * Destructor. - *----------------------------------------------------------------------------*/ -SchedulerDaemon :: ~SchedulerDaemon(void) throw () -{ - if (authentication.get() && sessionId.get()) { - authentication->logout(sessionId); - } -} - - -/*------------------------------------------------------------------------------ - * Register our XML-RPC methods - *----------------------------------------------------------------------------*/ -void -SchedulerDaemon :: registerXmlRpcFunctions( - Ptr::Ref xmlRpcServer) - throw (std::logic_error) -{ - xmlRpcServer->addMethod(displayScheduleMethod.get()); - xmlRpcServer->addMethod(generatePlayReportMethod.get()); - xmlRpcServer->addMethod(getSchedulerTimeMethod.get()); - xmlRpcServer->addMethod(getVersionMethod.get()); - xmlRpcServer->addMethod(removeFromScheduleMethod.get()); - xmlRpcServer->addMethod(rescheduleMethod.get()); - xmlRpcServer->addMethod(uploadPlaylistMethod.get()); - xmlRpcServer->addMethod(loginMethod.get()); - xmlRpcServer->addMethod(logoutMethod.get()); - xmlRpcServer->addMethod(resetStorageMethod.get()); - xmlRpcServer->addMethod(createBackupOpenMethod.get()); - xmlRpcServer->addMethod(createBackupCheckMethod.get()); - xmlRpcServer->addMethod(createBackupCloseMethod.get()); - xmlRpcServer->addMethod(restoreBackupMethod.get()); - xmlRpcServer->addMethod(stopCurrentlyPlayingMethod.get()); -} - - -/*------------------------------------------------------------------------------ - * Execute daemon startup functions. - *----------------------------------------------------------------------------*/ -void -SchedulerDaemon :: startup (void) throw (std::logic_error) -{ - try { - sessionId = authentication->login(login, password); - } catch (XmlRpcException &e) { - throw std::logic_error(std::string("authentication problem: ") - + e.what()); - } - - try { - audioPlayer->initialize(); - } catch (std::exception &e) { - throw std::logic_error(std::string("audio player initialization " - "problem: ") + e.what()); - } - if (!eventScheduler.get()) { - Ptr::Ref eventContainer; - Ptr::Ref granularity; - eventContainer.reset(new PlaylistEventContainer(sessionId, - storage, - schedule, - audioPlayer, - playLog)); - // TODO: read granularity from config file - granularity.reset(new time_duration(seconds(1))); - - eventScheduler.reset( - new LiveSupport::EventScheduler::EventScheduler(eventContainer, - granularity)); - } - eventScheduler->start(); - - XmlRpcDaemon::startup(); -} - - -/*------------------------------------------------------------------------------ - * Shut down the daemon - *----------------------------------------------------------------------------*/ -void -SchedulerDaemon :: shutdown(void) throw (std::logic_error) -{ - if (eventScheduler.get()) { - eventScheduler->stop(); - } - audioPlayer->deInitialize(); - - XmlRpcDaemon::shutdown(); -} - - -/*------------------------------------------------------------------------------ - * Re-read the events from the event container. - *----------------------------------------------------------------------------*/ -void -SchedulerDaemon :: update (void) throw (std::logic_error) -{ - // TODO: check if we've been configured - if (eventScheduler.get()) { - eventScheduler->update(); - } -} - diff --git a/src/products/scheduler/src/SchedulerDaemon.h b/src/products/scheduler/src/SchedulerDaemon.h deleted file mode 100644 index 128565cab..000000000 --- a/src/products/scheduler/src/SchedulerDaemon.h +++ /dev/null @@ -1,465 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SchedulerDaemon_h -#define SchedulerDaemon_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_SYS_TYPES_H -#include -#else -#error "Need sys/types.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/Configurable.h" -#include "LiveSupport/Core/SessionId.h" -#include "LiveSupport/Db/ConnectionManagerInterface.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "LiveSupport/EventScheduler/EventScheduler.h" -#include "PlayLogInterface.h" - -#include "DisplayScheduleMethod.h" -#include "GeneratePlayReportMethod.h" -#include "GetSchedulerTimeMethod.h" -#include "GetVersionMethod.h" -#include "RemoveFromScheduleMethod.h" -#include "RescheduleMethod.h" -#include "ScheduleInterface.h" -#include "UploadPlaylistMethod.h" -#include "XmlRpcDaemon.h" -#include "LoginMethod.h" -#include "LogoutMethod.h" -#include "ResetStorageMethod.h" -#include "CreateBackupOpenMethod.h" -#include "CreateBackupCheckMethod.h" -#include "CreateBackupCloseMethod.h" -#include "RestoreBackupMethod.h" -#include "StopCurrentlyPlayingMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::PlaylistExecutor; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Scheduler daemon main class. - * This class is responsible for starting, running and stopping the - * Scheduler daemon. - * - * The SchedulerDaemon has to configured by an XML element called - * scheduler. This element contains configuration elements for the - * compontents used by the scheduler. The configuration file looks - * like the following: - * - *

- *  <scheduler>
- *      <user login="userid" password="pwd" />
- *      <connectionManagerFactory>
- *          ...
- *      </connectionManagerFactory>
- *      <authenticationClientFactory>
- *          ...
- *      </authenticationClientFactory>
- *      <storageClientFactory>
- *          ...
- *      </storageClientFactory>
- *      <scheduleFactory>
- *          ...
- *      </scheduleFactory>
- *      <playLogFactory>
- *          ...
- *      </playLogFactory>
- *      <backupFactory>
- *          ...
- *      </backupFactory>
- *      <xmlRpcDaemon>
- *          ...
- *      </xmlRpcDaemon>
- *  </scheduler>
- *  
- * - * The user element holds creditentials for accessing the storage, - * configured below. - * - * For details on the included elements, see the corresponding documentation - * for XmlRpcDaemon, StorageClientFactory, ConnectionManagerFactory - * ScheduleFactory and AuthenticationClientFactory. - * - * The DTD for the above element is the following: - * - *

- *  <!ELEMENT scheduler (user,
- *                       connectionManagerFactory,
- *                       authenticationClientFactory,
- *                       storageClientFactory,
- *                       scheduleFactory,
- *                       playLogFactory,
- *                       backupFactory,
- *                       audioPlayer,
- *                       xmlRpcDaemon) >
- *  
- * - * @see ConnectionManagerFactory - * @see AuthenticationClientFactory - * @see StorageClientFactory - * @see ScheduleFactory - * @see XmlRpcDaemon - */ -class SchedulerDaemon : public Configurable, - public XmlRpcDaemon -{ - private: - - /** - * A SQL statement to check if the database can be accessed. - */ - static const std::string check1Stmt; - - /** - * The singleton instance of the scheduler daemon. - */ - static Ptr::Ref schedulerDaemon; - - /** - * The authentication client. - */ - Ptr::Ref authentication; - - /** - * The connection manager used by the scheduler. - */ - Ptr::Ref connectionManager; - - /** - * The storage client. - */ - Ptr::Ref storage; - - /** - * The schedule used by the scheduler daemon. - */ - Ptr::Ref schedule; - - /** - * The session id for the scheduler user. - */ - Ptr::Ref sessionId; - - /** - * The event scheduler. - */ - Ptr::Ref - eventScheduler; - - /** - * The audio player. - */ - Ptr::Ref audioPlayer; - - /** - * The play logging facility. - */ - Ptr::Ref playLog; - - /** - * The displayScheduleMethod the daemon is providing. - */ - Ptr::Ref displayScheduleMethod; - - /** - * The generatePlayReportMethod the daemon is providing. - */ - Ptr::Ref generatePlayReportMethod; - - /** - * The getSchedulerTimeMethod the daemon is providing. - */ - Ptr::Ref getSchedulerTimeMethod; - - /** - * The getVersion the daemon is providing. - */ - Ptr::Ref getVersionMethod; - - /** - * The removeFromScheduleMethod the daemon is providing. - */ - Ptr::Ref removeFromScheduleMethod; - - /** - * The rescheduleMethod the daemon is providing. - */ - Ptr::Ref rescheduleMethod; - - /** - * The uploadPlaylistMethod the daemon is providing. - */ - Ptr::Ref uploadPlaylistMethod; - - /** - * The loginMethod the daemon is providing. - */ - Ptr::Ref loginMethod; - - /** - * The logoutMethod the daemon is providing. - */ - Ptr::Ref logoutMethod; - - /** - * The resetStorageMethod the daemon is providing. - */ - Ptr::Ref resetStorageMethod; - - /** - * The createBackupOpenMethod the daemon is providing. - */ - Ptr::Ref createBackupOpenMethod; - - /** - * The createBackupCheckMethod the daemon is providing. - */ - Ptr::Ref createBackupCheckMethod; - - /** - * The createBackupCloseMethod the daemon is providing. - */ - Ptr::Ref createBackupCloseMethod; - - /** - * The restoreBackupMethod the daemon is providing. - */ - Ptr::Ref restoreBackupMethod; - - /** - * The stopCurrentlyPlayingMethod the daemon is providing. - */ - Ptr::Ref stopCurrentlyPlayingMethod; - - /** - * The login to the authentication system. - */ - std::string login; - - /** - * The password to the authentication system. - */ - std::string password; - - /** - * Default constructor. - */ - SchedulerDaemon (void) throw (); - - - protected: - - /** - * Register your XML-RPC functions by implementing this function. - */ - virtual void - registerXmlRpcFunctions(Ptr::Ref xmlRpcServer) - throw (std::logic_error); - - /** - * Execute any calls when the daemon is starting up. - * All resources allocated here should be freed up in shutdown(). - * - * @exception std::logic_error if startup could not succeed. - * @see #shutdown - */ - virtual void - startup (void) throw (std::logic_error); - - - public: - - /** - * Virtual destructor. - */ - virtual - ~SchedulerDaemon(void) throw (); - - /** - * Return a pointer to the singleton instance of SchedulerDaemon. - * - * @return a pointer to the singleton instance of SchedulerDaemon - */ - static Ptr::Ref - getInstance (void) throw (); - - /** - * Configure the scheduler daemon based on the XML element - * supplied. - * - * @param element the XML element to configure the scheduler - * daemon from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the scheduler daemon has already - * been configured. - */ - void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - /** - * Return the connection manager used by the scheduler. - * - * @return the connection manager used by the scheduler. - */ - Ptr::Ref - getConnectionManager(void) throw () - { - return connectionManager; - } - - /** - * Return the storage client used by the scheduler. - * - * @return the storage client used by the scheduler. - */ - Ptr::Ref - getStorage(void) throw () - { - return storage; - } - - /** - * Return the authentication client used by the scheduler. - * - * @return the authentication client used by the scheduler. - */ - Ptr::Ref - getAuthentication(void) throw () - { - return authentication; - } - - /** - * Return the schedule used by the scheduler. - * - * @return the schedule used by the scheduler. - */ - Ptr::Ref - getSchedule(void) throw () - { - return schedule; - } - - /** - * Return the play log used by the scheduler. - * - * @return the play log used by the scheduler. - */ - Ptr::Ref - getPlayLog(void) throw () - { - return playLog; - } - - /** - * Return the audio player used by the scheduler. - * - * @return the audio player used by the scheduler. - */ - Ptr::Ref - getAudioPlayer(void) throw () - { - return audioPlayer; - } - - /** - * Shut down the daemon. - * This function is public only because the signal handler - * needs visibility to this function, which will call it. - * A call to stop() will trigger a signal that will call shutdown(). - * - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - virtual void - shutdown (void) throw (std::logic_error); - - /** - * Re-read the scheduled events. - * Call this when the events in the schedule under the event container - * have changed. - * - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - virtual void - update(void) throw (std::logic_error); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // SchedulerDaemon_h - diff --git a/src/products/scheduler/src/SchedulerDaemonTest.cxx b/src/products/scheduler/src/SchedulerDaemonTest.cxx deleted file mode 100644 index 72b774fd4..000000000 --- a/src/products/scheduler/src/SchedulerDaemonTest.cxx +++ /dev/null @@ -1,129 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include - -#include "SchedulerDaemon.h" -#include "SchedulerDaemonTest.h" - - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(SchedulerDaemonTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -SchedulerDaemonTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - try { - Ptr::Ref storage = daemon->getStorage(); - storage->reset(); - - } catch (std::invalid_argument &e) { - CPPUNIT_FAIL("semantic error in configuration file"); - } catch (xmlpp::exception &e) { - CPPUNIT_FAIL("error parsing configuration file"); - } catch (std::exception &e) { - CPPUNIT_FAIL(e.what()); - } - - authentication = daemon->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::string eMsg = "could not log in:\n"; - eMsg += e.what(); - CPPUNIT_FAIL(eMsg); - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -SchedulerDaemonTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Test to see if the singleton Hello object is accessible - *----------------------------------------------------------------------------*/ -void -SchedulerDaemonTest :: getSingleton(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT( daemon.get() ); -} - - -/*------------------------------------------------------------------------------ - * Test to see if the scheduler starts and stops OK - *----------------------------------------------------------------------------*/ -void -SchedulerDaemonTest :: testStartStop(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - CPPUNIT_ASSERT( daemon.get() ); - CPPUNIT_ASSERT( !(daemon->isRunning()) ); - daemon->start(); - sleep(3); - CPPUNIT_ASSERT( daemon->isRunning() ); - daemon->stop(); - sleep(3); - CPPUNIT_ASSERT( !(daemon->isRunning()) ); -} - diff --git a/src/products/scheduler/src/SchedulerDaemonTest.h b/src/products/scheduler/src/SchedulerDaemonTest.h deleted file mode 100644 index 00f1e2578..000000000 --- a/src/products/scheduler/src/SchedulerDaemonTest.h +++ /dev/null @@ -1,123 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SchedulerDaemonTest_h -#define SchedulerDaemonTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the SchedulerDaemon class. - * - * @see SchedulerDaemon - */ -class SchedulerDaemonTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(SchedulerDaemonTest); - CPPUNIT_TEST(getSingleton); - //CPPUNIT_TEST(testStartStop); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The authentication client produced by the factory. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - - protected: - - /** - * A simple test to see if the singleton Hello object is accessible. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - getSingleton(void) throw (CPPUNIT_NS::Exception); - - /** - * Test to see if the daemon starts an stops OK. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - testStartStop(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // SchedulerDaemonTest_h - diff --git a/src/products/scheduler/src/SignalDispatcher.cxx b/src/products/scheduler/src/SignalDispatcher.cxx deleted file mode 100644 index 181ff4105..000000000 --- a/src/products/scheduler/src/SignalDispatcher.cxx +++ /dev/null @@ -1,137 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_SIGNAL_H -#include -#else -#error "Need signal.h" -#endif - -#if HAVE_SYS_STAT_H -#include -#else -#error "Need sys/stat.h" -#endif - - -#include -#include -#include -#include - -#include "SignalDispatcher.h" - - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The singleton isntnace of SignalDispatcher. - *----------------------------------------------------------------------------*/ -SignalDispatcher * SignalDispatcher::instance = 0; - -/*------------------------------------------------------------------------------ - * The signal handlers. - *----------------------------------------------------------------------------*/ -SignalHandler * SignalDispatcher::handlers[NSIG]; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Return the singleton instnace. - *----------------------------------------------------------------------------*/ -class SignalDispatcher * -SignalDispatcher :: getInstance (void) throw () -{ - if (!instance) { - instance = new SignalDispatcher(); - } - - return instance; -} - - -/*------------------------------------------------------------------------------ - * Register a signal handler - *----------------------------------------------------------------------------*/ -void -SignalDispatcher :: registerHandler( - int signal, - SignalHandler * signalHandler) - throw (std::invalid_argument) -{ - if (signal < 0 || signal >= NSIG) { - throw std::invalid_argument("invalid signal value"); - } - if (!signalHandler) { - throw std::invalid_argument("signalHandler is 0"); - } - - handlers[signal] = signalHandler; - - // register our dispatcher for this signal - ::signal(signal, dispatcher); -} - - -/*------------------------------------------------------------------------------ - * Remove a signal handler - *----------------------------------------------------------------------------*/ -void -SignalDispatcher :: removeHandler( - int signal) - throw (std::invalid_argument) -{ - if (signal < 0 || signal >= NSIG) { - throw std::invalid_argument("invalid signal value"); - } - - handlers[signal] = 0; - - ::signal(signal, SIG_DFL); -} - - -/*------------------------------------------------------------------------------ - * Our signal dispatcher - *----------------------------------------------------------------------------*/ -void -SignalDispatcher :: dispatcher(int signal) throw () -{ - handlers[signal]->handleSignal(signal); -} - diff --git a/src/products/scheduler/src/SignalDispatcher.h b/src/products/scheduler/src/SignalDispatcher.h deleted file mode 100644 index 47ac70efd..000000000 --- a/src/products/scheduler/src/SignalDispatcher.h +++ /dev/null @@ -1,140 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SignalDispatcher_h -#define SignalDispatcher_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_SIGNAL_H -#include -#else -#error "Need signal.h" -#endif - -#include -#include - -#include "SignalHandler.h" - - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A class to dispatch signals. - * See http://www.cs.wustl.edu/~schmidt/signal-patterns.html for details. - * - */ -class SignalDispatcher -{ - private: - - /** - * The singleton instance of this class. - */ - static SignalDispatcher * instance; - - /** - * An array of registered signal handlers, - * of size NSIG defined in signal.h - */ - static SignalHandler * handlers[NSIG]; - - /** - * Default constructor. - */ - SignalDispatcher(void) throw () - { - } - - /** - * The function registered to handle signals. - * - * @param signal the signal being handled. - */ - static void - dispatcher(int signal) throw (); - - public: - - /** - * Return the singleton instance of SignalDispatcher. - * - * @return the singleton instance of SignalDispatcher. - */ - static SignalDispatcher * - getInstance(void) throw (); - - /** - * Register a signal handler for a specific signal. - * - * @param signal the signal to register for. - * @param signalHandler the signal handler to register. - * @exception std::invalid_argument if signal is out of range, - * or if signalHandler is 0. - */ - void - registerHandler(int signal, - SignalHandler * signalHandler) - throw (std::invalid_argument); - - /** - * Remove a signal handler for a specific signal. - * Restores the original system signal handling. - * - * @param signal the signal to remove the handler for. - * @exception std::invalid_argument if signal is out of range. - */ - void - removeHandler(int signal) throw (std::invalid_argument); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // SignalDispatcher_h - diff --git a/src/products/scheduler/src/SignalHandler.h b/src/products/scheduler/src/SignalHandler.h deleted file mode 100644 index 9fbda2601..000000000 --- a/src/products/scheduler/src/SignalHandler.h +++ /dev/null @@ -1,87 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef SignalHandler_h -#define SignalHandler_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A class to handle a signal. - * Register subclasses of this class at SignalDispatcher. - * See http://www.cs.wustl.edu/~schmidt/signal-patterns.html for details. - * - * @see SignalDispatcher - */ -class SignalHandler -{ - public: - /** - * Handle the signal. - * - * @param signal the actual signal received. - */ - virtual void - handleSignal(int signal) throw () = 0; - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~SignalHandler(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // SignalHandler_h - diff --git a/src/products/scheduler/src/StopCurrentlyPlayingMethod.cxx b/src/products/scheduler/src/StopCurrentlyPlayingMethod.cxx deleted file mode 100644 index b38ef4a29..000000000 --- a/src/products/scheduler/src/StopCurrentlyPlayingMethod.cxx +++ /dev/null @@ -1,151 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision$ - Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/src/products/scheduler/src/StopCurrentlyPlayingMethod.cxx $ - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include -#include - -#include "LiveSupport/PlaylistExecutor/AudioPlayerInterface.h" -#include "LiveSupport/Core/XmlRpcTools.h" -#include "SchedulerDaemon.h" -#include "ScheduleInterface.h" -#include "ScheduleFactory.h" - -#include "StopCurrentlyPlayingMethod.h" - - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string StopCurrentlyPlayingMethod::methodName - = "stopCurrentlyPlaying"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int StopCurrentlyPlayingMethod::errorId = 5000; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -StopCurrentlyPlayingMethod :: StopCurrentlyPlayingMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the remove from schedule XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -StopCurrentlyPlayingMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, - "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - // TODO: check the session ID - - Ptr::Ref sd = SchedulerDaemon::getInstance(); - Ptr::Ref sf = ScheduleFactory::getInstance(); - Ptr::Ref schedule = sf->getSchedule(); - Ptr::Ref currentlyPlaying; - - // remove the item from the schedule, so something else can be scheduled - try { - currentlyPlaying = schedule->getCurrentlyPlaying(); - if (currentlyPlaying) { - schedule->removeFromSchedule(currentlyPlaying->getId()); - - // tell the scheduler daemon to reload the scheduled events - sd->update(); - } - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "schedule entry not found", - returnValue); - return; - } - - // stop the audio player - Ptr::Ref audioPlayer = sd->getAudioPlayer(); - - try { - audioPlayer->stop(); - audioPlayer->close(); - - } catch (std::logic_error &e) { - XmlRpcTools::markError(errorId+10, e.what(), returnValue); - return; - } -} - diff --git a/src/products/scheduler/src/StopCurrentlyPlayingMethod.h b/src/products/scheduler/src/StopCurrentlyPlayingMethod.h deleted file mode 100644 index e9226bd09..000000000 --- a/src/products/scheduler/src/StopCurrentlyPlayingMethod.h +++ /dev/null @@ -1,150 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - To report bugs, send an e-mail to bugs@campware.org - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - Author : $Author: fgerlits $ - Version : $Revision$ - Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/src/products/scheduler/src/StopCurrentlyPlayingMethod.h $ - -------------------------------------------------------------------------------*/ -#ifndef StopCurrentlyPlayingMethod_h -#define StopCurrentlyPlayingMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to stop the scheduler's audio player. - * - * The name of the method when called through XML-RPC is - * "stopCurrentlyPlaying". - * - * Stops the audio player, and removes the current item from the schedule, - * so that something else can be scheduled in its place. - * - * The expected parameter is an XML-RPC structure, with the following - * member: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 5001 - invalid argument format
  • - *
  • 5010 - error reported by the audio player component
  • - *
  • 5020 - missing session ID argument
  • - *
- * - * @author $Author: fgerlits $ - * @version $Revision$ - */ -class StopCurrentlyPlayingMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - StopCurrentlyPlayingMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - StopCurrentlyPlayingMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the remove from schedule command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute(XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // StopCurrentlyPlayingMethod_h - diff --git a/src/products/scheduler/src/TestRunner.cxx b/src/products/scheduler/src/TestRunner.cxx deleted file mode 100644 index 6643be741..000000000 --- a/src/products/scheduler/src/TestRunner.cxx +++ /dev/null @@ -1,304 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "BaseTestMethod.h" - - -using namespace LiveSupport::Core; -using namespace LiveSupport::Scheduler; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * Our copyright notice, should be at most 80 columns - */ -static const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -static const char options[] = "c:ho:s:v"; - -/** - * Structure describing the long options - */ -static const struct option longOptions[] = { - { "config", required_argument, 0, 'c' }, - { "help", no_argument, 0, 'h' }, - { "output", required_argument, 0, 'o' }, - { "stylesheet", required_argument, 0, 's' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } -}; - -/** - * The encoding to use for the output file. - */ -static const std::string encoding = "utf-8"; - -/** - * The name of the scheduler config file to use. - */ -static Ptr::Ref configFileName; - -/** - * The output XML file name. - */ -static Ptr::Ref xmlOutFileName; - -/** - * The XSLT attached to the output file. - */ -static Ptr::Ref xsltFileName; - - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -static void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -static void -printUsage ( const char invocation[], - std::ostream & os ); - -/** - * Process command line arguments. - * - * @param argc the number of arguments. - * @param argv the arguments themselves. - * @return true of all went well, false in case the program should exit - * after this call. - */ -static bool -processArguments(int argc, char *argv[]); - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Run all tests - *----------------------------------------------------------------------------*/ -int -main( int argc, - char * argv[] ) throw () -{ - if (!processArguments(argc, argv)) { - return 0; - } - - // Configure the test methods via their shared base class - try { - LiveSupport::Scheduler::BaseTestMethod::configure(*configFileName); - } catch (std::exception &e) { - std::cerr << "configuration error: " << e.what() << std::endl; - return 1; - } - - // Create the event manager and test controller - CPPUNIT_NS::TestResult controller; - - // Add a listener that colllects test result - CPPUNIT_NS::TestResultCollector result; - controller.addListener( &result ); - - // Add a listener that print dots as test run. - CPPUNIT_NS::BriefTestProgressListener progress; - controller.addListener( &progress ); - - // Add the top suite to the test runner - CPPUNIT_NS::TestRunner runner; - runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); - runner.run( controller ); - - // Print test in a compiler compatible format. - CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr ); - outputter.setLocationFormat("%p:%l:"); - outputter.write(); - - // also generate an XML document as an output - std::ofstream xmlOutFile(xmlOutFileName->c_str()); - CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); - xmlOutputter.setStandalone(false); - if (xsltFileName) { - xmlOutputter.setStyleSheet(*xsltFileName); - } - xmlOutputter.write(); - xmlOutFile.flush(); - xmlOutFile.close(); - - return result.wasSuccessful() ? 0 : 1; -} - - -/*------------------------------------------------------------------------------ - * Process command line arguments. - *----------------------------------------------------------------------------*/ -static bool -processArguments(int argc, char *argv[]) -{ - int i; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'c': - configFileName.reset(new std::string(optarg)); - break; - - case 'h': - printUsage(argv[0], std::cout); - return false; - - case 'o': - xmlOutFileName.reset(new std::string(optarg)); - break; - - case 's': - xsltFileName.reset(new std::string(optarg)); - break; - - case 'v': - printVersion(std::cout); - return false; - - default: - printUsage(argv[0], std::cout); - return false; - } - } - - if (optind < argc) { - std::cerr << "error processing command line arguments" << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - if (!configFileName) { - std::cerr << "mandatory option configuration file name not specified" - << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - if (!xmlOutFileName) { - std::cerr << "mandatory option output file name not specified" - << std::endl; - printUsage(argv[0], std::cout); - return false; - } - - std::cerr << "using config file '" << *configFileName << '\'' << std::endl; - std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; - if (xsltFileName) { - std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; - } - - return true; -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -static void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -static void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << "Unit test runner" << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION]" - << std::endl - << " mandatory options:" << std::endl - << " -o, --output=file.name write test results into this XML file" - << std::endl - << " optional options:" << std::endl - << " -s, --stylesheet specify this XSLT for the output file" - << std::endl - << " this is either an absolute URI, or a" - << std::endl - << " relative path for the output document" - << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/products/scheduler/src/UploadPlaylistMethod.cxx b/src/products/scheduler/src/UploadPlaylistMethod.cxx deleted file mode 100644 index 87855dfd6..000000000 --- a/src/products/scheduler/src/UploadPlaylistMethod.cxx +++ /dev/null @@ -1,174 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#ifdef HAVE_TIME_H -#include -#else -#error need time.h -#endif - - -#include - -#include "LiveSupport/Core/XmlRpcTools.h" -#include "LiveSupport/StorageClient/StorageClientInterface.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "ScheduleInterface.h" -#include "ScheduleFactory.h" -#include "SchedulerDaemon.h" - -#include "UploadPlaylistMethod.h" - - -using namespace boost; -using namespace boost::posix_time; - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::StorageClient; - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of this XML-RPC method. - *----------------------------------------------------------------------------*/ -const std::string UploadPlaylistMethod::methodName = "uploadPlaylist"; - -/*------------------------------------------------------------------------------ - * The ID of this method for error reporting purposes. - *----------------------------------------------------------------------------*/ -const int UploadPlaylistMethod::errorId = 1400; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Construct the method and register it right away. - *----------------------------------------------------------------------------*/ -UploadPlaylistMethod :: UploadPlaylistMethod ( - Ptr::Ref xmlRpcServer) throw() - : XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get()) -{ -} - - -/*------------------------------------------------------------------------------ - * Execute the upload playlist method XML-RPC function call. - *----------------------------------------------------------------------------*/ -void -UploadPlaylistMethod :: execute(XmlRpc::XmlRpcValue & rootParameter, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException) -{ - if (!rootParameter.valid() || rootParameter.size() != 1 - || !rootParameter[0].valid()) { - XmlRpcTools::markError(errorId+1, "invalid argument format", - returnValue); - return; - } - XmlRpc::XmlRpcValue parameters = rootParameter[0]; - - Ptr::Ref sessionId; - try{ - sessionId = XmlRpcTools::extractSessionId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+20, - "missing session ID argument", - returnValue); - return; - } - - Ptr::Ref playlistId; - try { - playlistId = XmlRpcTools::extractPlaylistId(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+2, "missing playlist ID argument", - returnValue); - return; - } - - Ptr::Ref playschedule; - try { - playschedule = XmlRpcTools::extractPlayschedule(parameters); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+3, "missing playtime argument", - returnValue); - return; - } - - Ptr::Ref scf - = StorageClientFactory::getInstance(); - Ptr::Ref storage - = scf->getStorageClient(); - - Ptr::Ref playlist; - try { - playlist = storage->getPlaylist(sessionId, playlistId); - } catch (Core::XmlRpcException &e) { - std::string eMsg = "playlist not found:\n"; - eMsg += e.what(); - XmlRpcTools::markError(errorId+4, eMsg, returnValue); - return; - } - - Ptr::Ref until(new ptime(*playschedule - + *(playlist->getPlaylength()))); - - Ptr::Ref sf = ScheduleFactory::getInstance(); - Ptr::Ref schedule = sf->getSchedule(); - - if (!schedule->isTimeframeAvailable(playschedule, until)) { - XmlRpcTools::markError(errorId+5, "timeframe not available", - returnValue); - return; - } - - Ptr::Ref scheduleEntryId; - try { - scheduleEntryId = schedule->schedulePlaylist(playlist, playschedule); - } catch (std::invalid_argument &e) { - XmlRpcTools::markError(errorId+6, e.what(), - returnValue); - return; - } - - // tell the scheduler daemon to reload the scheduled events - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - scheduler->update(); - - XmlRpcTools::scheduleEntryIdToXmlRpcValue(scheduleEntryId, returnValue); -} diff --git a/src/products/scheduler/src/UploadPlaylistMethod.h b/src/products/scheduler/src/UploadPlaylistMethod.h deleted file mode 100644 index 05fdd5288..000000000 --- a/src/products/scheduler/src/UploadPlaylistMethod.h +++ /dev/null @@ -1,160 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef UploadPlaylistMethod_h -#define UploadPlaylistMethod_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" -#include "LiveSupport/Core/UniqueId.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * An XML-RPC method object to accept a playlist for upload, - * and schedule it in the scheduler. - * - * The name of the method when called through XML-RPC is "uploadPlaylist". - * - * The expected parameter is an XML-RPC structure, with the following - * members: - *
    - *
  • sessionId - string - the session ID obtained via the login() - * method of the authentication client
  • - *
  • playlistId - string - the id of the playlist to upload
  • - *
  • playtime - datetime - the time when the playlist should be - * scheduled, an ISO 8601 DateTime field
  • - *
- * - * The playlistId parameter is a string containing the hexadecimal value of - * the playlist ID. - * It is up to 8 characters long, representing a value between 0 and 2^31-1, - * inclusive. - * - * If the upload is successful, the method returns an XML-RPC structure with - * the following members: - *
    - *
  • scheduleEntryId - string - the id of the schedule entry created - * by the upload
  • - *
- * - * In case of an error, a standard XML-RPC fault response is generated, - * and a { faultCode, faultString } structure is returned. The - * possible errors are: - *
    - *
  • 1401 - invalid argument format
  • - *
  • 1402 - missing playlist ID argument
  • - *
  • 1403 - missing playtime argument
  • - *
  • 1404 - playlist not found
  • - *
  • 1405 - timeframe not available
  • - *
  • 1406 - could not schedule playlist
  • - *
  • 1420 - missing session ID argument
  • - *
- * - */ -class UploadPlaylistMethod : public XmlRpc::XmlRpcServerMethod -{ - private: - /** - * The name of this method, as it will be registered into the - * XML-RPC server. - */ - static const std::string methodName; - - /** - * The ID of this method for error reporting purposes. - */ - static const int errorId; - - - public: - /** - * A default constructor, for testing purposes. - */ - UploadPlaylistMethod(void) throw () - : XmlRpc::XmlRpcServerMethod(methodName) - { - } - - /** - * Constuctor that registers the method with the server right away. - * - * @param xmlRpcServer the XML-RPC server to register with. - */ - UploadPlaylistMethod( - Ptr::Ref xmlRpcServer) - throw (); - - /** - * Execute the upload playlist command on the Scheduler daemon. - * - * @param parameters XML-RPC function call parameters - * @param returnValue the return value of the call (out parameter) - */ - void - execute( XmlRpc::XmlRpcValue & parameters, - XmlRpc::XmlRpcValue & returnValue) - throw (XmlRpc::XmlRpcException); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // UploadPlaylistMethod_h - diff --git a/src/products/scheduler/src/UploadPlaylistMethodTest.cxx b/src/products/scheduler/src/UploadPlaylistMethodTest.cxx deleted file mode 100644 index 087fb0b1b..000000000 --- a/src/products/scheduler/src/UploadPlaylistMethodTest.cxx +++ /dev/null @@ -1,254 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - - -#include -#include -#include -#include - -#include "LiveSupport/Db/ConnectionManagerFactory.h" -#include "LiveSupport/StorageClient/StorageClientFactory.h" -#include "LiveSupport/Authentication/AuthenticationClientFactory.h" -#include "ScheduleFactory.h" - -#include "UploadPlaylistMethod.h" -#include "UploadPlaylistMethodTest.h" - -using namespace LiveSupport::Db; -using namespace LiveSupport::StorageClient; -using namespace LiveSupport::Scheduler; -using namespace LiveSupport::Authentication; - - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -CPPUNIT_TEST_SUITE_REGISTRATION(UploadPlaylistMethodTest); - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Set up the test environment - *----------------------------------------------------------------------------*/ -void -UploadPlaylistMethodTest :: setUp(void) throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref scheduler = SchedulerDaemon::getInstance(); - try { - Ptr::Ref storage = scheduler->getStorage(); - storage->reset(); - - schedule = scheduler->getSchedule(); - - } catch (XmlRpcException &e) { - std::cerr << "caught XmlRpcException durng setUp" << std::endl - << e.what() << std::endl; - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in configuration file" << std::endl; - } catch (xmlpp::exception &e) { - std::cerr << "error parsing configuration file" << std::endl; - } catch (std::exception &e) { - std::cerr << e.what() << std::endl; - } - - authentication = scheduler->getAuthentication(); - try { - sessionId = authentication->login("root", "q"); - } catch (XmlRpcException &e) { - std::cerr << "could not log in:" << std::endl - << e.what() << std::endl; - } -} - - -/*------------------------------------------------------------------------------ - * Clean up the test environment - *----------------------------------------------------------------------------*/ -void -UploadPlaylistMethodTest :: tearDown(void) throw (CPPUNIT_NS::Exception) -{ - authentication->logout(sessionId); - sessionId.reset(); - authentication.reset(); -} - - -/*------------------------------------------------------------------------------ - * Just a very simple smoke test - *----------------------------------------------------------------------------*/ -void -UploadPlaylistMethodTest :: firstTest(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new UploadPlaylistMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - - // set up a structure for the parameters - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 18; - time.tm_min = 31; - time.tm_sec = 1; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); -} - - -/*------------------------------------------------------------------------------ - * Try to upload overlapping playlists, and see them fail. - *----------------------------------------------------------------------------*/ -void -UploadPlaylistMethodTest :: overlappingPlaylists(void) - throw (CPPUNIT_NS::Exception) -{ - Ptr::Ref method(new UploadPlaylistMethod()); - XmlRpc::XmlRpcValue parameters; - XmlRpc::XmlRpcValue rootParameter; - rootParameter.setSize(1); - XmlRpc::XmlRpcValue result; - struct tm time; - - // load the first playlist, this will succeed - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 0; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - - // try to load the same one, but in an overlapping time region - // (we know that playlist with id 1 is 1 hour long) - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 30; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - CPPUNIT_FAIL("allowed to schedule overlapping playlist"); - } catch (XmlRpc::XmlRpcException &e) { - CPPUNIT_ASSERT(e.getCode() == 1405); // timeframe not available - } - - // try to load the same one, but now in good timing - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 11; - time.tm_min = 30; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - } catch (XmlRpc::XmlRpcException &e) { - std::stringstream eMsg; - eMsg << "XML-RPC method returned error: " << e.getCode() - << " - " << e.getMessage(); - CPPUNIT_FAIL(eMsg.str()); - } - CPPUNIT_ASSERT(result.hasMember("scheduleEntryId")); - - // try to load the same one, this time overlapping both previos instances - parameters["sessionId"] = sessionId->getId(); - parameters["playlistId"] = "0000000000000001"; - time.tm_year = 2001; - time.tm_mon = 11; - time.tm_mday = 12; - time.tm_hour = 10; - time.tm_min = 45; - time.tm_sec = 0; - parameters["playtime"] = &time; - rootParameter[0] = parameters; - - result.clear(); - try { - method->execute(rootParameter, result); - CPPUNIT_FAIL("allowed to schedule doubly overlapping playlist"); - } catch (XmlRpc::XmlRpcException &e) { - CPPUNIT_ASSERT(e.getCode() == 1405); // timeframe not available - } -} diff --git a/src/products/scheduler/src/UploadPlaylistMethodTest.h b/src/products/scheduler/src/UploadPlaylistMethodTest.h deleted file mode 100644 index 1423a1b41..000000000 --- a/src/products/scheduler/src/UploadPlaylistMethodTest.h +++ /dev/null @@ -1,133 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef UploadPlaylistMethodTest_h -#define UploadPlaylistMethodTest_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include - -#include "LiveSupport/Authentication/AuthenticationClientInterface.h" -#include "LiveSupport/Core/SessionId.h" -#include "SchedulerDaemon.h" -#include "BaseTestMethod.h" - -namespace LiveSupport { -namespace Scheduler { - -using namespace LiveSupport; -using namespace LiveSupport::Core; -using namespace LiveSupport::Authentication; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Unit test for the UploadPlaylistMethod class. - * - * @see UploadPlaylistMethod - */ -class UploadPlaylistMethodTest : public CPPUNIT_NS::TestFixture -{ - CPPUNIT_TEST_SUITE(UploadPlaylistMethodTest); - CPPUNIT_TEST(firstTest); - CPPUNIT_TEST(overlappingPlaylists); - CPPUNIT_TEST_SUITE_END(); - - private: - - /** - * The schedule used during the test. - */ - Ptr::Ref schedule; - - /** - * The authentication client produced by the factory. - */ - Ptr::Ref authentication; - - /** - * A session ID from the authentication client login() method. - */ - Ptr::Ref sessionId; - - - protected: - - /** - * A simple test. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - firstTest(void) throw (CPPUNIT_NS::Exception); - - /** - * Try to upload overlapping playlists, and see them fail. - * - * @exception CPPUNIT_NS::Exception on test failures. - */ - void - overlappingPlaylists(void) throw (CPPUNIT_NS::Exception); - - public: - - /** - * Set up the environment for the test case. - */ - void - setUp(void) throw (CPPUNIT_NS::Exception); - - /** - * Clean up the environment after the test case. - */ - void - tearDown(void) throw (CPPUNIT_NS::Exception); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // UploadPlaylistMethodTest_h - diff --git a/src/products/scheduler/src/XmlRpcDaemon.cxx b/src/products/scheduler/src/XmlRpcDaemon.cxx deleted file mode 100644 index e02afccad..000000000 --- a/src/products/scheduler/src/XmlRpcDaemon.cxx +++ /dev/null @@ -1,369 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_STDIO_H -#include -#else -#error "Need stdio.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_FCNTL_H -#include -#else -#error "Need fcntl.h" -#endif - -#if HAVE_SIGNAL_H -#include -#else -#error "Need signal.h" -#endif - -#if HAVE_SYS_STAT_H -#include -#else -#error "Need sys/stat.h" -#endif - - -#include -#include -#include -#include - -#include "SignalDispatcher.h" -#include "XmlRpcDaemonShutdownSignalHandler.h" -#include "XmlRpcDaemon.h" -#include - - -using namespace LiveSupport::Scheduler; - -GMainLoop *loop; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/*------------------------------------------------------------------------------ - * The name of the config element for this class - *----------------------------------------------------------------------------*/ -const std::string XmlRpcDaemon::configElementNameStr = - "xmlRpcDaemon"; - -/** - * The name of the XML configuration attribute for the XML-RPC host name. - */ -static const std::string confXmlRpcHostAttr = "xmlRpcHost"; - -/** - * The name of the XML configuration attribute for the XML-RPC port. - */ -static const std::string confXmlRpcPortAttr = "xmlRpcPort"; - -/** - * The name of the XML configuration attribute for the process id file. - */ -static const std::string confPidFileNameAttr = "pidFileName"; - -/** - * The umask used by the daemon for file creations - */ -static const mode_t uMask = 022; - - -/* =============================================== local function prototypes */ - - -/* ============================================================= module code */ - -/*------------------------------------------------------------------------------ - * Configure the Scheder daemon according to an XML element - *----------------------------------------------------------------------------*/ -void -XmlRpcDaemon :: configureXmlRpcDaemon( - const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) -{ - if (configured) { - throw std::logic_error("already configured"); - } - - const xmlpp::Attribute * attribute = 0; - std::stringstream strStr; - - if (element.get_name() != configElementNameStr) { - std::string eMsg = "Bad configuration element "; - eMsg += element.get_name(); - throw std::invalid_argument(eMsg); - } - - if (!(attribute = element.get_attribute(confXmlRpcHostAttr))) { - std::string eMsg = "Missing attribute "; - eMsg += confXmlRpcHostAttr; - throw std::invalid_argument(eMsg); - } - xmlRpcHost = attribute->get_value(); - - if (!(attribute = element.get_attribute(confXmlRpcPortAttr))) { - std::string eMsg = "Missing attribute "; - eMsg += confXmlRpcPortAttr; - throw std::invalid_argument(eMsg); - } - strStr.str(attribute->get_value()); - strStr >> xmlRpcPort; - - if (!(attribute = element.get_attribute(confPidFileNameAttr))) { - std::string eMsg = "Missing attribute "; - eMsg += confPidFileNameAttr; - throw std::invalid_argument(eMsg); - } - pidFileName = attribute->get_value(); - - configured = true; -} - - -/*------------------------------------------------------------------------------ - * Do all the necessary work of becoming a daemon. - * See http://www.enderunix.org/docs/eng/daemon.php and - * http://www.linuxprofilm.com/articles/linux-daemon-howto.html - * for hints. - *----------------------------------------------------------------------------*/ -bool -XmlRpcDaemon :: daemonize(void) throw (std::runtime_error) -{ - int i; - - if (getppid() == 1) { - // we're already a daemon - return true; - } - - i = fork(); - if (i < 0) { - throw std::runtime_error("fork error"); - } else if (i > 0) { - // this is the parent, simply return - return false; - } - // for twice, so that we're totally detached from our ancestor - i = fork(); - if (i < 0) { - throw std::runtime_error("fork error"); - } else if (i > 0) { - // this is the parent, simply return - return false; - } - - // now we're in the child process - - // obtain a new process group - setsid(); - - // change the umask - umask(uMask); - - /* TODO: wait with this until we have logging - // close standard file descriptors - for (i=getdtablesize();i>=0;--i) close(i); // - - // set all std in/out to /dev/null - i=open("/dev/null",O_RDWR); // open stdin - dup(i); // stdout - dup(i); // stderr - */ - - // save the process id - savePid(); - - // ignore some signals - signal(SIGCHLD,SIG_IGN); - signal(SIGTSTP,SIG_IGN); - signal(SIGTTOU,SIG_IGN); - signal(SIGTTIN,SIG_IGN); - - // register our signal hanlder - SignalDispatcher * signalDispatcher = SignalDispatcher::getInstance(); - XmlRpcDaemonShutdownSignalHandler * handler = - new XmlRpcDaemonShutdownSignalHandler(this); - signalDispatcher->registerHandler(SIGHUP, handler); - signalDispatcher->registerHandler(SIGTERM, handler); - // FIXME: this signal handler will not be deleted by anyone, - // possible memory leak - - return true; -} - - -/*------------------------------------------------------------------------------ - * Save the current process id. - *----------------------------------------------------------------------------*/ -void -XmlRpcDaemon :: savePid(void) throw () -{ - std::ofstream pidFile(pidFileName.c_str()); - pidFile << getpid(); - pidFile.flush(); - pidFile.close(); -} - - -/*------------------------------------------------------------------------------ - * Return the saved process id. - *----------------------------------------------------------------------------*/ -pid_t -XmlRpcDaemon :: loadPid(void) throw () -{ - pid_t pid; - - std::ifstream pidFile(pidFileName.c_str()); - if (pidFile.fail()) { - //std::cout << "XmlRpcDaemon::loadPid - Failed to open file " << pidFileName.c_str() << "\n"; - return 0; - } - - pidFile >> pid; - pidFile.close(); - - return pid; -} - - -/*------------------------------------------------------------------------------ - * Start the daemon. - *----------------------------------------------------------------------------*/ -void -XmlRpcDaemon :: start (void) throw (std::logic_error) -{ - checkForConfiguration(); - - if (isRunning()) { - std::cout << "Campcaster Scheduler is already running.\n"; - return; - } - - if (background) { - if (!daemonize()) { - // return if we're the parent process that should not continue - return; - } - } - - startup(); -} - - -/*------------------------------------------------------------------------------ - * Execute any daemon startup calls. - *----------------------------------------------------------------------------*/ -void -XmlRpcDaemon :: startup (void) throw (std::logic_error) -{ - // and now our own XML-RPC methods - registerXmlRpcFunctions(xmlRpcServer); - - // bind & run - xmlRpcServer->enableIntrospection(true); - xmlRpcServer->bindAndListen(xmlRpcPort); - active = true; - loop = g_main_loop_new (NULL, FALSE); - GMainContext* maincontext = g_main_context_default(); - while(active) - { - while (active && g_main_context_pending (maincontext)) { - g_main_context_iteration(maincontext, FALSE); - } - xmlRpcServer->work(0.); - g_usleep(G_USEC_PER_SEC/20); - } - -// xmlRpcServer->work(-1.0); -} - - -/*------------------------------------------------------------------------------ - * Tell if the daemon is running. - *----------------------------------------------------------------------------*/ -bool -XmlRpcDaemon :: isRunning (void) throw (std::logic_error) -{ - checkForConfiguration(); - - pid_t pid = loadPid(); - // check if there is a stale pid stored - if (pid && kill(pid, 0)) { - if (errno == ESRCH) { - // the pid does not exist, remove the stale pid file - remove(pidFileName.c_str()); - pid = 0; - } - } - //std::cout << "XmlRpcDaemon::isRunning - pid is " << pid << "\n"; - return pid; -} - - -/*------------------------------------------------------------------------------ - * Stop the daemon. - *----------------------------------------------------------------------------*/ -void -XmlRpcDaemon :: stop (void) throw (std::logic_error) -{ - checkForConfiguration(); - - pid_t pid = loadPid(); - if (pid) { - kill(pid, SIGTERM); - } -} - - -/*------------------------------------------------------------------------------ - * Shut down the daemon. - *----------------------------------------------------------------------------*/ -void -XmlRpcDaemon :: shutdown (void) throw (std::logic_error) -{ - active = false; - checkForConfiguration(); - - xmlRpcServer->shutdown(); - remove(pidFileName.c_str()); -} - - diff --git a/src/products/scheduler/src/XmlRpcDaemon.h b/src/products/scheduler/src/XmlRpcDaemon.h deleted file mode 100644 index caff2ca71..000000000 --- a/src/products/scheduler/src/XmlRpcDaemon.h +++ /dev/null @@ -1,434 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef XmlRpcDaemon_h -#define XmlRpcDaemon_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_SYS_TYPES_H -#include -#else -#error "Need sys/types.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#include -#include -#include -#include - -#include "LiveSupport/Core/Ptr.h" - - -namespace LiveSupport { -namespace Scheduler { - -using namespace XmlRpc; -using namespace LiveSupport::Core; - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * A generic XML-RPC daemon, that has to be sublclassed to provide - * real functionality. - * - * To use this class, subclass it, and override the configure() and - * registerXmlRpcFunctions() functions. - * - * The typical usage of the XmlRpcDaemon is as follows. To start the - * daemon: - *
    - *
  1. create an instance of a subclass of XmlRpcDaemon
  2. - *
  3. call the configure() method with a proper XML element
  4. - *
  5. optionally call setBackground()
  6. - *
  7. call start() to start the daemon
  8. - *
- * Stopping the daemon is similar: - *
    - *
  1. create an instance of a subclass of XmlRpcDaemon
  2. - *
  3. call the configure() method with a proper XML element - * if it has not yet been configured
  4. - *
  5. call stop() to stop the daemon
  6. - *
- * - * The structure of the XML configuration element used to configure the - * XML-RPC daemon is as follows: - * - *

- *  
- *  
- * - * The DTD for the above is: - *

- *  
- *  
- *  
- *  
- *  
- *  
- * - * - */ -class XmlRpcDaemon -{ - private: - /** - * The name of the configuration XML elmenent used by this object. - */ - static const std::string configElementNameStr; - - /** - * The host the XML-RPC server the daemon is - * listening on. - */ - std::string xmlRpcHost; - - /** - * The port the XML-RPC server the daemon is - * listening on. - */ - unsigned int xmlRpcPort; - - /** - * The name of the file where the daemon saves it's process id when - * running. - */ - std::string pidFileName; - - /** - * Flag indicating if the singleton instnace has been - * configured already. - */ - bool configured; - - /** - * Flag indicating wether to fork into background as a daemon - * or don't (good for debugging, for example). - * Defaults to true. - */ - bool background; - - /** - * The XML-RPC server running within the Scheduler Daemon. - */ - Ptr::Ref xmlRpcServer; - - /** - * Do all the necessary tasks of becoming a daemon. - * - * @return true if we're in the daemon process, false - * if we're in the parent process that should not continue - * @exception std::runtime_error on forking errors - */ - bool - daemonize(void) throw (std::runtime_error); - - /** - * Save the current process id to the process id file - */ - void - savePid(void) throw(); - - /** - * Return the saved process id. - * - * @return the saved process id of the daemon, or 0 if none saved. - */ - pid_t - loadPid(void) throw(); - - bool active; - - protected: - /** - * Default constructor. - */ - XmlRpcDaemon (void) throw () - { - background = true; - configured = false; - active = false; - xmlRpcServer.reset(new XmlRpcServer()); - } - - /** - * Virtual destructor. - */ - virtual - ~XmlRpcDaemon(void) throw () - { - } - - /** - * Check if the daemon has already been configured, - * and raise an exception if not so. - * - * @exception std::logic_error if the daemon has not yet been - * configured. - */ - void - checkForConfiguration(void) const throw (std::logic_error) - { - if (!configured) { - throw std::logic_error("not yet configured"); - } - } - - /** - * Configure the XML-RPC daemon itself. Pass an <xmlRpcDaemon> - * element to this function. - * - * @param element the XML element to configure the XML-RPC - * daemon from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the daemon has already - * been configured. - */ - void - configureXmlRpcDaemon(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error); - - - /** - * Register your XML-RPC functions by implementing this function. - */ - virtual void - registerXmlRpcFunctions(Ptr::Ref xmlRpcServer) - throw (std::logic_error) - = 0; - - /** - * Execute any calls when the daemon is starting up. - * All resources allocated here should be freed up in shutdown(). - * This function will only return when the daemon ha stopped - * running. - * - * @exception std::logic_error if startup could not succeed. - * @see #shutdown - */ - virtual void - startup (void) throw (std::logic_error); - - - public: - /** - * Return the name of the XML element this object expects - * to be sent to a call to configure(). - * - * @return the name of the expected XML configuration element. - */ - static const std::string - getConfigElementName(void) throw () - { - return configElementNameStr; - } - - /** - * Tell if the daemon has already been configured. - * If so, an attempt to configure it again will result in an - * exception. - * - * @return true if the daemon has already been - * configured, false otherwise. - */ - const bool - isConfigured(void) const throw () - { - return configured; - } - - /** - * Set if the XML-RPC server should fork into background. - * - * @param background if true, the XML-RPC server will fork into - * background, otherwise not (good for debugging). - */ - void - setBackground(const bool background) throw () - { - this->background = background; - } - - /** - * Tell if the XML-RPC server will fork into background. - * - * @return if true, the XML-RPC server will fork into - * background, otherwise not (good for debugging). - */ - const bool - getBackground(void) const throw () - { - return background; - } - - /** - * Configure the daemon based on the XML element - * supplied. - * Implemtors should call the funtion configureXmlRpcDaemon - * from here with a proper <xmlRpcDaemon> element. - * - * @param element the XML element to configure the - * daemon from. - * @exception std::invalid_argument if the supplied XML element - * contains bad configuraiton information - * @exception std::logic_error if the daemon has already - * been configured. - * @see #configureXmlRpcDaemon - */ - virtual void - configure(const xmlpp::Element & element) - throw (std::invalid_argument, - std::logic_error) - = 0; - - /** - * Tell the host name of the XML-RPC server the - * daemon is listening on. - * - * @return the host name of the XML-RPC server the - * daemon is listening on. - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - const std::string - getXmlRpcHost(void) const throw (std::logic_error) - { - checkForConfiguration(); - return xmlRpcHost; - } - - /** - * Tell the port of the XML-RPC server the - * daemon is listening on. - * - * @return the port of the XML-RPC server the - * daemon is listening on. - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - const unsigned int - getXmlRpcPort(void) const throw (std::logic_error) - { - checkForConfiguration(); - return xmlRpcPort; - } - - /** - * Tell the file name where the daemon stores its process id. - * - * @return the name of the file where the process id is stored. - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - const std::string - getPidFileName(void) const throw (std::logic_error) - { - checkForConfiguration(); - return pidFileName; - } - - /** - * Start the daemon. - * - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - void - start (void) throw (std::logic_error); - - /** - * Tell if the daemon is running. - * If there is a stale pid file stored for the daemon, it is - * removed during checking (and correctly false is returned). - * - * @return true of the daemon is running, false otherwise. - * @exception std::logic_error if the daemon has not - * yet been configured. - */ - bool - isRunning (void) throw (std::logic_error); - - /** - * Stop the daemon. - * This function just sends a signal, which will result in - * shutdown() to get called eventually. - * - * @exception std::logic_error if the daemon has not - * yet been configured. - * @see #shutdown - */ - void - stop (void) throw (std::logic_error); - - /** - * Shut down the daemon. - * This function is public only because the signal handler - * needs visibility to this function, which will call it. - * A call to stop() will trigger a signal that will call shutdown(). - * - * @exception std::logic_error if the daemon has not - * yet been configured. - * @see #stop - */ - virtual void - shutdown (void) throw (std::logic_error); -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // XmlRpcDaemon_h - diff --git a/src/products/scheduler/src/XmlRpcDaemonShutdownSignalHandler.h b/src/products/scheduler/src/XmlRpcDaemonShutdownSignalHandler.h deleted file mode 100644 index 61f8f26ad..000000000 --- a/src/products/scheduler/src/XmlRpcDaemonShutdownSignalHandler.h +++ /dev/null @@ -1,111 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ -#ifndef XmlRpcDaemonShutdownSignalHandler_h -#define XmlRpcDaemonShutdownSignalHandler_h - -#ifndef __cplusplus -#error This is a C++ include file -#endif - - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#include "SignalHandler.h" -#include "XmlRpcDaemon.h" - - -namespace LiveSupport { -namespace Scheduler { - -/* ================================================================ constants */ - - -/* =================================================================== macros */ - - -/* =============================================================== data types */ - -/** - * Signal handler to shut down an XmlRpcDaemon. - * - * @see XmlRpcDaemon - */ -class XmlRpcDaemonShutdownSignalHandler : public SignalHandler -{ - private: - /** - * The XmlRpcDaemon to shut down. - */ - XmlRpcDaemon * xmlRpcDaemon; - - public: - /** - * Constructor. - * - * @param xmlRpcDaemon the XmlRpcDaemon to shut down when the - * handler is invoked. - */ - XmlRpcDaemonShutdownSignalHandler( - XmlRpcDaemon * xmlRpcDaemon) - throw () - { - this->xmlRpcDaemon = xmlRpcDaemon; - } - - /** - * Handle the signal. Shuts down the XmlRpcDaemon used to - * construct this handler. - * - * @param signal the actual signal received. - */ - virtual void - handleSignal(int signal) throw () - { - xmlRpcDaemon->shutdown(); - } - - /** - * A virtual destructor, as this class has virtual functions. - */ - virtual - ~XmlRpcDaemonShutdownSignalHandler(void) throw () - { - } -}; - - -/* ================================================= external data structures */ - - -/* ====================================================== function prototypes */ - - -} // namespace Scheduler -} // namespace LiveSupport - -#endif // XmlRpcDaemonShutdownSignalHandler_h - diff --git a/src/products/scheduler/src/main.cxx b/src/products/scheduler/src/main.cxx deleted file mode 100644 index c4c00f2c6..000000000 --- a/src/products/scheduler/src/main.cxx +++ /dev/null @@ -1,244 +0,0 @@ -/*------------------------------------------------------------------------------ - - Copyright (c) 2010 Sourcefabric O.P.S. - - This file is part of the Campcaster project. - http://campcaster.sourcefabric.org/ - - Campcaster is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Campcaster is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Campcaster; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -------------------------------------------------------------------------------*/ - -/** @file - * This file contains the main entry point to the Scheduler daemon. - */ - -/* ============================================================ include files */ - -#ifdef HAVE_CONFIG_H -#include "configure.h" -#endif - -#if HAVE_UNISTD_H -#include -#else -#error "Need unistd.h" -#endif - -#if HAVE_GETOPT_H -#include -#else -#error "Need getopt.h" -#endif - -#include -#include -#include -#include - -#include "SchedulerDaemon.h" - - -using namespace LiveSupport::Scheduler; - -/* =================================================== local data structures */ - - -/* ================================================ local constants & macros */ - -/** - * Our copyright notice, should be at most 80 columns - */ -static const char copyrightNotice[] = - "Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL"; - -/** - * String describing the short options. - */ -static const char options[] = "c:dhv"; - -/** - * Structure describing the long options - */ -static const struct option longOptions[] = { - { "config", required_argument, 0, 'c' }, - { "debug", no_argument, 0, 'd' }, - { "help", no_argument, 0, 'h' }, - { "version", no_argument, 0, 'v' }, - { 0, 0, 0, 0 } -}; - -/** - * The start command: "start" - */ -static const std::string startCommand = "start"; - -/** - * The status command: "status" - */ -static const std::string statusCommand = "status"; - -/** - * The stop command: "stop" - */ -static const std::string stopCommand = "stop"; - - -/* =============================================== local function prototypes */ - -/** - * Print program version. - * - * @param os the std::ostream to print to. - */ -static void -printVersion ( std::ostream & os ); - -/** - * Print program usage information. - * - * @param invocation the command line command used to invoke this program. - * @param os the std::ostream to print to. - */ -static void -printUsage ( const char invocation[], - std::ostream & os ); - - -/* ============================================================= module code */ - -/** - * Program entry point. - * - * @param argc the number of command line arguments passed by the user. - * @param argv the command line arguments passed by the user. - * @return 0 on success, non-0 on failure. - */ -int main ( int argc, - char * argv[] ) -{ - int i; - std::string configFileName; - bool debugMode = false; - - while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { - switch (i) { - case 'c': - configFileName = optarg; - break; - - case 'd': - debugMode = true; - break; - - case 'h': - printUsage(argv[0], std::cout); - exit(EXIT_SUCCESS); - - case 'v': - printVersion(std::cout); - exit(EXIT_SUCCESS); - - default: - printUsage(argv[0], std::cout); - exit(EXIT_FAILURE); - } - } - - if (optind != argc - 1) { - printUsage(argv[0], std::cout); - exit(EXIT_FAILURE); - } - - std::cerr << "using config file '" << configFileName << '\'' << std::endl; - - Ptr::Ref daemon = SchedulerDaemon::getInstance(); - - try { - std::auto_ptr - parser(new xmlpp::DomParser(configFileName, true)); - const xmlpp::Document * document = parser->get_document(); - daemon->configure(*(document->get_root_node())); - } catch (std::invalid_argument &e) { - std::cerr << "semantic error in configuration file" << std::endl - << e.what() << std::endl; - exit(EXIT_FAILURE); - } catch (xmlpp::exception &e) { - std::cerr << "error parsing configuration file" << std::endl - << e.what() << std::endl; - exit(EXIT_FAILURE); - } - - daemon->setBackground(!debugMode); - - try { - if (startCommand == argv[optind]) { - daemon->start(); - } else if (statusCommand == argv[optind]) { - std::cout << "The Scheduler Daemon is " - << (daemon->isRunning() ? "" : "not ") - << "running" << std::endl; - } else if (stopCommand == argv[optind]) { - daemon->stop(); - } else { - printUsage(argv[0], std::cout); - exit(EXIT_FAILURE); - } - } catch (std::exception &e) { - std::cerr << "error executing command " << argv[optind] << std::endl; - std::cerr << e.what() << std::endl; - exit(EXIT_FAILURE); - } - - exit(EXIT_SUCCESS); -} - - -/*------------------------------------------------------------------------------ - * Print program version. - *----------------------------------------------------------------------------*/ -static void -printVersion ( std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << copyrightNotice << std::endl; -} - - -/*------------------------------------------------------------------------------ - * Print program usage. - *----------------------------------------------------------------------------*/ -static void -printUsage ( const char invocation[], - std::ostream & os ) -{ - os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl - << std::endl - << "Usage: " << invocation << " [OPTION] COMMAND" - << std::endl - << " COMMAND is one of: start, stop, or status" - << std::endl - << std::endl - << " mandatory options:" << std::endl - << " -c, --config=file.name scheduler configuration file" << std::endl - << " optional options:" << std::endl - << " -d, --debug don't fork into background" << std::endl - << " -h, --help display this help and exit" << std::endl - << " -v, --version display version information and exit" - << std::endl - << std::endl - << "Report bugs to " << PACKAGE_BUGREPORT << std::endl; -} - diff --git a/src/products/scheduler/tmp/.keepme b/src/products/scheduler/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/products/scheduler/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/products/scheduler/var/test1.mp3 b/src/products/scheduler/var/test1.mp3 deleted file mode 100644 index f774c2164836a4ab4069cc300c6a6232acec8b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236563 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 z 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

O%mZaalm13fB+!t2(V8Z%B4@!ut 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 diff --git a/src/products/scheduler/var/test2.mp3 b/src/products/scheduler/var/test2.mp3 deleted file mode 100644 index f774c2164836a4ab4069cc300c6a6232acec8b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236563 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 z 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

O%mZaalm13fB+!t2(V8Z%B4@!ut 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 diff --git a/src/tools/libodbc++/libodbc++-0.2.5/bin/autogen.sh b/src/tools/libodbc++/libodbc++-0.2.5/bin/autogen.sh deleted file mode 100755 index 73f29224c..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/bin/autogen.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author: fgerlits $ -# Version : $Revision: 2674 $ -# Location : $URL: svn://source.campware.org/campcaster/trunk/campcaster/src/tools/libodbc++/libodbc++-0.2.4pre4/bin/autogen.sh $ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="libodbc++" - -# assume we're in $basedir/bin -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -#ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -#echo " aclocal $ACLOCAL_FLAGS" -#cp -f ${configure_ac} ${tmpdir} -#cp -f ${etcdir}/acinclude.m4 ${tmpdir} -#aclocal $ACLOCAL_FLAGS - -#echo " autoheader ${configure_ac}" -#autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/tools/libodbc++/libodbc++-0.2.5/bin/prepare.sh b/src/tools/libodbc++/libodbc++-0.2.5/bin/prepare.sh deleted file mode 100755 index 6a59ea758..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/bin/prepare.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author: fgerlits $ -# Version : $Revision: 3360 $ -# Location : $URL: svn://source.campware.org/campcaster/trunk/campcaster/src/tools/libodbc++/libodbc++-0.2.4pre4/bin/prepare.sh $ -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# Run this script to prepare libodbc++ 2.3 to be configured and compiled. -# To read more about libodbc++, see http://libodbcxx.sourceforge.net/ -#------------------------------------------------------------------------------- -product=libodbc++-0.2.5 - -reldir=`dirname $0`/.. -basedir=`cd ${reldir}; pwd;` -bindir=${basedir}/bin -etcdir=${basedir}/etc -tmpdir=${basedir}/tmp - -tar=$basedir/src/$product.tar.bz2 - -mkdir -p ${tmpdir} - -cd ${tmpdir} -if [ ! -d $product ]; then - tar xfj ${tar} - cd $product - - # patch accepted, will be in the next release - # http://libodbcxx.svn.sourceforge.net/viewvc/libodbcxx?view=rev&revision=154 - patch -p1 < $etcdir/libodbc++-add-cstdio-include.patch -fi - diff --git a/src/tools/libodbc++/libodbc++-0.2.5/configure b/src/tools/libodbc++/libodbc++-0.2.5/configure deleted file mode 100755 index 99d468d94..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/configure +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen $*) -fi - -(cd $tmpdir && $configure $*) - diff --git a/src/tools/libodbc++/libodbc++-0.2.5/etc/Makefile.in b/src/tools/libodbc++/libodbc++-0.2.5/etc/Makefile.in deleted file mode 100644 index d7b9e86e3..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/etc/Makefile.in +++ /dev/null @@ -1,78 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author: fgerlits $ -# Version : $Revision: 3356 $ -# Location : $URL: svn://source.campware.org/campcaster/trunk/campcaster/src/tools/libodbc++/libodbc++-0.2.4pre4/etc/Makefile.in $ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -DOXYTAG = doxytag -XSLTPROC = xsltproc -ECHO = @echo -FLAWFINDER = flawfinder - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -BASE_DIR = . -BIN_DIR = ${BASE_DIR}/bin -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -ETC_DIR = ${BASE_DIR}/etc -TMP_DIR = ${BASE_DIR}/tmp - -LIBODBCXX_VERSION = libodbc++-0.2.5 -LIBODBCXX_DIR = ${TMP_DIR}/${LIBODBCXX_VERSION} - - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -all: ${TMP_DIR}/all.stamp -${TMP_DIR}/all.stamp: - ${MAKE} -C ${LIBODBCXX_DIR} - touch ${TMP_DIR}/all.stamp - -install: all ${TMP_DIR}/install.stamp -${TMP_DIR}/install.stamp: - ${MAKE} -C ${LIBODBCXX_DIR} install - touch ${TMP_DIR}/install.stamp - -clean: - ${MAKE} -C ${LIBODBCXX_DIR} clean - ${RM} ${TMP_DIR}/*.stamp - -distclean: - ${RM} ${TMP_DIR}/*.stamp - ${RMDIR} ${LIBODBCXX_DIR} - ${RMDIR} ${TMP_DIR}/auto* ${TMP_DIR}/config* ${TMP_DIR}/install-sh - - diff --git a/src/tools/libodbc++/libodbc++-0.2.5/etc/configure.ac b/src/tools/libodbc++/libodbc++-0.2.5/etc/configure.ac deleted file mode 100644 index 4a5ea959b..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/etc/configure.ac +++ /dev/null @@ -1,54 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl To report bugs, send an e-mail to bugs@campware.org -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl -dnl Author : $Author: fgerlits $ -dnl Version : $Revision: 3356 $ -dnl Location : $URL: svn://source.campware.org/campcaster/trunk/campcaster/src/tools/libodbc++/libodbc++-0.2.4pre4/etc/configure.ac $ -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(libodbc++, 0.2.5, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision: 3356 $) - -AC_CONFIG_SRCDIR(../src/libodbc++-0.2.5.tar.bz2) - - -dnl untar the sources before anything happens -../bin/prepare.sh - -cd ../tmp/libodbc++-0.2.5 -./configure --enable-threads --prefix=$prefix -cd - - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() - diff --git a/src/tools/libodbc++/libodbc++-0.2.5/etc/libodbc++-add-cstdio-include.patch b/src/tools/libodbc++/libodbc++-0.2.5/etc/libodbc++-add-cstdio-include.patch deleted file mode 100644 index 67916cb0d..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/etc/libodbc++-add-cstdio-include.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur libodbc++-0.2.5/include/odbc++/types.h libodbc++-0.2.5-cstdio/include/odbc++/types.h ---- libodbc++-0.2.5/include/odbc++/types.h 2009-03-05 14:23:21.000000000 +0100 -+++ libodbc++-0.2.5-cstdio/include/odbc++/types.h 2010-01-02 19:22:54.650900117 +0100 -@@ -25,6 +25,7 @@ - #include - - #include -+#include - #include - #include - diff --git a/src/tools/libodbc++/libodbc++-0.2.5/src/libodbc++-0.2.5.tar.bz2 b/src/tools/libodbc++/libodbc++-0.2.5/src/libodbc++-0.2.5.tar.bz2 deleted file mode 100644 index 4448b0f58ab515b351a3282bbd36167095c52f27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362310 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 z 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
        ECyuuzEmOpx5E)mPYASW8OT87l^= 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 njUt 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 diff --git a/src/tools/libodbc++/libodbc++-0.2.5/tmp/.keepme b/src/tools/libodbc++/libodbc++-0.2.5/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/tools/libodbc++/libodbc++-0.2.5/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/tools/taglib/taglib-1.5/bin/autogen.sh b/src/tools/taglib/taglib-1.5/bin/autogen.sh deleted file mode 100755 index ef986713e..000000000 --- a/src/tools/taglib/taglib-1.5/bin/autogen.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author$ -# Version : $Revision$ -# Location : $URL$ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="taglib" - -# assume we're in $basedir/bin -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -#ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -#echo " aclocal $ACLOCAL_FLAGS" -#cp -f ${configure_ac} ${tmpdir} -#cp -f ${etcdir}/acinclude.m4 ${tmpdir} -#aclocal $ACLOCAL_FLAGS - -#echo " autoheader ${configure_ac}" -#autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/tools/taglib/taglib-1.5/bin/prepare.sh b/src/tools/taglib/taglib-1.5/bin/prepare.sh deleted file mode 100755 index c2b4f458e..000000000 --- a/src/tools/taglib/taglib-1.5/bin/prepare.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author$ -# Version : $Revision$ -# Location : $URL$ -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# Run this script to prepare taglib 1.3.1 to be configured and compiled. -# For more information on taglib, -# see http://freshmeat.net/redir/taglib/47265/url_homepage/taglib -#------------------------------------------------------------------------------- -product=taglib-1.5 - -reldir=`dirname $0`/.. -basedir=`cd ${reldir}; pwd;` -bindir=${basedir}/bin -etcdir=${basedir}/etc -tmpdir=${basedir}/tmp - -tar=$basedir/src/$product.tar.gz - -mkdir -p ${tmpdir} - -cd ${tmpdir} -if [ ! -d $product ]; then - tar xfz ${tar} - cd $product - # see https://bugs.kde.org/show_bug.cgi?id=112728 - # and http://mail.kde.org/pipermail/taglib-devel/2005-June/000149.html - patch -p1 < $etcdir/taglib-1.5-length-in-microseconds.patch -fi - diff --git a/src/tools/taglib/taglib-1.5/configure b/src/tools/taglib/taglib-1.5/configure deleted file mode 100755 index 26ccda218..000000000 --- a/src/tools/taglib/taglib-1.5/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen $*) -fi - -(cd $tmpdir && $configure $*) - diff --git a/src/tools/taglib/taglib-1.5/etc/Makefile.in b/src/tools/taglib/taglib-1.5/etc/Makefile.in deleted file mode 100644 index b2a13c092..000000000 --- a/src/tools/taglib/taglib-1.5/etc/Makefile.in +++ /dev/null @@ -1,90 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author$ -# Version : $Revision$ -# Location : $URL$ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -DOXYTAG = doxytag -XSLTPROC = xsltproc -ECHO = @echo -FLAWFINDER = flawfinder - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -BASE_DIR = . -BIN_DIR = ${BASE_DIR}/bin -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -ETC_DIR = ${BASE_DIR}/etc -TMP_DIR = ${BASE_DIR}/tmp - -TAGLIB_VERSION = taglib-1.5 -TAGLIB_DIR = ${TMP_DIR}/${TAGLIB_VERSION} - -prefix = @prefix@ -# datadir will be defiend as ${prefix}/share, so we need to define ${prefix} -# above -docdir = @datadir@/doc/${TAGLIB_VERSION} - - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -all: ${TMP_DIR}/all.stamp -${TMP_DIR}/all.stamp: - ${MAKE} -C ${TAGLIB_DIR} - # make the reference documentation and install that as well, as the - # autoconf thing doesn't :( - cd ${TAGLIB_DIR}/doc && ${DOXYGEN} taglib.doxygen - touch ${TMP_DIR}/all.stamp - -install: all ${TMP_DIR}/install.stamp -${TMP_DIR}/install.stamp: - ${MAKE} -C ${TAGLIB_DIR} install - # make the reference documentation and install that as well, as the - # autoconf thing doesn't :( - ${MKDIR} ${docdir} - cp -pPR ${TAGLIB_DIR}/doc/* ${docdir} - touch ${TMP_DIR}/install.stamp - -clean: - ${MAKE} -C ${TAGLIB_DIR} clean - ${RM} ${TMP_DIR}/*.stamp - -distclean: - ${RM} ${TMP_DIR}/*.stamp - ${RMDIR} ${TAGLIB_DIR} - ${RMDIR} ${TMP_DIR}/auto* ${TMP_DIR}/config* ${TMP_DIR}/install-sh - - diff --git a/src/tools/taglib/taglib-1.5/etc/configure.ac b/src/tools/taglib/taglib-1.5/etc/configure.ac deleted file mode 100644 index 3f02b5fdc..000000000 --- a/src/tools/taglib/taglib-1.5/etc/configure.ac +++ /dev/null @@ -1,54 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl To report bugs, send an e-mail to bugs@campware.org -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl -dnl Author : $Author$ -dnl Version : $Revision$ -dnl Location : $URL$ -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(taglib, 1.5, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../src/taglib-1.5.tar.gz) - - -dnl untar the sources before anything happens -../bin/prepare.sh - -cd ../tmp/taglib-1.5 -./configure --prefix=$prefix -cd - - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() - diff --git a/src/tools/taglib/taglib-1.5/etc/taglib-1.5-length-in-microseconds.patch b/src/tools/taglib/taglib-1.5/etc/taglib-1.5-length-in-microseconds.patch deleted file mode 100644 index 44c49cd15..000000000 --- a/src/tools/taglib/taglib-1.5/etc/taglib-1.5-length-in-microseconds.patch +++ /dev/null @@ -1,127 +0,0 @@ -diff -ur taglib-1.5/taglib/audioproperties.h taglib-1.5-microseconds/taglib/audioproperties.h ---- taglib-1.5/taglib/audioproperties.h 2008-02-04 16:14:46.000000000 +0100 -+++ taglib-1.5-microseconds/taglib/audioproperties.h 2009-05-01 21:19:11.000000000 +0200 -@@ -65,10 +65,15 @@ - virtual ~AudioProperties(); - - /*! -- * Returns the length of the file in seconds. -+ * Returns the length of the file in seconds (rounded down). - */ - virtual int length() const = 0; - -+ /*! -+ * Returns the fractional part of the length of the file, in microseconds. -+ */ -+ virtual int length_microseconds() const { return 0; } -+ - /*! - * Returns the most appropriate bit rate for the file in kb/s. For constant - * bitrate formats this is simply the bitrate of the file. For variable -diff -ur taglib-1.5/taglib/mpeg/mpegproperties.cpp taglib-1.5-microseconds/taglib/mpeg/mpegproperties.cpp ---- taglib-1.5/taglib/mpeg/mpegproperties.cpp 2008-02-04 16:14:46.000000000 +0100 -+++ taglib-1.5-microseconds/taglib/mpeg/mpegproperties.cpp 2009-05-01 21:22:36.000000000 +0200 -@@ -58,7 +58,7 @@ - File *file; - XingHeader *xingHeader; - ReadStyle style; -- int length; -+ long long length; - int bitrate; - int sampleRate; - int channels; -@@ -89,7 +89,12 @@ - - int MPEG::Properties::length() const - { -- return d->length; -+ return int(d->length / 1000000); -+} -+ -+int MPEG::Properties::length_microseconds() const -+{ -+ return int(d->length % 1000000); - } - - int MPEG::Properties::bitrate() const -@@ -218,8 +223,9 @@ - double timePerFrame = - double(firstHeader.samplesPerFrame()) / firstHeader.sampleRate(); - -- d->length = int(timePerFrame * d->xingHeader->totalFrames()); -- d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8 / d->length / 1000 : 0; -+ d->length = (long long)( -+ timePerFrame * d->xingHeader->totalFrames() * 1000000 + 0.5); -+ d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8000 / d->length : 0; - } - else { - // Since there was no valid Xing header found, we hope that we're in a constant -@@ -234,8 +240,9 @@ - if(firstHeader.frameLength() > 0 && firstHeader.bitrate() > 0) { - int frames = (last - first) / firstHeader.frameLength() + 1; - -- d->length = int(float(firstHeader.frameLength() * frames) / -- float(firstHeader.bitrate() * 125) + 0.5); -+ d->length = (long long)( -+ (double(firstHeader.frameLength()) * frames * 1000000) / -+ (double(firstHeader.bitrate()) * 125) + 0.5); - d->bitrate = firstHeader.bitrate(); - } - } -diff -ur taglib-1.5/taglib/mpeg/mpegproperties.h taglib-1.5-microseconds/taglib/mpeg/mpegproperties.h ---- taglib-1.5/taglib/mpeg/mpegproperties.h 2008-02-04 16:14:46.000000000 +0100 -+++ taglib-1.5-microseconds/taglib/mpeg/mpegproperties.h 2009-05-01 18:52:04.000000000 +0200 -@@ -62,6 +62,7 @@ - // Reimplementations. - - virtual int length() const; -+ virtual int length_microseconds() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; -diff -ur taglib-1.5/taglib/ogg/vorbis/vorbisproperties.cpp taglib-1.5-microseconds/taglib/ogg/vorbis/vorbisproperties.cpp ---- taglib-1.5/taglib/ogg/vorbis/vorbisproperties.cpp 2008-02-04 16:14:46.000000000 +0100 -+++ taglib-1.5-microseconds/taglib/ogg/vorbis/vorbisproperties.cpp 2009-05-01 19:01:15.000000000 +0200 -@@ -50,7 +50,7 @@ - - File *file; - ReadStyle style; -- int length; -+ long long length; - int bitrate; - int sampleRate; - int channels; -@@ -85,7 +85,12 @@ - - int Vorbis::Properties::length() const - { -- return d->length; -+ return int(d->length / 1000000); -+} -+ -+int Vorbis::Properties::length_microseconds() const -+{ -+ return int(d->length % 1000000); - } - - int Vorbis::Properties::bitrate() const -@@ -173,7 +178,7 @@ - long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0 && d->sampleRate > 0) -- d->length = (end - start) / (long long) d->sampleRate; -+ d->length = ((end - start) * 1000000) / (long long) d->sampleRate; - else - debug("Vorbis::Properties::read() -- Either the PCM values for the start or " - "end of this file was incorrect or the sample rate is zero."); -diff -ur taglib-1.5/taglib/ogg/vorbis/vorbisproperties.h taglib-1.5-microseconds/taglib/ogg/vorbis/vorbisproperties.h ---- taglib-1.5/taglib/ogg/vorbis/vorbisproperties.h 2008-02-04 16:14:46.000000000 +0100 -+++ taglib-1.5-microseconds/taglib/ogg/vorbis/vorbisproperties.h 2009-05-01 18:58:46.000000000 +0200 -@@ -70,6 +70,7 @@ - // Reimplementations. - - virtual int length() const; -+ virtual int length_microseconds() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; diff --git a/src/tools/taglib/taglib-1.5/src/taglib-1.5.tar.gz b/src/tools/taglib/taglib-1.5/src/taglib-1.5.tar.gz deleted file mode 100644 index e0985620b8cb0aaaac210a1e57eb9933668a3e76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1394506 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 &2cRwTAkrBdO2 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�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

        cOkMxo9*(PAxjT*lN{eZyctuOgC9l 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 z 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%0AbATr3q(%yFfv6YBJr@qEgfC=% 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

        BWwYC~(dERQQ_gMILc3OnkTpZU9f_ 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

        +^CmN3@+^U6!HwIzr~$i_e;ir4}d%VZrsuL^(Q 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
        aq$V6+CLtZsmC^!_-FVT(L+g`R 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

        QN;kqHVc!SU;?mq1?NA^O#3G3`M*>JP5z2zx`L` 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 z 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 w%RM9g zzjK!Uu#my)D+M>$Kw<9|-N~>Yz)bjcZR&y-0wbUH^o9wA3Jq#w&8>9Oy^ORKN*he# zar-R{cRTbi#xh2gJn@rA3h-`4tTNWgbhZej6zg1yrk>K6DZ|$x8H@RZ3i0 z5*c%)Rlu!8QI(Ze%L??W)wtx;W`J0+K*)mX_)$qA0?@eeXyU5~);Wj*XRD`d^*RB* z3y<-L!66)hc8Ot%raVxn#0+N$Y#hDB<_kuUm7LbH91Z-JHEHGLvY9tgUKZ{`S?Zrp)>}$SWdeM{lV=7?;OV&_>KFb6kEPeefD%I zBJ0W=IsFZflvAo-nOglyk?L2bRKG%IPSWsz)W1iQA)Y``W(Y^BYPZI>g_9xOKt?Fo zS2j?%d8v5p0K*(JI9|K7H^hw)kkv$sgDvM=>HyOo6iapR5dt|UTWZb-I|?k6L5z** zN6}j`IqhHKKBUk8DEY1e3F93PHyKwqZI9p zn1U?w`5KUvp`oq%REbpSJ)fFkSDZNUc) z4#@%ika56iMN7L;phMm>orH7n8DI-uOvnMHNheAi*Gh|Kvz8Vc$BTf^$ftg@B6ls= zjd7;q<{w9kuf6(zHtPSc{YF0AtAF1np9hU)w80u;#^ZIh<>%Qor!1SrokiYBVWq|G zu>Vo-r%CH&nGv$0$wt~$L}hnpZ+mawl2o~4uVEQkgc=w!Onq3&5qMn<%=+5^X6r|0q&T%Z8;#Pgy_$(Jn1rj{sy*fPGf7x)KSPK?Bm3Rwj5lWss|I z+B(ekF+eOW4EFMpDrNDrWXx~)S$oFaSuY=FtpFR)h-Ov-#mBO2cSydDa0=WBNNNjO zfq-2Jc+r{4oU13u^AqS`JmIU=BD0kW$y&Izd178~p}_2< z=f}p$ATd!artbQ^xN&yH8Oj)Q1FNvKAa5qHegiI}ANXV0;|8Z84k++@_wroA0Plpn z1ZNdisZu&G-%?nt3uan`%L+D(BY)@vGP#v>dbTLEUl{PC+r`YhPG8}EST#z#qX6Q z|H|{gN?NhlKXB#jaOgS(u8^)Oq${PZZP+f+qQ}4J_-Oe*WiViZp_=C-A70QQf~)^x zTmO+H>qo0WTBL>8#Ko1;RvRUBFs1fu*+{3Z1nLm@3>TVAxh}xpwqG3V?C)6sWy*B{ z9vr>^M#zH43D*Vp_$7v@-+ysvLDXqwTgJC59h8utRk}xt{XVMC;%TE#cC%x}?$T!< zJ^{<)P*B$3neUN36iUbf)Qe>hfC)XR0I$`{C=9p$98t)0XW!Y}-+Qw2w0*F1xNRAG zLnAK|A4`sh6TbdtCokxqCskD1tdX*(yrFGipUdW(KkhhRlmh|o~%#S0aBw9dEr(x25I z%@3kkO}0?dSs@z9FD0V=32$21LlcwMR+J(wM0u-B#>FRIe8xtMJum2!e;xK-V#NN7 zq&fwp5CJerR^i{5RQPAsRqaN6nDg9_*u9+Q%pPuDBzEB`!?rI%cW1 zG!iXVd?6|pW&LZAzlU@Q$wwN`8+jcjp>p9KPtVO={?SU6PRv+cgf=4?;+*^(Sh|3C zQPNd5_Y9nLC*P`o;HdQrkmxwh5_+lxwtJQaxpMY`P8FhlSNc2fvOOVKdEwA%@=nW$ zK$#oO0!kf7fYrIPvzjRE+}v8lG)G|*Cac3;-c(DMA8f4)HB{-kpS)T{GF7&{s%An5 zqaRJeEPS{HkgIZ?u)s7iscY)MS;O=8wfaZGGa9HH^k@cwQ5$I0CuNqto2LAMxsicc-`MR?NyjqcUmJ zqe|NYnOWKN{8U-iv}$?3?G6w)D7=iypm0XS%7+Mhqbge~8Z~|4$9CkV*1v3(TJv<9 zrtZQ2nQQ%l3K>&v`&D~pWVjIt#dac@~zPA4{ayPgc=h9J>6Z~{`o?uRjX zPw_f1AztUQVYa@jUZsfCE=YWeRB%hoq#o%RtBY5Gx(RTsDDZHFw+y3b5J+bQq{%sD ziCq&KQ=0d)+KMKr(qRNDrqQ9cikBfx@|pn$Kx>n(vOyqSFrY&IlvdvuuB4Pxot`HD z;l_9|Zjo+lXE=m|G@33{l-)*^FXBlZ4!>=RdI!F;U4qV~&$^8Y!^2KeQ8W#aS|X*g*~Zoo|~l>}+*PA*8Pq~sa~ux|XEv*A!Iv3TvdrI(&v-q_Y!)0CN|woxYH2A;!PY9!xTT64g)5HF&}{8y zl`;(NN+nsbMLaBhAYHs{k&jsf#BwcX4YBfx!u{6Mex&C8NKX7TVsdlHMHVLAr4dC! zO1`Jhq>-)PtwBjlVz+l=G~(?_cUyRc*&TW3AzMdDB_OR-I`VI>KaJ+2a+^hecL9VW-v(m>i?Y2y;S#681U9B2#9-Z%C2 z)Fhn56Ev)|)Qa?8(t=xeYnDM!5U`_ z(5!V)2*j)fP|7_)OQ&4QZrC`auv%8x-uz|1y(h}~xzXhtXWQh%G*oIB#P_^?P${WV z;qr-YHH)+jcb6Q9mKRRP!Mg3V**cFTohh?CJW=>~3I_06IGzo&C@v5{VZ1M|laVDV z;^sY5|XmKcEJf(v0P>L!7bG|ivJd0rRX%mo5lL|#wW`y8LG z)Oa~fd{1b4_%WG*R)IbMsW0S=v%XxXQ$>k%8)l55iRb`lJUny&CPX31uxE1WMT*WC z8)cj&oupemp$ne0)^fF8EwQND$;?t_o}SJSc*+&|@(%XY2soZq&ay5zCplB~2PbIx z%*!_J^81#AGy3B1%Xtt{i7jrT>vF{>FxeHn!#UXyi3KslDBrnBjUoGg`v z{OF?+gwTc52~{N+Q_ZH}mCGYe_Np3Q8A&QHIZc1=-yx7|g>P=-Xei)Li zKF=mIrVdGBZcbzj$Qu)wOi)GG&*Jn2tC&V!)b|v1Aq=@q;*x4fVcMcf79=e;=HPQt z!a{kOTF}HuvO>>)Emff^rxF#J!_X8}M3EHvej|z^Lk|g)X1VN zD)xpo>kes=-)9pSyP{hoFHWq+n-Z8DV7E(ROw6P_B4cu-$c#jq+axp@?I}!ZtoTpG zh>eR({8p6U$lOdyL%BO9P`jl=b^UdpVPuDB@lk^>_V*Ss8m^T#)dlHaW7wGu`K?-M-H zcueD6tto2-SdT#XC#ZQ7Q_Sc;pkkB%yDn%{iW zJYA2Q>pXLnW>cvR<@8ksJ1X_J)CuJzHIAtlX=XSoyJJ z6d4Tm?(7{LZtU)ovE|#YFV`X`w$T(nY^gk@jB;)1H8i`t{Fs2Fk~85QY`)leewYo8 zza^n@D%}QBXdX|TMv<1xD*R##lp!lzdF1AaJ)16~|2BWLgj5S~7L5GoHaeWQM}hK8D#@o$1unPjtSf(&}mX|+niY?E;R zfWKII;ls|0omV26djr!FNr3Afg4i?_u{#0z8jF)C8lRxIxftE3_WIFqc!}3bomhf= zAhfNqEOZig6&Q?^LRO{G=&g{pVlbTbQ*u3p5T3{mc)j>MwxK8xw&@3q_C)~0k2X4^ zQ*6P(Z!cs6CY_UH(Xnzirks@908U5IWGKo|pw~lsuz%28MbR|#iU~+~(e7zmr9O^8 z4={s_Q~d#YQ|thUMzR4Yls)ljlMnr95<@}DfdkP$3YOBaE>{|}xnR185|0nI>K6V; z2vhmtX$7Zo#&oTsmcHa&Q(QB^J5%>KHx`2a<>ummik(h03EAG+3fG7B4yh0~7i$ekVY3=B!8O5vc zR}MKmvAP;O>>uCJ$z1by7mP0F; zXWWqb9tV$!Mq?9+gWNH*3kDuTzyn^Oth(t*2z=JWMI$R!mad+|G-$5mobxTbREu)FSuREP2ml5(xsa{Kt^exq+(~z z6cA_zHcK{OeS9Pho5?q(+&k1D5a0Cx#@J>~FpLuK43+oqyipyx@e$7pJE$TXgl}W} zT-?X|Z7Lyr3^+BmjWTVUEp>AIPYw^ANNZIq?`6`*YAK_v#V@-_GfQGL2d5k+*rm|z z(xV3t`1s&(4%r8Vvas+THlSZ?e7**Pg~&>I=y)be)l5|F9=iV`-W$<(qL3*B#6Rch zs!8(+sph~VTpu#q$wILLOqMKQ#Y~vVUZsm_Db0WixjY_4lEPfO&tz<4YnqjJplYkz~lXVNn(9KftNfvbSsi}k-W8dc(4CILh z<`sHuhNZNimU7u?Xqgl`u_u?>mQYe+`I9klQ>WAx4#IP;SWteG6QrsCRsYSze&?9$ ztb!@4SyUGFf<1%<+eRg~rK)P^^cwAxaAt*BG=R+@XRed;GoPqG-~HOEk{D~&3#Uuy zXO_-dJ$J|W!F;NNB2o9Tm^FcHSK;_p(Mi$sI}{4~ABtvtEnUS>~9_t{w9o9Heg0RiXf;J#5uF zvr?*u7iB`0MYEf11gh!3ngz2gWv4>NXtm0^T~0x=BD-)GcX}f91H$HkH^#HAjIn$! z&1F0#{OKe9u=7jc%+Dx3j|LO;YUYR)V(?aFj7Rq>P>77P@Tf*dDyR>QNj(ifSE3>W z;yEm##;oe6!-2$54S*ZucQFLzq=QaOq)?0o){SwBf0`10mZoXp3qgl|VX7AIcR8P1NhC8HrA; ztibPswuIJ(kF8{8ZAhEQH^qEHJBB$rmL;l|JR8IB;&mL5Bh`y(&SkCu0}-JRd%+@0 zRBHCR_1NpdF83Cv2N=cKlFqDRGv%Dme%;!6(SB}5J^LI_@IITIGm)hk4ad#6caAc` zYl}b=5;q>OQ~F_9+4UrBwBA3Bgv|-4fE5w{bv&aI6AIXN5yVdEs@&^E^q!2~D&P>_ zkC#N1C8%zmS>KTys_zdPE6YpD@tsJbQEOU*btx&Hl5X&%7d$PJ62kIFmljF!hICa_ zhK-U}gS6?g3(#5ZlgXrHy*ZeK#c?o%9o2vu@sHUJjz-h zS&Bu|)gHDCZIjm(@&jL2pqYEcF?m;a1WkC-FpesVcBqJ@rh-z|QqfXUcJH0P1)doG zg!l*kV;XfwY;&kMOEh+lUS}g|MT7v#)!X>a`g>usr&(G@trD<|~GR6Q;JDvZ|=lB_uaeTWrh zz<>R1+jTY)>VD2nf-_NgCrM>CcQqDqHbbcp(Gtcbafk(y(_5sRbuf8aEg9>ze3A|S z$2L^lHkI=6U?$}tyvU*&@&h6847U^tSQur3;^ar#VpJp=i*v&UeC(j4u!sp*@Qq)$ z>v(Ve5tmRbfEZ!YQXv^re(|hDEcN27GDJ=ANo$p@TH0iHo5Lm$oVfY=56h`!vyCcd zCBj^f++4J*xkO;>Q-UgJ6ItMM01ep@9w{nZj%de`BpwdRUV(t<=oYm4NddtG4q*X9 zif#s?t=tL*XU}9*VX|2nTdJK;K1WOn$xc zW=(9PP8E73Z8XX{ZUy^mg(l%vK2bO6$IfKg(jKbB@;`sfyVtU8;7`l4ZSrPYx$>AY ziSr%{$Y2>@iPYFAh#2-Iryy5tk5DqHUL@i=>F1kBx%b1~z}D5Wb4 z$FI^1nNpI+&Zu#n-3*jnHv>SISdKj zl~i9IX@HGV(N)LZX+JnA3F#WIwbFQSML%{zd#^J->qIdK#zSAqGoN%Uh8FxWnT^ww zQefjoskE`VyT7@y3p7MN)sbIzBv&6jlpK2fI(@KJRX>*DTvOV3dAN_#afBfsvw+BJ zV_ig&F7=pG1RFc8;$OBmwzgkLIQ)_WiDQgXL9B0Q@5#QTocNeg2&+aH-&n-*j8J)R zUg~%dqaAz6kv3XxCP;r_hu=|&CJ1FXPV@*6^Q{yLZ-+zp%ID)_dap9UQ|AVNf-90e zi)i?i5svY{MCU$?jV{XS)AEu4K~RJ-T!iSzK`LY7RoN(t6eNiV|nvGjM;}XQoQ!agJsT}i@?hQ}6YB;me_4Ay3xlNU1 zD@)TbWajx-;!D;ESbzEiXJ9@NI6i8ePPsTfmh-_)nnh!-O;Wx*3SxEsR_TZZH@Q_aUIFBMu4!OjxKSnRu%ns5~p~UW= zh;E?)kriS`YetdHB_dPb$GfDR9yy62MO$L_bQD}2$`@8|Z$bGUuvUv;nW;Ox#PO2G8(jX@0?c}ljwVw+GpyO^@mc2yOXIwKxg%n4=* zT>;kPGKG)gVrlp-l|c&6y~|k0 zW9r7U!;KeH!ms0j6tm!Y4u3OFWzY~jQ{jPdjA12Y&X2G=!Zut7G(qEDq}0`QlI~1G zH{S*1s!G3!t~0NawPKYOF8Y~8yH`Vdta$aV*Yi@*fM)eN7Z9qJk_vU9{6H%yi4HS| z_Kx+TKkAdYE2)s$C#d(Ft&Q2*m@RwXrcCHcxsuGkPUvsmRSw9k&@GVx^@7x*jq&p-Yt?=+l#d&R|)Uwzi*d?Yw9) zCficek6nL=3(pjnVJcjhDiPMukfYPE%`n}8*rH#S6iJorj`-mRQQh9#s?t*FM!{HL zBT$zb&wtt9``4OKUrUg;MEa9j4VRoHvei<5(pB<8z`dIIH|pKWm~a%!lV&kne@GpnM?}32MBWf2liyGsueeM=LS+lbb>v67rjM! zRER2uMAcc7gEr1ZCATV{(o`+guo2Wu48VeW9~^&H&XRseU-q`&0V0Yu-7mSKUW{TIVkASrgU%cFI z>9;2vy9e8?>Yb|Ex2;T=>gLnlq^Iy66vuMb6hM~3gARGug>}x+d5mjx;4V}I06{(_ zfKqYEHtsU5GTyT0WME!XnPA~R9U}yt*-nRxIj#YCc{)@$8%~F5tgMpZZPheR2b90?4e2y9eVR?iqLXb(tm~%aHUtF|o$>TGaGrwIb7qNb+Me3r8&Fdi!-VOa z9!xIX=H|!FEb5c`)B+kw*x{uk zWYkz}I-6b*tWDrHGzE{B8lSjwhZ#=OWM(mSlx3!ZgDi8e>lSeWv?=4TmChrF)(iyu z+;5eY_x*B-51@bBKmecM9`Ll&xs_W$fb&I3@HaPaRdBz#nJKT|+-%Xexpe-9(s>%l zEZqD&GJ0rE#c5qB7aL}t7dAJu&k38GfBhX_5{<_=@X(T3WaFAt;!7h6s>`3?PA`W* z=s~vf&56aWT;<`Qem)9eR!>I5vhMG$L^BMoYG^tzckUlmh*yDHOrOFZuvw!6()-mhvG%Vc@y9PjlkySNj% z)MP4oxE?i_Fa83HUnuk2_Q?M?g@8wq?3^UnB*D5$n^r+fl(pMbz*u*qOpUT7P1lYI zgb_6+=kzm>ouqG1-S&hL8r>js3p{ZWokpP!u)xc zN5Ud)w|v@%a4g@TqH}xlw0cySx&AHGUaiKXF zI_E^M!HEjDt;WfKRHU0mixMK)Y^w7==(1!kxBXkt8h21XBZ>L@3U5mytL;foCvy?+ zT*P~OB3@~0VLNM=I5*pQD72%4A=k)Kdeb^p(c;HA^h_BKd|w|y<@kL&(I^$zU9Cn-4*=X>&!~u? zEdly5u9&oSxjU{N!*X22nH^m!)p`ldxQYXC(ji-Uak0Xg%hIdOQ5hYwEgv28&(ZRd z;0$f7pmij(OZPR-H}i>bh}{ZNv(T+jqR$npebob~w_i z{8Y-@TaGF}0kx~>yk%VvPNPX*!r9Cnxp!aPkiGkCWA)otH&(xW>ai-hUa*u_n09W` zTo%UXNdx^KDvu^u&~k_JV+x4nG9?$bA9hplOF=j;4Ll%-i?D$sqktpMzTL&W_0mVx z0vsuHhtno|9AdC|TQG@cDOFh)+B< zbjvgHPtk~ufXO%~?485!4`C04EZ%9zVNS>&xtid(MwTaN;e#}mnu4Om@gzVx4Upg{ z#Y%kzEqW{xts*nBGbSUBn|U@W03*|?hZPf*Ii7Y5C)4dJ%Eo7Lme z9q8|F0NXcodI*dOg=eyAhS4I1gxaYjo&)4b`oUYjf7#GMOHU)nyP!VfTA-44uQ478)Myo4i<&aS+K7gxYg!V-jRMXw9Ke{|1G zY6FLY@vZ8$5hW127{~N#;3Nd4lHhgOd|&2@sx&ItD~e3D`bfGhmP*qk!@0S;e);oU}L*a>Gc=-msB+zFos@SMh_<^^5>L(2i}l=f!U$oi2t7aTg7;TiUiSa)mFk!`Jx+Dro1Mq z72D2OIZN!t(Aj5fy1F9RsVQkcPKV5z@syDd5nqiTb^ zXUXumupo70X#7}Xo4E5JmadK1iy~ThQu*yy+uN@W1^P0oQk+o$fDsRH9yzjUe5PYL zXmN_u9uA*`O6V-uk?~H+u%+A)OV^#LlApTa^|NLB-m-37cnUgKg|$ zII_olO;lh1(Rj0bw0P8LEFUew&V}LexXW0dgFED>&v@tdVK>1T;2JH0vD~E)06OPi z<5RhXFN&0VT^>vh=!{)galyoK9gus$1m&s8Kt5E|=OE*VbXXlBt%oid1B@NZJ_j3E zdK;mUmv0O>ghs|di<#CczNb z%(=m-ApxU36(#FJzelzc)v19KY-t$JU5+qJeM|>H&>Mmy>D6a@jGzLet3=vBBG$MP z$?5#j{2-duOiK=I_6*5{#fSlQK@^ZIsaZzx4W$ydSw%u3@$I)tB=POHCZtKpQ)VhH zXUdH!swS(tWiY(m2?i9j8im-6BzH6kSri3ruL+Jhgbw!X^5`3b7;kc8j|J@&R)Dis zhDiw38ZqL03b|X(DwrM3>&ecmXWMJY@x_UDVl+SuJuSDZ6JI&!r`galzWa@P>_C7g z(*S_>)VNDL#AX07qCkM*oQt{zv~?rcoip=6)kagTm@0{r7r%Hm2pjb&xgYx)A~BR~ z8LCCwQ--{Sg#5%;(PEQul%fr9U^B^zTshk_>jKk(va>)E^4wrz@ zCvXrH$F_t;I(AV>RYIxbAz%jZ$W^g;?)UqE<0o)_dxwL+M2=I&og^4oF;A>8gnT2m zd3kysz!Jfbjiv^Qy>o|lcwC3*r0G&D1`WS~qL-devDaMaOXUB*PwraI$x95v2O!6z zK{a(QbR& z@%nalzE4|sff$2{pbailUP#ZtoZ9kq4eT8Dc9^;{U|~(-WMG{b`1@69GGHFwcC*{A z;zZdlR!C0>3tZ$l#VD>I^cCO8BxW_T9#8(Av5QHx{t7lS)zZIUFUzC%?r2_>;;;X8 zB;OEuMd5j2WKwt_?2V&EN#3PUZwg8OE5$Fl6xt>XNfQ03c7@xh^Xj`nqhe2BnqC)) z&u2rJwndm6L|ykE|DUxL@JHMVBra9>`<2fkCiWqE+%qzns~k%5U=-RUTz4ve`_1A` z&=2Hz03_%Y-&86Z2mUr2iec$TE9tF8`&#@%EZ?<=8DtiA z(NQTC4W8ktsaE-9V{X1>k$N5QpDbP=s=?+us)!lGTKfLm5ZDJDM3SP7}(kwcn~FYARiUp1LKc(baTLB1}&=H(STr z`pwS5#&0+&1n?4F{USc2-nDdhRe8@3M85DNX*a8n{CkC1hMSvGH!>FWV&WmUNO3Lx zPN$vYA+b2kRo!(ky_LfKlDtWDa!FBbqD9h~q4FhGXPxvfp0>|v_MB!Hq1iU3eBI|j|wutsen?D!z{Z+><(PiC@ z&#|Hqv%$?&L2zxF;Y=j`hmV!9nb0jP_;~(h!RPcadUh*^y73gQbQNJIZlkgE* z#?fozan$!iHi&q!c_1D(zOBX>C7a^)G-BDhcs!bP#^PjxJ02>2UZBvogi&_HvRGUm zb>e8~hf8A7%DIdd7xab=!dED{v|hrupaag00T@=&_u$C`q5*q!yp zJbWFz!M)jmfnlZT0a|jpq+VowH4U^T02P-A8YjhA%{#B%N3)T4@`bHd7vI%}OPCS^ zBA!wk;Ty~genGHHGCR)Y;=3h_cZjilIQIJoPsD@9J+X<=vHldD4ywkGH6>cc&A&As-MhzQMl*K{lO+wbB1%w_)G~slQ8;>Ww9;-p4EWdhm@yjn&apqr8 z-@Fd03Bwek%E34$A3CfQ$bn=47zT$S>m;PaVuJRa<4Nd^{r+W5$9N$WfxRpo_bsm65~@UIig*4k@rTfIANQu&<80*mrr6?`@o9|35N4=}drPR7iqEg_y%Biv>3m)>pK)MvPYUwx z6{!UKuc-go_rlZuyM7C{0N9DF1P|ts*Tqq3p}ql!h5Cjk>Rat!p1*w6KG=WxVspC; ziLW}C*xr71xV?ul;SbvFG8=R#FBEcLBklyME~nY>`H^LQWYNr!M3XP#;G*;nqz@0L zp&SR~0=ja`Z0nN<<0UoaCg+l@)cF*f~f z<~bzs9r;~WX@I^It6>txli?8dUhKU>)hkjUtEX&&X1?3aI~@2w^4|Vuip?J#*z3n|0b6U_UlDO=z;fk4>|Y zzq~aURY=`T;IgtIS)^s8!>rjpZh!aL6{d$4!{}HF`I~N}{Zoie zMQu9;=AQaShWqKJc+xkSHi7So<1OG1>e{&Pxc&?h&{825$3y8~h0WJxW5iY!`S`(G z92bqe@Iv1=qakvVG@{7W%JEa+BYU{cO=QqOdgiQ-d;-JDDIWB-?_rcs6P^+4?hM_T zOE#m^O*ia!U%CaI1pTg5L}I?xMnSf$`_CXXHfa}V={P1pg#A!(_A2|)1DWq{K-G~_23#C!X_9yTEAN!1Up>?_T};H_Jy$OO@u)N^@8hKZu43oTvl- zB9{zlI8SV;oPfP8>&_d}*MtY|$82defDl zRDf=15=ghsKs*$WtQgI-gH-Q0kyOX=xLOISjWdj=nh6w}_>ySSu~RK<@ zR~lz*2cdu*L@@Wz)$d^OzehLJwU5n{AZ*5G4Vh;gO<>d$HPAO1K3X%&@2yy^9|gZs zeAbUn51vQ%Co80IiSL+Eoz^S_N(>{UFic>Ublbfi8GVyO0PnO0y969>!yq28438Xj zToP@nb5Z4%`Lf#YYbZ2CCo;w|VTpf%1T;X|&IrA8#8SE=9PfJ5VwtwYg%L?FbR0k3 z(x6be4kZ)`1sojn6oGj!xw+H?O1{g65`7YL7g)K*U@{qAZ$;&$J{Nx)wh~o*yuH=Z9W)%~o z>W$vUC>rrYDV+SB1PDuj>IdYyfxA5J;xw?7^il;Q*Pv(}#3)zwR3nJbWlt$xtcu(? zs62fL4`KYL!I?tR<1M~mXy#tN;bzDIluigMRo(i_*uHg!i^Ue=_xtzq!xYGxHr9K9>_JTzUNi9%Z3^* z(uh_QZLGR7jt?KqvfwGGI^f*wOYYK9NTZ#JC_qJcIz?l2p$xK1KgxY7u5xre|}Su4wKL=zP}-MHr9tO>KSlBbT&Uh*DpgLu#$9=LqNz7urGO0$2$#v z5Or8kUGh}u_3MC<@TJ)gU@wM8$#%=CJ#@8Aqu!3*wt5~mO5U}YFSw160A1d_Tq=ig zc!0pe+L`Zl(P1tgvuW$&+eF$wVO0{(jHrk%h;immp)nmQ&u->L4+zzR~ zvb!1dnmW-UObcZlv|^%*?F95ZzdN1n5Yg#21#N`~-aFZ5|uqZoA$_CI+Fm&P;5 z@*#0ThMZ|?OfY1K4n7G(Uy#j)-SZ134SJP#+E%AI-@@JdbLz9$nLJX8okZ)#YPb$nQdWiH@?A z;AY6s0oBEdoKT4c&kVQ3AC#-=IXgOMN9XM5eEa%}wy!xmI%h}c>-q1qp6Bf7r({Rh z3VQ)`CBm>CkXJk^OL_>zD;Qrg$-1$#?c1)Xh)1Wt^RFMMZ9jhb)CMiXJ@R%{K`+c| ztEw;8~h zmo?`+PqCiwk$rxz|^(Ugg9w-?Rgk(zv1FCdO+_xjes0-1Ae^^@0CRfdlb?>cIb@g>X#8 zbc#+aoUKk=+vwod)8eo52*x*!mQF*NgQmPC zWTMok43~~;+ihYgA1!9f@DNQhWqADI)5lE5dS(VqPony`%`^@=e|uExe>c+lEmI~9 zby}=-wX|f;Ijy>#XzOZNKYzIO1fkNYnE}_YM6@idnG$mS6B4kj<`)UNj@c4X*Kxjp zV$CD3&m*rVBd@Ck#H&WfURMvFAn3TQ+dmIGp3(4m*zqDmHV-@gC50Woq1$$gCfvYr zy9K3~>-K~sWbV9u?!5i$z3|Gslb#0GsNkR7YD$d+ry}G(Lcc;u1{0+ju+@3#o7x`Nm3!)^Cw~3q?Ufr=_%B{P; zF_=4cpVRZd7d>~-{ZsjN*Xw8Q-F?1*{zePvllgbg*vPVWIP~%E>`iko@AH-Qw^&(! z)zx##NoY1$BOd3zVls3!biJB zBGZ1~6TE$<=l2;<^FV5$y7zb1;L{!$ag@F$4~(x~&0R3gT`=u<*V*yMk|Mvb<&4kBd_dF zSDVi-mL-|677MlN3l!nsQBE_Y8quA=ykOj_2RQdK;n~jK{tHgNXC*)1INbbYcl)>P zUHPq)R6_2+nFO_rn1wm8Li!n2-7=9rYrf7!uwJ_*#e-4+boh$peICdB8;1hkn-!F*s}ecliG>!f_eZy%C?0NLp4`;VUg0c!uaO z-O~V`Kw-aIo#RTuy;V!PQ%F>os4#t9SHP`83Z#~>=!YxnKgzR;tO%v{fS|=yAv23- z@qRd}bdA(HCb(91U_@wFy8NeTw3>J8wSTtZ->}{OXZ4sl9O%hAZ`2|f*7ayb0|gW& zzJjI@xsmr3Ef~*J|MkHIXQftJzz2&^{yCMcps+T;a0%hRGM#;QBLgBI6){6ZjRJ0;rjPzazkH zsSH`m-V#e1Yv*)6L*QtP^JykB_2n;0)u6B zGoCTDbm_WW(C>K7+K;@h->tt3M&pUszYaH)0j3C7lu_&};g0@yoJxIG?&uoKQ5Hte znWQGr`i`gTy0s$ zL*VV)7FJzZK6ihHu+32^Pv^C-udnS3)KsCofx^RnTR8@`s_X?qWLE;{&?E0bSv6dn z#T;J2)YvXngn=BM&iTbTzjz~lad!0Qa++6o&JWM|;hV`%b8&pmCePXAIh#CZ zljm&mmvPl>6KzSXW4|*QVX&%cWc(8_%GcwqHgA!&Dg^5@a8{kan6dg>uSUhr=mlU{ z88>Op#?0B6FPn||5}BCJ-9GsUd7nA&b2Hw@!QVLxG-rY4EYO?X{b`t{ zOv^>bi<?kqx8K%8eF*(=SOC_04cFxon#0|CFo$p~J#|=LGvhmw? z`|0Lp`?sBgoyR-7JBR;j-76)HGwpG-M(4ECX@^mJb#9xd;6suv99R6 zM1rg{$m{w>bD-|~Gp%!`^+rr<20G7K);Y^MXIbYg>zrl%oGfcL_wujpgHOYu z>VT7JXSd2jFRm^f^<`>i@{F6#UWV2aqgKi6Tv<$UraN=X(nXTmb9vdNPmvojg8oIv zSM2%qm_P%eCxZEin5+}YowP?4YN(koHZg64y^_ck8yZnvLr zzj(HDaIo{+b{oeVn=>+?#E;Fc|E?KM`h6hN`Z=ZI#mfJv z5T@EmRsb-9PNrMIFx4S9>UvHK!stp3D1dhIpAO8P#Gqso@=)ov(CO~oTSce@xM?V* zu?Lye3oLpQ1S*U~w~a`d$W#=eZWpN%h-Ez{_?k28v2oftQ@W6R2)qJf#h3BeAIK>O z*24<{^3WIO6a!;_mCvj}*r#}G1yJiM0JD(GGEV?pZRBqpr@$Hd zvRiH38=vmIl)Ky)cq|g)P7rqblddm*;D9QPvmaBZB`gQ%fDuo`@^D-e%P{9S-D8;l zHrC{aF>n^`HZPRL_nf!g_U_g2?+X20U6%`KvE7zYtJ?$_=D9r-i$avwYh@vpaLN`J znb2#aCUMNM$|CEaMi0?3g34((hreOjH_r&aFLsz`RK zjmDV6lhNCDXH|}0&B7CzZ*6fp`1^0HE+)X9r>bx=9|UHa3Z;}Z;@`{6E$a|=1kO_ ziTYxhs0^b0WpYr#VAu~j!PsSd?%jls$^m&5ZYl@FoTr-eRJX!YU5q-CJa^@?c(t!^(p(XR+oi)~&EuxrjgKvF1G1oX48; zSaTlhi{-KMY4=~In00-|D}oLT{cDBwRb>k?QZnzHVVW~cH)EI-!p<3^Ib$?ujOL8d zoH6?H7$Z%iKLG>8R+@+`=m6ox;o%Ni6qab|BMq#aMe$hDKm4~`U#i3No+g8a`!H1LcZ}ZB1n_DpId!rzRa+*g>Mc#$}rVJSS!AU&s;zBuQE@U`@Ev$~N zVd|j=e5}lH_iiJOj;(?U`af{_S2UO`+sgO32tbr`P5djGRNo=}AYAW~_ZoC35>3V? z+Hrj5jr?vy9G(TS=th1VR>$Hz8og!DBfoBKH^lS4k2s+G-S`?(5{wu}n9C2KT2I)0 zbTCnp$uG2-tLx-g=DpmmR$!On2V#9~r!(0uX9$64b1$WgkJ0k=&vDxyoRle6;DuxU z+HOn=s?ONgwAtjK;$2b_Ja$ z;~E~oV1FIc-*fyE0)?%K6TjoZM2QH$oCiQ^7X-!&2Sgc1QD2<;W9Bd*Q@4f_aqgqb zi}2JJe&e)(ZK5K2ivB|*Na2Baj^zA67uLy#lA15h1zp38y}*z^!Y6#_LKF4;Rjiq% zM5wvNFiOg=kwGe=Z~r@(Mcusx^vZ_wKaFF&gF1*N8R1+K_P0Z?IpO-OgzImIPjhnh zSCT9Iuk=48kDMvUK8wzYEuMrp8)EbBU372>r(QsdIGQfVo>6w1yF$VP9&xj3EnkM* z9Xfn-uABNW6oj{1(FBeI;?GG06>032GaveXH^vT~0Pf2>e zZo)cf0``<8KFWHa@p2s6(c4zf!xkV6DdAGz&b?7caxR2gt>S^QL@@4%moc7DEXShI zW0J%TpxJb^fiq4`#EewI=>**Yic@G#hsskHPxMB9d?q@hD30q2E$H+VHz?b4pa+oh zLq8Y<CF6-TAgxT|79o7UK*6Q1cL@^~&JoWL}D4Lv}$pkK2jm6L#LDOmk z11Z?QCx9&~FU&(jln*Y$v3J2|%rZ8b30s7c%nkw!Vj}5{FH+$B^FP;q4lqTJJ0%J2 z_)!lxr4w$u8T90F1{nTcX<>oT(jFSsle7RFhA~BXz5;=GX0yL)0lDSZG*4EZq9oTA zqHB`6_6bDWxLhBPqPKp?fMTQ%Fmpi{&}cXrH%d@$9E20!k%8xlzkPN-2V~^e8dEcb z7ki;kD?5gzvHA*Dya=ow=z)me2E(D>Z4{~x z9k)9z)}w3M?Ho!{9BfPSyCwFDDTGQ+8=M77P*>%a;8d#kxQ%1fJ@8Olq0`}@xi+tTZOeg9rb zDTZBF5q|$#Hir9!tO)n#c7k8pHPhFo_P#&21e`0p&lTS13h#4;_s^^FE*TFsA;@~% zx{^Eb^PA4$S}O*3qIdqtJ7xa*G;|8KPz%kz3 zYId3%Qjc(2x85Eu~MRTTT&J@j= zqB&FaB``&n1Sv(RKcQ=uS;Dwp5W+}J6~j@Mf&w_oYeaAKIz{Nl-;KB}Lx4tEaztmp zZf&>G^URZ-y^UQCN3TU^?l%raU%o?MEm?3Dgga9~l&>(joqiNgMzih*I8)K<0nTlP zSSCyvWR=4VGj?omzx{G=Ya9Begqj(HFN@|$F4X{S?(QGFe6gLFfz)R+33tR4q4bOG z=lcl57TIUlbZ1so&i8bWnW7?NK%RikSiY`W|NCLP?jZ=e$z8X7}Y1CR4%{v zF~bH@_@rSMnjbdihmD&bHXK}@pEu^`jrn|$7lWEUJ^pbF3AbD397e>jCVWhq-E2(HQ zgG|07cBAO6@W$lX!W*4V2569e?u*lC4BXA{zCdGESjEcq#UKhrKY%fa{h>GV#u59_ zz<>QQyJ!r0F^u@mlLNpG^1@kp4?iC(&o>T#X&-Dq-*~Zcxc{Q2CKRnYhi}R0i0L|c z=v?5^7Tj`aLC?Xf3X~#5geQfF3(2mc6O#q4kFDLeNdKTNY-b@e10*-l6i8YiQ&0yu zh@dkAbtq3!)S=8bL>+>WhdTT*jXKHi{{xt#$LaPkM~@yOj?{+A#UFHDKk4;?i|Ht& zvlYZ5ou9S^`IfySsE=igHg7gN`r~X1G9wKq<+Zj1K2aGar~_vyfybXa+G|8S?gkM$ zi-1Fvz(dsHlCaNEaAd*)YL~TIc8m;}1=`}x8qoxXq2KK~DdGcixb@H%RrKuHX~a?U zJwc9Zjb%(aT73P-QS;66(NeRqTsvB+aes%R^s#zeT9C(Q4Re{k_JRdqi>HnYauXju z7#Ecqte)a@e6+MIPBP6s(i9 zJZ=B*!;w7sqR$ZK192-yZusSsCj$0w`JI=LZ3|?E6)K0ian!1?1}=Q^e*g{mh?7^% zh^D~>TB>B_y&1KS;;{niu*bF^c1tcsCCVt~;>Q-^IKqOl^ExD>AK}Fg+N|o5gb)g?V};ixGXevw${YTQRzTpkf+x3|gVac^by{)2~)zWwfdvp(GNY8%4lKizw&*Fo&}VK1XG z>dBF!@oBKQ!kWM`Y+djC5n_#4{qdU>@q^Xe4=i-90_ZBVU4O99!(H<&1DL+5QJ|SW zKO>izqlvH4(-BF-sN2t`tK-3tau41KJ1sGm0Bx8JEbKGM#lf|1E@ZMbZ*?C9{V-w`YK;2(yE7!fHVM_w>r{vc+rO@N>w>jny$GGPZCr%edp=o(M~05T8oY=LVy|<|yJ1tr6YH zU~nl6jCCQ&dz%9JRaQS?x3DG!t4-8PI_13zW8gytI1bNW>_6Sxc(z^N-8neC{uZCe z;%o{x+WxJ*-yUrOdELF=9>A8_@^d%n_p+ruzQEIEslC>PTjDET00NEcC|86`=G=YB zE--V0N)~pi==(c%TSgMD+#=8CCg?Y+8S`_y6hEp=d!i`l=YUkRucAx z=VVH}SrA}{E30kKO%=&%XzR-Z8}`d)`>SFnVK4tNBSUITea>E~(qkP~Ylw$}0s3TK zs^b>v0I?e%;elh-a-8Yxg599k6N$_TP^KhtB~J0=PB&$nbN9IS&Q!y$R=@Yr+3wIY zC7u;RAH8(3EL~zq8m0XEW``w(av1PeoLq{^=H^Te*3F*9 z$|g*BOKiG3008Im()AAYpznL!TwouAJ_SecMxy}zb4rB}*u#L2nhax%OiTbYn}H*C zyhvKQ>488c^lu&lyE}%d?~3Zty_JX6VhMt*KSilki84J+F>CA2~E zo%7V{%JDx91gNyE>a?zu4UOI1B0g_-OKx8P$GKiEmleM35WhxoBWip=83K-=ea1On z%llzfsjR@tX*e@1$H|_21rPW?Xs0)ZWh0@+zBdAtqq|gnoaqxGMH0%8?L|BZ--gk7 zXsVDG;$|sZxsyw}(E3DXv_IYE%Vf)1k2*j|fyw~i>IEw_S+gny%9eejzI)>fb!VFf z6w)yA^ed7lEPcSS&sh2plcVwA7=`HLR7W4DtakNuCVliV8ev&qjdejed23~ct(699 z2nFp7aLfj7joN{4fMCe$N zTv*6>$U=jsDqV{|ezH}CwY`wF=7;1!n|>I(OJyyOhPFa7<=3ni_otnv&yE@&8a1eX(b`6KZQ%Z(tT?l zIiRqWwX4wrUd7O(yoH;+Wc4aB{UUyucGH~iq@AZuheZw>DG=EUATt|HgT3RYvlZ2D z!@-G$sGWtR8aR*0>k2fS>x?PP>U4kLg&-8dp?|`%%jFX9-K{swyVMZLFbr?1laI0jP zp14{NLmnS&QK(#CNs)eqgP9nSDp6dwaqro!abma!?L8}7XVvMuT*KWR_nx(=yoFNN zXXIGLt<#B7xWO-z&IxJG-JHi84~Fe=y)vXHbV@fI2e<-0BFfC&+9K= z)#PzI_AcW!4N5?jYeJrK6zwTLE{otaj7EM}XFMED9zB440a}P{>U#l&RCd$`15_;1 zu^%nEmEZ)`c-0?^q==TiO+bfiW>9D1{bfg1K%uJvL1aZ3=!Ce$B<68-P+PgQU|YzZ~5^C}*e@vG!Esn&(80*TeD0hB+&_>VbX%4tJGi)y_r~S0L+#ZF4QbGA)0@9T2 z++-nINaN;yDnOi-Ah92!jwFTsE#!s8%AZA;clX*Xqwa_8*do)IPMZ5vzBq4R#HPD2 zZ(oxV71^3hMn9EDas9K0^ej4OCZ-dehCz&RJ~=!QD!QMHyiqWNAu0l(&~6Cj&_1S3 zkfE{Tv*^amHA6-U)E;=JK?m6d;1-^3Jl)xBZ$8_qmQp$BsuSN^rTlias*)C0OLxSc zkDB1PL5$^*-|zTD`rkqC=?DbW8jVwc9*<$K9K_B72M|Fx_D4Kim%}atTzBFomXD%0sAx8Flgc^~gWB2$Kr8)YRr%JIcJ3S0UCC=~y@VG}k zKm~$7Cjo3?h|4g86san{jK}_f?y=#$I`ZW_jC^Ve)0<;6hUWo{;Ih|0hy8q+NKlPx zf^j$j)VLJqUWjNDkR3^*R5DWgc7)w6dBMd4+)?58p>-6?L`zjKpUg@peiUD|NZbt` z%qnBg-1hDh@%mo<`#1Dwxqbp?_}9;N-yA#^i_)5(cm5CE%g`G@34pg$&0U|T84 z!;JPOVTYJ7<$440a*VdLjrgqi;Qev&-6Mgr?f@^I2e_6$P}R!tB6J`+-p7?YEI3ERLzI`Rs8?tqAFGN%soXx47S(rmX;-3;&6wnbfCFR3rtHaHdm>I^4}zYmrHE7i3b?0J&tX_6;5 zz8JO%x)tm0C|WnKOTyVp_)u9FI~#D?owWk>kYnfWuUdPB9Q3o{ z&|ChCTKs&Y{$l4~lef$U{Vm>sp|^Uk{pf-0K|gh)dhMpmR#}Z&%3KLW8kuUG#Aw8| zV1!Hz;2AzV!Uy0_<8cHNLtRKQKSJmtZqCfTZ4`8YPi0;&xw+xZG#}4li%aZpQ%A0x zV0P}W5|8r?7#xeE5zls>AHe)7+5Jj6H9Oq7-7Q5@m+SXeKP;EwuP84e4638W@Rfah zJ>*PbBG=yiRh{M01I+R0fs^6U0~?I>A@re*b&^cDBps%B4uWA^e~s#u zZ;FnwvxQEhzW|4-Bj*r`77!6GPBPIX9L8yYU50VmMSu9%kw%GJ<0nyBZ=+s+c;+#g z9nvrDsvnqM!tdbGck~0@CpI)X_eaAHKE^}f66xXo_e7}UGyDszVjGLjT>h#9JXm*V zyYBiYfftIQ9}R&t#olENSW!OOoZ`5M)yDnC3X4sYF2=yc1nkpjaOL`q0ut3T8RDsJ zwXp)VX=edLe}qS6zVAXIK3mk2q;%uOv#Zd%%p=O~v*||^u~fY}W@&sfZ}nw(KbD9S z`eS6(Zi7vm)^}RmC|Dc&qmY_{icNPHkDw_>OyBRS-w*9!&^c;&OOB#9Qhh8b>2&<&_xV>&dLdGpmgFO)??H zSorM4yKG4o!p^AhE^11}{+|;+9Opk7I<=)P#?=%j-41@Q}#+=2yP3j`+9QBTYUS#DUEz1km%gp#pDqzr& z17yMJ0$POfuIq#}TZi7MH|7NCcZ~-b4HQ_pj$E8XFqwCRgskqY8YS000nb47<@%XA z;NKBX=r$boUcTYkc)TOk%=xwxWr1wchHfl_^{VX;$@nm5NB-owF2^@Lo3C)&Q$F>r zZ)}TDO1aX%xy$>c^!3=4gJ-yS*LoMrD0Pyz75ML$=PzHiQ7qPew!gLAD&JpCxQe3! zTG*8?@aRF7Z#l_NCA@JiGwngc5*FxOapLZvn;T$ABm4zsl?(%eQ;e z(KSN2#>}&zNKYiGC%@m_s`tAeMSbA+d-qpQ;z2M>BEX)7E}4a(Oqj+S7AQ?A`RKt( zx;7T+f za^?U-q_`;BD9oG(2hr&Y&1zGDOkkGMS>Ez-N8YTT+ZcJyoj>;ZD{KbjM-QO%lxZjq zXXZp)1=JPhVfGG9TeKqsxFhyMaj>~hGL!><^bVM{hc%=t#NyRYpc%;5o%&`{%I!`D~)?7hzWgI zBw6|p2qgwPNuOO8}3YJ9h`cd!E+^O^5;{ZT=4 zyNoi0e7A7{AR^tIh(E=*@GozJbE3JxTwpjCC(Rq3CeucESai~Q{m2_*(#`kFjLlK5 zsIOpuR4tuvk=a|MHP3qaq!!ty+WFEI-C*C->rT^)N(z3;<Tx8W%z>BBQ6$ z^*enO#SHwxa*a&9$T$IxPDr;JUp(YSDIUA*% zx#=-na~)TuC(~Uk%Q^yQ(J4Zm%GJib#;Q>CFg-=6Dg8B0k)rQ6ncw)Q*Th!Sp@1DEmr@Xm2H&D7U%S$NH?ehA7GRo+_QQRc7tB2bVn9`wf|xf2tg0Z zE-w01%Rd%-OG{MyKV%9fEG5H?3zo2#*yMdN0GzwGE&}m`SbYdgXmIx~OZIT)pccpx z_fZ-N4@)&QbojDVT0rfqXfhn~SLE_#r}#VX#*zbDEyRuett1tn=7NDe-^g*PHk#?7 ztCEy*@rxfQY}BW`i20bNq%KpZxH&AXEJ7JTs*YRa1{X!5wPL9>Ys-SIf4L#q#F5|7 zfS1MTAPOnO&dG@rX(vzik;hCb@94#SZd$FK=5#ZW%{l1K+;j_uggiLh+HC)_y|K0Z z;y|qEaETn4a38ko7dx-S!^Zs@>LxXD$KuE|Knv-maYlEMSWQ3ZjOj*F|C6pkl;exU`sQpZvno$)F@<9DN*eqN%9t~0FC1Zy z&CbJWi|j%?V*}~-d!6v6l>Rnp@85gZ_{?}|yd<(OQ;7#mCh;QTr`fx<8Bj5ay_29H zj4!9oLRNvSx%f)9()mt0-$@J0^d;rg%Iu#`sGqFqHl+GRNKc~PTr!lAkAs6Ii4ps~ z7+;MNDQ6i)36aYGb@jIf;6qA zVXo!O6)zwd-?cDWlXm-g9s7Ob#oo@|Q@dwt(p?XS9xAZEHKv^cTzRevEBwjO!s_H*$BPv#lcu@uklZXn|ei<*J?Mq0mfO~n2aMN5!$aJ zxu+=H)Y)LJJ*u(KuIY}-&*juThN;`+se9~;O*wV2p7Cls5IA(uPK*lItwJi`vj z^M%RUn9XVRT)o{V-+oJqyHAR#>r(b?ecdNF*V65M`>m^|>-fI+94GKbT{aP8^%R7@p!&hhC%67=QZrSB2N(eBa*__#fn=zh}dq@P{3IImPTF4(K>qCrAO6F_4+ZBKW0Rx@{HbAk6aA^kE|hENJv^Yzc#2he+^{0}=76G@zE~fI z^DRs!us|UqffOwxA~TKB~fH$5r0 zO5!xsOhRW6!Ol4+dN(9`iDCVWw9Z=TS?x%Wc*;?Ylnn0Q_oF~^2MN*4+P48wXF(be3B^1CcB^R;z&iA_j&VbKWqaLN zm)pcD>ZxVj$&RehfdKAnxID>j_@`5A%^$gUU)_+s`)p(N+gCSMzkTYl;`<{Hm58O= zxpQ9z)4W4!Pji~lX?P+b1 z=O?tLwX3-et()wH*s3JzD&|!o8`v}>iLAUtDyvn4KEucWfla{W}) z_g5VOiuoj6#w0|P*QzGF4s$Ml3g`7>(_0HFca~fkz))@qP=3PyzzK* zt6VB6N#n^R=y!Ekt3lk2;_kmsheI6tfK>35mVX`%~W^sJN&qjMJhQUJ5*2_06cj;Zv!?tlqnKPn=vr4Nw7`Pcb^*$)wj) z*8vmdWU4#Cu87lqbOObP9-Up6;4He0VN_vA0}LdKt~G)Sbf=D!#AJ~}`312A#9CSB z(WKwSdz?Nrio7&pAo8(@&*TS=@0U40t(Dc)@4j1Sa4W07QZ!By#EpW}v$4{6!Od5O zz{89$L)4wdb=*eHFmh|@(@+ucOui4lA1 zbsFhO2azD=peCq6q&muD`4FK_5HY-1-v}{615<;b01cuLdKzGSPu1JsqfzYF5aT+& zpf=C}pW--;{JK9FVw8J8+X0|PF!o|x(luEaCBLXc4vmyiddt00^dCPg6M2HxjB3J1 zgc}2%oSv!hEaL#xo+J>}R?0Y@Q1DUJS+OYL!l?3enOR(Y_~`AD>c&nOk9`l&q)(A4 zDagxk62cxYF#|`3DG)%BK!DYw5X`Wk)KJ2db0kX>pxMNJUK8J~e7`CdqfqP}HdlXb zzIwhi4ev3xg#dcOcX|#YtH`uSX2$g(L|?8|j5)3R!^t7$A;tOhB%lOUB>|HXFP(Y) zp6ZL&!EsGw=iv4Xh=bWz0k5DT+@->!Kf{@wa3>Tae4jwv=>ggKiutZ|I-5nH;r_0dGex^fgg# zESIUou`ZH52NeTJ=VT@%K*t>`-y%(Fu8L=m4K0HKM{K2Gkm^3TM{q-+++DGvLVxN# zL$^*p$l{@2ax%&h-{^L6;)ByL=mi~&BprJ_A2x{|OcreLil}Ygy=%65+Em6c;wWbv zcySC%Q(^8PnqY)*m~pS$4e+)DW?U0DfY(Dl8bgoBJ$axBBL#fWD+v&CIP|@dBqX$M zafB#_G8)wZTEM|-GL_`ZvC8}?j+$cCil3tcpxD=*IYo=#fM%AT=HxLW>(y>XLqF$k zls}l;Q4?YWSvj>Eq08oxcfvcdcP`?~!3k_bbQ#x+FrEo3&~K_QKxzjf95iOLa#j^X zm{?$G_MV|zdJ<71l!^%eLZN}C@^e>)R+yY|fwc*Cbw^);}g+fQE{ z9KNX{s2BbztS%gW3g;(F$qp%Xn-1Ph0K#;EMe2-UKcI$h5>(iLTh*h**X@n^|MTkq zd7~aEFw@ZzRdP52mXX3Z(gt!8VTADzuWN1OL^SX;MiTIg-e>^OSH#ik(S31rKLHJz z=d<<@hHPdiw6ROz7@Nk&^9{Rxqifqz9)^sgb_esd%Ggz)8g-wf4Gqy)7DtN>=uD-F zH#eh@{68J7tT%_%@>N=7uR`pt>Ug&c3qPLPvNjfK%bdw3u0i`={~>U^MWqSk<>=_B ze6)gpYhn?=4#%SysQUMm{~4Q9MiuJWV~_IXL`X72`-jwAaKc+)y`& zk+qowzzf0Z@WvivEcI7nxGkY@;vHfHB1XRkyjMpoRBTnf^}O%ZhQT-gio-g*jx6%qvSay*k4vx%W2Wy4?p0Y$(^9bm&l!Ae-h(=CAsj+z>U0Dm&il~!T}44 zf#|N6-bF!Ir}QRaXL0HM$1HFk6%3?2cyj|8El91ZS6z4Eth3L-#d}NZA4}vF?5m3- zbVuw(u!7m&t7eVmUciTsun*ftOHWHUU~yi7e!}X?x<)wqV4ob)*ei~H6cws9Jv=uC z`DvXesvDm&S7!U9$FW8-5l17IFQC974E~%1y-Ov*Wd^^YPQyLQtbuVX%s*j`sFXtq ze_`;B^?PNqeo}Xj$fz&yiqo0oH#{w=_B}(Jxp*>?>-ijBLhtkxXbB2!EX+`maIB`% zrC!xudzGqb`j5#V-3#d=xTvO=VH!aMAuEbkK^j3zbwT0&sUP~l0{d3?SfvQF$lJ|X z{7ktjez2!WU2u|b)F0C=1%BP_OLk|ZJJ+sQY`4h`VViufsu$z$m6?k6SP-#WPCBL4 zpNTpyn-3jiHuSJGm+>42jUEmWAy54Ax$lQIcOF~pdE7ux76bu(5KcN{fi7S%3KQ{gUNE7p<6vaqGRV-<87|zkVZHrT1!jDhJzJqHJ+jHkZ|47ORoNU$w`Y!zy2G zYRtqO<;@IKch9Nm-pA6%_0rTm#X&hFx5$#KWj{WTWZ(wO18X_=@--e0Y;}PJ8e6*V z#QU*UnXbvoc6uuO)B;8#!@L;)>1(1yg=Q)`HP>rl)Fv@%z&;bGP{C~vd!4!G;fKG5 zH0z7V_xdLCqoFSjqk>oQ3q&FHpjGVgc8ALyarnkmSG8X{2cSzto8pmWh@yDVg9SQ4 z8LFLM8c1xiuqNrcyaZ(fK^@AeyQP6ekTe`Q5r_@Aw5O;fU~WfA!&XMHVzF5aphECv z<}SA)lH04Bg^Vp-dO#0Yz!bag&&@2RLy0P5G2O4JtaQnko4E4R|4i8!XcQB1kft1m zQzmQE;LhHS3JY*~{xT)1=F?RKw9(s4V4SRlvxUsffFh9<)C^-Y&Q?hJ$yskI?PRoV zU|?+g3b`Q))I+qJ5KtMqf6;`N%$xv*cg*Wz@xuomXT~G7hkpXI^Zs z@U?Nw(@j*&==b4hxvEG{L!g2*6(u;Z!edk;4@lEImKJ@R`@6f_n}_Yajc3~j!VljC zqbQ`yefqLhKL41aU77q549^LoFgXpdA5S&+)_YQQ4W&dc2S2msrw+(zz zg?Gll<~v_XCd!nOF&v=ibaE1pgYkp}BZLHJet(GOKY#!NnvHj|e@-HDGcE9*3GWW$ zz89aNGxeckz%KykpZ*bS4^2FeW)P$dv<|&D*4@lY@v)G$2+`CNk35uQ) zn9H6&!n%gnz@Q~l;Q%p?BY>vTxg1FR7ec)GuURv@ngW$@Au_C2)mECDBmIjs7Yv6f|7 z#U}FNUO0}|fC9A2M7c;v{gkglv`~7jByVim5z?5Jj9vyyHEgpGF9wWZ`!Le0f&qFP zM(3fFEXPVw1lGuL!>a;9b zCHO(jG!Kpm$f&a_tT(wJD^X5s#AoFaH@94InqMv<`pQV+t*q$crDC2jrW;|ucZ+@W zM%S{(PJ{WPOtUv$+^S9X#*0j2?2Q*K`ZhPezM=Uw4P*vp+Wh-pXMzo_sW^=*pREIx-uZA4zpoiGXH>VW0;-~=! z^|O%&vve}rmF1t|N(958O1^i7PenX3ye?o>uG0k^`<@5Y&K)nz9WNvtFQ`R9E5SA& z(NxfEMM<^3+hS-(UI={ntuVC=>WkXOUTo~`?mWKLO^iWiZejeXrSr_UuN!V(dO&lq z_Ves$vQ?E-LrYT;W#(R{uqJCKGvEGNCO8Y*$7)_=t7g%h>ywx-kfPWF@ClgXDb&Ro z`b7RYrMVSGSq<)IB><5?Zoex^Ixype!7vguR7;5_u~APc88V2s zC_s`nUbMWCliZe0q39#Ov^t}SokxB>Xn8h7Xdfm+TRR;qdG}C$z=sy(vc7HY?jG*% z@6u=a-0JrGq%vbc*y8eAt$x=|-fMG1@S#=ihoT;rt?$n^p6+b6H=l87{nkRw7AxD{ zGy1;wtQ8KdhhGHfTOtQ{cUV>0Qk$K%VsuT+Jk_7LzXh&b{MeFns> zDonM|(=95Hp&y*!4^$W9Z@cRcQPHtVg@+NEyaL>QUjpcy4Wh1i^x%OiY%)$lCu?cC z&^D#Vh^CExcoKJ|6OzpO%SRHBsE@^wY{GvlS$TPnl%D&FKr9SSuJP39mMh7m|E7TR z`bLjB{Yx?QN7{bfgqA~8CEZJtJn+Y7FzixI47IkU9;lqHHf3weY%rJzqdo9WgAVoG zu!`mbHW2r-s#!BtYildU$0iRuq(C;4sm&@?NC$c7jnCS;xi@#li$kcv;kdm%I%+Pz z5g&y3X$_y>(C}qd-g0QoEEZSk86%7aE2b*Q#AIcIwK4=f#4q5*%Gqo&F^qI3X_cFk zc+@-z!bBc=EgQC1vCyjEy7DB0@QpzR)Xcc=5G&11cQiL`9T<8-=4ocmwPV+pGq}^r zE5kg8z*v~g)*+ZtnWju%EemB+Sd?L6$ZSP}Bjf2-nH|O)l{3K{q065m8xEUS9hHyC z&c*IpR*#h#5S#S4s}zVwR_Da(kHYvS`oQ)#mF=f5wx7GhLG1_37a10TLadRIjWo8g z&FWTw&ncCbmzTxwz~Uee%M?kwCSxaLFgf{9;aRag8v0tUp7YXl+DqZ%HqyOR!- zlwMg#ky?RNmNtGTIt_#W_zi+_X#Bqgv0Gr^U6M5hwnLXnHHDyfF}m);NYaPs$Bfub zuh;XXV1PDNsnx8YYXDR!K>-v%msgN4)nC%ZmXZVMJEF_WAL~^>35o$s%^*)NFj?NH zOSU=E%bilFhbHf#H#cY|ey$DddAUM*FZia`~6N@3;H2R{=0pYNU%$JPB{<4`>T-NCoeq8iH{1hP_J_~HMjMCgkND1 zoCfdwuwieY5}?f4#+=#vC*=b=)v9C^S?3VTN>ZJXgN!II!iZd#r$4hvT1HQB4b_K0 zS+ko@CSve8v(5OCTC8%d3;5F>pbw~WMSd--Db}B)6w~yGHaGQ|wzpJXX!%QYK}wq_ zu0#1jB*eTdY*sV|{TdF(rLjkb_^p!mJ)k76-rw4_`yFurB&y@nwrj#hNw4iR^f6_K z8)hU>W<{urCb%Qr$ z@+ekDXH#gltc^zj74NMdh2`lr^yxYv0Ui@A*j3AsmF21GD6E#G_cT~l#>qV`6zQ-K zy_J(^+|5Rb1>o=Tr%uTAQJR28=kQ%NFXyURdHvRb`%sV$#U1CYAC7?N_Lw?kQsr`%<1#*+y55l7 zC`zNHOdm#i$F+~dFC^JNT(nq_Y_SjR*Q@mQKKK7Dt~h62u~~8y^-bCXvXAT z%J2>H0K$JOqk-df(wbo#4a&uW8%=FMuDg`!MQC~G^>I<2RU#EGXw5`j$tl{BPSWoH z@!9xod*e`SKYM<-|6&bO4rPoFoOM6!cthwbZ^6`%09<;7XcsayH%z#GYallXP1p}3` zu0U{S!YU^8bh?aS+6KZcklR^RFwsQ~fytQscVtDv%ci9%20D+NVl!0rG?V50@h=G( z-Ncuo5J?pMfR2)jD@(%bjeS0z_0fU-GVcV&Yfv;|Ad9O@DhhLnAauJ7Ny#8dSzq|k}5f#d*yzjc8b_INnhBAf zpPiV2z)zC9$0N*2PK(zXJjfq^5^LX7lG7>H05_|4c0t~@)d(Loq~|KT&^M_Gn8u55iRCwFqp=D98o^CB9$q{gZ}&-)?s5eW~7 zu4h`a@XB8V*N}>#=<*Fk2ugvC{tCX%rq(sh1=`GlSv&jea;g1&=C+l=G9m5QrT^mj&gN{@oayDWHb~*<7iF*s86yt; zuhxI>*Q!&wtZJPfs_bGpLllAkRQw0YCHMQ}29JU=0JX(NCoZsZ12ZhJ2fc>^*(c2{ z>}))GAao@4(n5Y~AFJjj8dTLJ*|`8OO<@Uobpu?y`>F@{0Yu=>GU1?9oLsv5pb ze67m5L>;IAxm~-zD(VBTf9_qzm^KEYSN9%N6GL(0M-*AXgy+Br4iDACBR7@BmsH2*(n@!Xw|dG-C?3 zwsv>h+pnJQzc@^ebJrWm@g1GPNhIoCP9HS#i-@;iGN7E!yBQ4zQK(y|y=t;p_1Q1& zt$(4KBl%&T-dd!W9fFo@Y$|LeR{VeHlTn2lJ10pl;WILG7!GdW!z`ee%1IZ{4|d#B zKYcH%p-~qoXcA9pH$oV4tH^dGw%u0!T{LDBKYFnI0Vyh8>)#P~|DWA}(!%<>%!{A%&;wdtwX#|lp{lF8n^QsPG8PoQ zH^TtIYI(M8$97dIZN}7*ooCq zMe-AQY@N_i?JTdvClic})D@eXKjn?0!p+M2^Zv)WC+Jry+b1V!8Z&XlY2xs%^sNyje?C+qeRf@;K=x$PUeK0 z;m9M^+`1`L#BG-*#?Y8fM>nj%OlZcwKRolYSo^EZfz^H#e;UJS*spCQ! zmrEH9HZ=DPkD1$jId3yn1!-H(SF)gskm5VOyk)V^zELcXzIQ0Fjgn@@GF*n#wNPR| zAjdVP%1CHXpa}Sa$`q(_w`>a}^P6hhnP(5mtj)lvpI=u+qJ!$hWV~g&6S%s1L>8QD zs7651PoWM0U?rc2i>^M>>&}VI1fMyil=@2auIs#VhG=rLou4;p2g(Fkl~hC~@HV!4a5hy=}4q?3oSKY&uG(@PR|rO@7) zz?K<~1@r@U&Imp`7A*>x3XN*=kwwlVt|5bpjo$oy3!^@D>r8#AW{;!Cq0B=L*d6Q~ zn*P*S=8YxMihxy=%=MKdxyAqwR~uR_p>%ZwjIZBkaI}>9ZiXF8)Xznul+8>5PC_r5 zYW!E7z>9NcYAQ4Jzs(2PXfu@;N@o0I{7@buW7#i-IZ6)3Y`qes%$eK~ukFcQT--@! ziRvLuQVz2x$uW@XM#H4qWc!vhQ=qlQwNYed=CVq_dUQ$4IBu0;xUnIAw`}c)xggNC zLL)-Cg17!;hZU2ZmSuNwM=>dAyL_(W*#mk{e6&?GCGq~}UC@OM<>XRR+)@F1aE|VW zSjBc~NNliYbon(?Brv6Drk04X291#eIvT_wv_ zG?fZtuQ%Q7;?IF$jCYk)17_Dv%aTOTGR^H_Dw1<)v z3c3Q5?g-#BMR2ssqo=?DiLwbUYPJnKMYVVhFn}moM*|~RgbFGxY<}1%_ctLEe5XG53neMKjBzYaVx9R7DV^! zUDfDVF_>hqh*7gCnCsB%_;oq>z7B6M4I7uad&@Sst~$MNR)T~?&#kOQMf?l51gWxJyi*>F#VRpT$4eC^SW)PU0csl|NrQ=mO@)|o zX@SA*3A^m9AoSq~wawZDYvS1ZaMJnESnf8Kt6Z6EfYr|!a>*J`I@KD1^J3UX(I-O8 zW}G}Abas&E11Qxc6}-eqw94(LyZetfcH8?;o*Zl+whuQR?{2rtCBA|jpOMB&W*!uB zp!l>OsM&%8DB7LEX%M|Wh(d>%|%!7g+)MGwG+Gk?BKV} zyLYK)7?c?`&Q5$k6wEiW?n*y`e|TgL21-NeceMKCDDH@Xr=3oXxGp~PLr=Xpo($ws z^PKs4$|}o03(&GC>W#&3K|FzT5j4Ve3?tQb|B=+!WfOiC0#;tC$$LK%bh(}yGcp^y zUnHJgrmc$cGu2xq(^|u1V{PwixM#*`y;KpnhdP+b4B@J%x_|5dJ1G2y?9oo)gcxwkU# zME(Bil2R4OXC$lj-3lkB@+vNnT%f2GeBccxeqU@f#1pUoE)qLC;)l1LhvR>HKX;@4 z@GJ-$Nc>>8L0=egBlO2V%5`M4jE!!iKLA7xI^|%19?X==j@4K|EYNcx8exQs7a^jzP?*ggZ$~)e7s5H5-J7aNm60X;EHOl!_*N^?tJ71O!fNzh-F!w07gDk`@Koeccf*xYRh+Ujl z96@Pp9RlQ;gf$}TaYQ~uD(C%*e5^;5IidTT9{v>Fo6h6lgtm7N+Z&s}SU&x2Uj-Cz=sk5>U2C$`n2E&0cSK z!mS5*6E)6SU_xYWkBG#QWX#54#8r0>QCQ5_4b^+6e*Fa2UF+V(%02$4K0--sA3&-x z#xD>PNjD_a+qzZ;$2%FXkAjIyJ`gnkK{$DFB_7ie4~xS$Rs=s-Vy8ZEk^oE%fK%1R z_~>DeeAJ;?{X&-LrE20y9Me>-{F$79W4f1@bs3+5onbO#&H!Qi(Q%w~E=b$8gqCJ7 z+%kOok*p@Yox7!a!GB8&&g|yq{&W+cJM&kib+D0}6OD1;({69?K54gcg<(&(MP021 z^(E=3Cq=|@F+HXsBGx*CZZmr-helKD1wO+#J-Nx!nz=n>WA5!#!s#O)Wg2P`)@ik2 zrUd3CHmuZKDUIcnF0P_o?_9d|_{o-7J!*WH$rW7TfOU9gZThQ??|`^Qz2rep`_ts( z6G51AggW59D6=%;7LsQvf>HE5^*bEmfED7nClRodz!Y|=h3tD0xZZKVQZna6i1*o{ zf9{U}#zx5eoKe5iXDtGv&s)Mce;Xxy?%6gzAtb%?%`uFCpoD0~NessD_PD?Q#idi6 z{v{OfGiaC>lX}H)GV<$VbUkQOHCgX0>ZaP|khY|--f&bovia13;ZqzI=ID}xE|gJ< z_G}TBE|wPMxz}C0TkRJw_u3?{Nz8MapO^dlh|U4@lHl)iFQrsb$@$3)#!$x#I{_+B zNpWB|=-Rfx^*Y^X)#XeH3@7FF8?*5&jNFo$obp26by>MWOQT#()bE@es#dO4b@o(> z{EFO(rJuBQY!9z8*tXJVr>W9gv*qKss;y;7H;G4cX@&?@lbKmZa+NLXlxFBe_Hx1r z%I7L)v0*3MYpK<8_;6)a)PJGBC(qUnUTkMdv@&Znh=&SdYbFsq?Ze^U|1{a@}E6l_)v^-hIkbFOE&wm?ZB> z1v_qnssoBp* z$~CZbeUk(*D3Tg@D22hcqjfpLz#BdJm7wT6G-F&-X#wfq-ZN4E&82;~eg%9HAH_#oLQ6Sm1p$4Q*GG8#mHinn%Dg4*v`uGH zJ;u6Inc^F2A;};R9dF!QS^c0M8tkh84z*JCHB_49w14s)q!9W3rX&lZnhB+B2s+8!C%l#}AzemW(YN?x1)D9W4V?kaONIK_Q^sDXL zQR<-0bUL2`4Y(tfI5vPPZr;6H6Tiue!H129gxusEW>>lqsUt`87>a3_G-}?Tkh)K!IAImfktAGLh8ZLk&Dswz0P821`$WOj<~ZAAV?WY@$%FxlA%b zs3mUT>RxV^P5|Hc?MsW~}OQrXSBq+e(cn;#;dg-HT z0os!FT4y#A#}c(Pi!`68=puO2=4YkRkDSq8XP3CM;3O;Y^%xfic70-*wG6<{_$h-Ou! zCLgA6`BJDJ4&<=*)cWs>`irBPGh^%o*QM0RzIR_AgH*&^Srjf9OBzYp! z6Ip&u@-b^wx2A-M8>k7e=hbNvvza34V{^-0d7rfbeI)h9vWi=&W|E}3IR(~<9YB-A zUT`d`Wl^!1f^xPb{cGvV5$Co~&1*-g+kU6N!saAr3%Cl1)?WyPAP$}pCzi=XlmThO z2sc@ZqnJAZZp&{r8`Fl>45TAv5Jg6}tmQhl%?gP*FEr) z{^sT`O8OW39AX^RV7!xvJOuT~By()ru7pO% z5tcbDVd%fQ`I%zH5qATlP?oEvQylw{dEsX|81$-cgNY*-PJA{(IAzRO z)}W;MtGd6z?GP7#ER=-@Y<^ys9KtuU$qYwF<~5T?RFyL$Nn6VaLx{L3>itfI4Iqx; z88_uRwDZ5ZJuRb_b7(X`I8eQ^=Qo=NnhB_3m3*X1hbdJZ$#=3)9gilKB9Iy+wqNbb zdkgZI#fm(a>N-rZbXip}WX#mue|fluk!Ilqe{hT_@T?pkbK8E=jz=Br1%-NVRgYn{ z5q8$kVL0Wt^0B_Sx{4Xh%-AE=jqs~iO6ADW7R=o6HNIzh`on*^9;lORUunF)x3cvmwx93r|LfWI z9@^T!c)ES~Q5Z?glor6_m@a(Dn}V3$Ds?@^m*-Qe4&lS@^m@?y&M&qZWo@xQx{9RVBX|E{j)* zb+M31Bjpg{`ma09h2wh0G|VQd#w15x*|RD_g;a12ql=cQbas^^X$O|gYUfBXxNzcb z1DfFpO4Q%_{;)k91@F8u^4()N%+0~@_jhQTd}S3kNa?(f!vP| zw!~^bZUzPI89BvI{KCiF_U$;plj21Dv$#_e`O(B!mBTdXJ$UnX|ZiB9#Kv z2F_i%iD>@6)YzQTEgts|AH?9@G@CM4*SB~t5#>(=_NsV?rZ0zE?T%(%W?i-EdC5Vo zeo}pUZ3^uAvc~@)xGuNwSa?ZRLzp8QK-xNQ?cb<0(5vDPH5-x0y6zmZ|A> zRLDQUC4^!Bt3CaQsW@c4mFVaM1Ggt1_ zT4F`-^3*ydF5jC;YvYu839YI#_o``9g zZ32*Ca)Q>8)3zNs9%f35vA@@-i7%P2On?@yN`3MSRU8z%jcJ-O^2$?jVGc`<1H73Sa*oK6x!mp_#NW~K@4tzufy&bvOFZ!(;= z!rpN)oIOTOR7Y7oitCQndRew_weekjh-SP)9rAP<6&}jH=}O#VvH7T(O|&rMZ_DIU z-cJ_P9K61_@}@ztrB$C_->ZN7CY7LWRBuT-vQT)zEeLrBo85pLPe9={QA;*Sj_tHP zKZ;k=NPZQeX!_t+)J=^$Ost$DmDjZXo7magIo#PhINaFV+|E#jQ~A(uqEbWK+CJEP zvGe>8HPDXADhEZrDpDRDg%-nmw+dFFJxxx}><=z5ScAri zS+Eh){vT=})&E~-G^U55Xf_3|n(--$I?&JnwY$^87X>G+TA5LU6I8ws!#Pc_7lsZf zHGGwR0_2hYXt_FtM&?<~{GAxs>_N*IudJam98K;}ec5bqah~et+=hkF$2`Op6BWVyzIl4e3ffpz*m)D@Ny`~(`0+l`!W_04f5wcQD$mUpvrE5 zvW(*lKgq}I6xURSkNsyX{uv(~h2@m)jVK>g0^UubD!l*3f}y`IZFuTuLAUFNWh(>v zSDrnv^&rI9uBuRCSTj^qKHU&c8QcHT<%euzmHbaVjsPJ$bc@!xxG?@Yv$lge~qw_ZzF0PvK8>O3XQ2%{ppmA90+$pkGZpTUrvK{3)w0XW1aZVGo_Y zR*TT@={FGd8{9x-J9^{=^j@$#{WW5$)e_3`Y;Lr~%W;!U?3za_>rH2MDvlU2xxXfs z*Tu(mHv^tY(!G0TXe=+s8}&J{Y#f4}fta~8;yQO5U)Ep?u`r{L&kPN`dVezq`et&f zoE4tw6;&@nI{H6+LmvF>gvRocaP`p-wA-tgBDg3|;;W5EVsYSIo}gpzhmDn=;0&Ly z`Sc$=+{(abj>|&$A|>6=TlVyuds5i zOw`gU#yPV%gO{Gph|B&`w37XyAHLk%dG(!+U-B{xE`A3V@>@*dq{;c~Z@+u9%;B0Y z>V6_MCU8|L`vL`T6uIJ6>Wpy-@`koo6(N&7354j<30T(9(OzF^7F(Wqo%3%E(&O8I=KYs=Tnx=ZJq|)TE3Vg z!C!wS$Y-t!BHJuvRmeCQPmjm)r5Ov%FcKh&zbX-w z3qZ6&M;mF5d#+<^6GZ4h=O@U=3V;`tEW>Kj2E6!i0X@JOydyT)Z9=_ohgSBwUApJY z^~F-MHyg)bJQ-CYbIjEFzzO&)568>Z|5h!(57KNNx{cm+bnpdW>-qA5BBIvOuLV+4 zJ}h>O!vcwmv=!N453z0MXFfUlaU2L!U^z3YF;_$5LnrTu51ks4jOA5>ENBsM=8^qN z2hXJ^6xj>QHqhlfepXQkhjv@MNsxB&rp^x5GU(jVMb zQqH5ai50t{BkyiGp4Her8beKagtNY(OE~(Ha0GV?4%-}GbEAZjEK~B9%AwO?4QD1I znQvvd<H0pvRN~yTv>JAcbNV+X zO4!c4fXcK@)I~Fk=&yxP!X`JXM?W5Yvm%b9?$S}2@Em@QEW>}!lz~9kg!JjqO%H_j zKrz*=hH<=}OXF2W%ak>H)~3y=eLB#Xm-Lai!rgKz%OV^z*@)~NFN>qd%W09W6dOZH z91LwH2{w_pIZh<(ja~;B`XELxOH;}2^rBg$R-QE2nTKRg=rZ+mBpzE%mZdcw*pK|ad z{Qv=;uolClhaM=5W)z+r+^Lr_%u38(0&9DpxS~)8xTla=e4(MjYk5NqsVq>8`0q&D znc_fjNYMcqliJ8zpt%IA%Imh2iW-(VF3HI!g6WJnrDWg&lgt9)J=CZ?RAUfRRI-xX zH?J`*JZ9IKKIc210TXk%)wYi!B`0v;?-V5rIP1v}XKJHxC7%6^s30jeh@MqlBMR2*)!t4t=W71 zLe?=nvBkR^tXdX}FcHsDCwzHn2H7ya|IiVj7fK^^UYRPYjf5;EC*+{ia@{SSkD?Qd z+^j(0xhq|rK^BGE)BvUQ=Jn-KQF=oKr0Y#6mS%5a?BK5!T!x2;qW`g%pHz&(MJpZ_ zAXpzQ)0Ze}Js|84*xest%hZ5y8;7GOVx{@+(Ww)*t)U;mIZWVYq9ZxSzKl9)!jS>3 zL>CNHZ??7jEo?1C>0Lezv)D}veT81k{Lwof{UQQNp);D0_LrUsG^hJPx62rG4LS*9 ztKm@0F*5%@m!TKs=)jhqH9=P$4^%RCc2%Or*WB^+GRxkY4L@759l&NbRkg{uCv}^7 zM{F{MH_dAs*QlOA54SS9X%l!dWU>fXZ03=)?vNQny}N#_RJ)qXR;`wgZC1lmhs0O8XLjLoQ#&Yv$@%10gH_Jy$M+Rc$pGPbIByW-HyfX33p_|yu?#?=j z3Sp6y(Tl6jjC8iLyVq8JUo(p?mDj~JN+DIJ1K$ek5Gsb|#Gf{67OEtc$1D~*18400 zpQ_g0Uh|nKhhO^aG~v4I$Ug2=aRksuH2$tN;}evh^}BdV4Nh%s#91uVl#>Y+O`J_$ zt*n?AjAA(oPBOI&>(v1P~NTpSiUp%7Z zMfJ{pU`bF7dydJq#F_%Q2~A>_Fc2IlJdUD1dH9Asy-u4t?@F|bODCzZM9FC$gdHS> zT;1qAE~TB>rqMRzG*D9P8?bgYmxn{G2h$9E(@nt_%c1d9It#5)^#2Zen#F-L;TECi zl|@FirDmhi1SG_}!Q|ncild8lDy+g#bAu33g@ezt?XcUJwSm*E@m2RIz4M=LtiVrm|}H3Wy2ZE?Kq8sotx4G!oK`DrD>T^LmOslM358ouYA~nyJQq zUwxvjM0GBCu1d>8wEL6HlYzu3b9u2z3FKIs_`NFRs0zkW0jC_k(*Rx+D&*X7yO*Q&iISxg0lNH{LYs&C}{}<-I1=>HUT(&!>2r5@D^d zM7&{;N7$@G1FtMIB+r8I>F;JltXKd%2y%3$b5)z>GPz#om6*w|pO}N@8V~ldk zQ8C6)lzdhUmguktC_(Pc{6Wov<;&3T|?@T8-7Al{xF6TC8+ z42CwW^Ru9H#*z!X0yNElLfpup7huE}3YWWac4qEd@-eOeMp!t$-V})8SyKC(S0PcE z*r)cv_VbMw8;AQZuttr-N!dUm2mroXWN&yrlj>#dw6lrd@O&oiYZRmfNg)R-P)y?k zZjBt7bDACyYK?45;v7(gMGd1144;4D^SMsmz4w4b(b|=lz|z4>gBBk#i==oLjV@)_ zT_s*&&LzbVTL+08xAD10l9)*ONi1N&r8X8A#5K ztiAS5-H_#5q8&A1J~ftW--v0~P;y(>6gYQ0s?(rUm7r(Jk+A9(aa*Ni4ceFOO)gFT zav{K#S6!wEVAg3K$H(!Vo1k9Qcg*B?|NMGJGhdSQsYY}fotu9BmfX`=ITwgo)tx9B zePF?ufo(~v*bBycI8rzDH>8Lesfspw(PVs_oJmGB)xR zCYMr*1ItBnSr6F-l5+Wdya5Vl0+!P?3$7e7TrFP*os!Jb=b%)%V~L~3{*jeG*raFJ zJK`xGLp^mhN%xiUFbXNuq*Q!xwISk&@8-Hl()t31og7iq<>Va}t$L>@ogK>vmdags zBRPj;rCEFqvs{V_A^mYO+A&utDeY7w%V+NO1;p%upSgs{gE_`&6L&Gl;ycvp#<-Cb zY70)$jRFU-zvQm+`Zs)5l$KwfzkJn3Et2-L{jF_^%yNI#5$4R6z%>y$;RNXNgW0J( zNtS$|AoxcQvcNxj!0^k5T$Y{KtswB1fWbFF;Uai5^j7b+72YTxM{H*FgN>2_{@hR4Sd4||j9bC2`nr?!IgXQ8JeXummY(0Fr)Q+<(6AOS zKzg(}XL@FMX#O9X`{u^rfs6>+MV&xjI;e)6@p&-roDshzcDH!`>-SebESKT0D1TV4 z50J@UJ&6aw5L2yJQMQgm$%bLtz&i~(t^2DOyIvtzJ!I&i3m(A94^Be53P>}R?4fK| z)dMfOl1C2^6wp^y#iIu&RtNYk4IBy>;P9ehKYC#IVQG4YLmx1x4hQ7US%#o|=IISl zL<0R-Sa>jd%OM;kpd$I|FfZoAOtp(ykjt|U6L-X(9biUlCZgihE|L;-aEbO~D3Pe4 zLSQHA^%^B2Gt2Z1*9pI39`lA7rwXoQ*!2PWz&P<`b=$j76!b6ui1^vHgX*EJAY_pw z%R$cW&K_{_77u@s&>BBLqrzd|8>3K(H^m`FaFn__yz**%O!P-6r3V%R@l0x$+m0nD z6{C>+11*dB)j2SjwQYEFmL=a*dN<34BemZ0R@ya+PhG(h&&dLmj5I{gi!uHsF&Z^_ zK^x!=vDfMNL)IZK>8Tm{=v0Wej}x}jWtNV#nrNxo0I8rf@FZt7Qhk^iKw|K7NJ2^K zwN7G&PqT{Pi8p4QtrfbS>jp7#lPQjhY6x*a=CWg@GJi6P-lEzpmcu~ov9>^rYXpRq47fdYq9EcVx`3(_sk3X4aZjPa zUDnoTY9v>o0mD{}`~hHTS1J;4Z*(MiA3N6M@km%@(ak1~ ze z#ZBnlUqZ01ORi=O)n6Sx!<=hV=4B?_#CPAj;V0moqEF1=+>G0{S((WvSklRx(Pfy4 zKH4}%g?H#X*31>9)SIcnoy4e2{K;A}3A>gg)!jd6+UikxhBe%5bdLTZ;W$0H4j}b! zB-gn%O`d)nx9k<9?AHpB3yk_GhV(rB7tw?|8N{p;dcOLioKweFbjCdXZ6}C2Z#j*g zZ;7|dS=|Am(xt;tpDb&n47~3Mzl~C5DPQ`1_rei=TdsIB_utRGvEowo$DM21P|Y0h z+)$aWreP-L(gu{FRzkyyZY-rYN9oQ|zunhv9zUV$g)emtWcvK24Ikb9ikX+5v-ON- z`pX9@b?U?C_;OIpX})Aqv`gR_4N%r6+QaUQ{MmX`g$ChD8lQ4&bd=65Js!u!Y=(PT zv96axCdyuciE7MJ-)da-qHzk4Vje3rH>sU0{%@^I?D{nMJ|W6X-%4)bY_Ce`JhrpO z~!ff~?yAwuX-MMR2QZQz?CJv&ZIgpqSsup|byRGGtg%>CaQI+$-^ea7 zYpkVq9>BJtEvHC}jfBMHfkm0U%2`o>lm`ammQV?WxhU-MJ`8%rL z?cKxn#%B9)h6i2Hfu@pn2gB!#)g>~AL zhShtL*u?`^a=q~IjO&3zZ&7AGlw>=F6@(PzZ!8$a*|i0Of!__hvCl+Q)~RZAysdcQ z<@k)M0}6*3Rh5J>I-9DLz$CCSS-Tx_5o(`Fpc3V?DO5%#TE?Y}wV<-JB);l-y(6A@ zkX2$9$FUCBsh1rkQu;-;uY8cS0W4kD6iz@nQvLA3!MT*PRSVyyv*x#^S+v+8y$6RccAisc zD}EI9-`K!gnfBnN6;)Esx+u|7yNW#q1kV|ivVvZxq?Wt>KEn)E~Tf>X+tCrZOT z#Q=+}p-&hSXLS9dY`)$`pCu?ssAfS7qfCIDOz@2BOG{7i=3pHbT?krpmL7mypWQx6 zXlYNmu#c?HXYBwmkq*a(esAi>Hv62{dE}t65}O3hG8-#}Uz%y~OKw z+dxfIpC!mtGIhW*Oel#A&mPH|cA=(S-b$y{#NZsi3N9Qu_A^0P%is>K0c7*~uEP$? zVYj29AFx-gnKYGLfA+q;uZ`ns_;2(nrb3MXOTu6~O>syb4A`N?;1@{jHY8#tEudP`Dq6`vZ0EDT z=Qgu5yR$2CapI=r*Bb5a+~>@>&AD{K)3|ZofK#|!k}o=vEPqnpWE$b7i`&NFf9dw| z{k~9St|-zXeU zMgv97M5mZlXmb-Qqa*|@l6I~hP&@=3{nP4N$3rAr#o@4b#Ur2Z;zU%l*&g;LG5)`V z;m)9^@@Bcjk^M>lNkF#0G&q5hg~g{O7+f13kwzgB;F-U$7MX~OUEbt=XhyRae*d+ z;`*@^*S=8px8xJawiL6u%z<3W$LW(+v1(=_JtxClbOU;?lrlk_iLI!=Q`Mi<(u1lU z;&??lvA}UH-G$@!GJ%nKBzF*t92k%Hr8$cy!6VwdAdn@Y6y;4_;4i8ktJHYuzmF!W zzf~aFU?U#E!G^(7EcZ)KIfGI>sE07Vpb=-@>NMygIu%(Qjd#{~%4h?Hfg6@TsO4%V zXgn1u&H1_l>V}k8Z^bBd7rzLqo84jXRnwG+B9_&a@-0gSDKR$mW67CB9nWlX!d&|c zIyAsnD5WL$5=ReVB(z@E`{$#p62IXFECB75;lxzQm~qcUK|#=JA{#Q5cItvNQO(oI zpxx9pZc8;kKPm{Xw|FsCfCWSI$qY<$2c>z6;jf$({j+mJ_GaRIkJ$QC zZ6>NY+9$~?Nw&Oj`X!er8wQWbbU5TN?WD7bwB8S?7lRJqro(?7qJ1oi;z=8L%Nw-E z6B58t@!yfVkbX#-H4c4kRGa`iI{eN6Lk#q&4h306+t+Ron-$OyCeUwA3aXe>pPI=r z0>t$;RQ=FEg_lWmmhGNRyk`?X8JpYZe@D=b7(j^ zGm$o5*?c`m=b8l0tL#A1buG%5QPmXb?`PLQ+>O@$^P^UY{z0@-H_|@HYTlXd!Q8HB z%>%#q{qzorV*bylb+A_R&(5h>H!Oc{je|_or*Dw$o=w|ueUDFM?tb1#Td#%E~wZuJX`je5Sduxe5skOwlNn8AG2F-c8!p!6i z3;&)34*R<&arY$dp2XdgI2ZkVdLn0c_Gch-)_kTBx>V6TQfC#rIk6*xbxm^Dp|dvo zO>w5iwQh=a?faYJ{}F;Gz*0c+tP=M`@1E#=@|$7}alg+^vFYv4K=$kj&2m$0mo2&} zHb|hD^6AEMZ;Ek&=Xhn3-})E-)kf|rv3IwEd6b-R!FE6FCFr=GyKaJPMQ^;u-H$rt zO-Z};*-bMZ;@^@c0rzL~)vM>b8!v#8RrF6b?AOENHRPL6XzH{*Xp&F!rKB13G@$BR z-);P`-Q3!JzPZ=@u3SpG+uhQI<(Fh2LF}ZzAy$*$s*)Ef=GbYKNU_jhd@C<9Td3(Y z6`I)%IxvS6Z*ui=j?t}QCKu>}`cv4Nj2p#mIhr{;S_FmfZSp-ZjMs^&q}ED4FAl0= z`IvTk;&;0K@F_nJqUIz<%(K3t-(c_@dAG{dG@-Fu(54GnjQ91|NS)_2k^J&FUph6g1+LOB!*;BBLvADP7WT%Nmr^R(@;gl5T7H^&VPP zc(XGP=BEn{g>17T7N2;k1z?nc8P?V4!|5Ozbru!@Ga{egU4Oj#^ka!we#1~JZej_s z0pJU*OL|zd!Sq9VKE!onLwxX&)w7TOQz3~9*s6GgmGpwEg-$QN>hs51nZ{UNT$I&G zHE6Jp30jIVOiUvSiW_N~R?_toT%}up>5k#OcU#n_#w=scl>Idk$)E!K6a6PqS4KNc(`vfU@NWQ7XYVfz2AdnHNhbj>E!S zyPjsI8D_xXf5d?&4EGX)%1oSard>Z1>@CJYaOB|lI7}&-ibX*@Q<^oy2xo)05?_Ml zDk*vm&WUT2X%fW?>)e``x<-rF<*sC|e=w7!BYNEPTKBxxJ+F1oYu)o&_q^8c#A|8N zbA6U8zh)ulrK{Zy1D3Qlg%7(aCng=t$dFm3O}sFz4Ybr|jvh|*S6j|UM^`4gEu;7< zXSIu2?H`SYK>>E?!ysDp#ToNd(H9c=QORcNT9#tk2=oT#H;_M`R3J2KSh(hZybnT3 zKgA~ZIv62cTVWckUSdPv3iU0$K)vKM&M#;{s9>sL&7j!QlQD_?(b|&Jd zDA4tL3w1eB7!Nk~;F#NqVK9(*7fwF~HZ8tJDBr zY;I=L0oaSut3yH zUMhUVqYNi8cH+1b+L~8e)UsM>JmTDa!g%S+%*y+h8=L!wZ<<@%uXgwU^>TafsCl$; z@M8Puqh8Rtf^oplannGpnqh35xR}v)LEo@OAl9xtY`}sn@|D*e4P#DLh?`%U-niS4 ziAEkpZzn^mIg^3bB&1g<9z&rBHk@FZgHa23PGSQQV%DpOwyN2~R;64|(j`XiulUBP z>JgnRz{28VN3Uag8MXccKRV%%?xS>AYg#N-8DYfWFYG0Wy>XjS5h7o$unH8{qC+Q4jMPV7^Ldw5A1F zY=E2&QIL&#=sn3t2^y%z&VoW~(2mRo@4V}9DC63EW2sgv%frtrwcR6g zImv54!Shc6GCAQvD~iT|3IYy`j>&gT+Imd%3rM0hL0Q*MtZ)@g&@l2W8so~w=iMQQ zzo;r|#OF|*JbR(cNCClp8=Nu2O0_7B@mV-lIyKc8J&}VkCznQ!7U~1LHUgv)W8-Jx zARGnbFzKL?gk(QeXjXym6OMFV9fqRZBnBC{!2!+;r1f9pa~???jydzh&~|+0gvvN< z(UaoPMiQ@l-lRdG?7l${tqYHVc(;S0oA`qGGDlC=9Xk&W@C0LAFd=)&%3GBfl%<^Rhw}nrmp0(Q`Px>>YnXJ+kk;%TU^l&Wz?1FE*8JX$P)umo6c`Fy1`t4H?hDwR9p~C3b4{#r*g4_omG^AhJ^Z4MI z^oRUu!zU#iXfaHDDA?lUn+MZ>a4_%(2c3V&1K$rm(6v{~QzHiv>RP#I_d@~V)#@J< zkSBmu>P(3{{D5RA>?juPBmt8cw3Y#qaO>BPkB`g8C&v{r+JAFg!Pm!S99QLy$Zlx% z%565OgJwKw#pC0${szVTA39+#xN2%>b2pQokDvghS;^(1{& z(mp*yMq?eg#|VFXJff68z?uU?IqKuJp%ghT^BtU8DXSH=s#fr_uflfrrchDNpEi&( z3c^#No*cnKJOVsLzI^(TmykStn%n!Ba{QZb>@Mg3qAJ9ep#Y-S%zQ@3CVzsz{@hqv z{_9_>C#tSqjiPtx55(MKuls9~nXOJj8$}IbIT)&s-gVo^aL=n3A{um*!LNK{a-}M- z4)$LhY`jzp82qU6YGd=C8!xt1ML6=x(ay{5!=sItuNI-5z5S!@HMMyj49L9_6f9;;V1@TpVeFm@o?`$w>1l>lzJ8p!X$u~5hFOxpB)e?4x!-{2C zPf2P+TP9!}v@{r^f(@jAWuSC`!Mmqd7=&xAkOGe+2i>Tzr3V@>?^RE|0+a$|a2NJ) z00%LEp7Bk54!hXGX0Sru!aUXDxTM+y$d@jpJxmk_Z7jg{kod{+-6FY~^#D>#&4zd8 z$pkyvVg@6svDDQa8$bYI8icBvf|Ah6>z$+T_P;+;8+-p!uQv`rSULLFQzI=>v@>i8 zV`_CVbx$xF1%vSw3>`HM+XtK9L5+=PJG(na|3cNm^PQu;?ZZR$d>;fM^=jkbXlL{L zU66`ieSh$3|8N^)ZiS&;Yv+?f4ISu+KAB<52#}oZ7wd`A?>>!K>l26 zIAVa5(!90z*2xc&LzlQs5HyJV4gHqpm9|G?(U)aiqqso0RvUnzuvCqX6AJL!=u96Q z0e!mYv(+wgl&DjzJCU7bU&naN8y1Z9@EVACHweu-12%?TV~{!8s8C_eW}^g>G+lAS zU#xqGX{E5ndDt7`4WxF(Y_|bR55|OOV0dR|Au<_6U=~&ujV`6veH*GeoG_$~n3W9# zb)b;(^3QLUm&;l&#c>kf#^0I=S917I2U&|iA7*9&A^|hzMILeEsWDLQBBej7(3F81}+Hv)|nHQGN~MOZ3?6w>f@2k#=%hVlaQKmi>Po#w6A z6#KR4O98+{Wt4LvUgA4%(eJQFnydFLY%Z;ZmF6OD(rStd`kM+mzseuzub7Sv)SBy2{SW4O`Cwr zI4k0s+S=U}!2({I5yM-=ia;#nSJ_vW6-(3lppyLZR>Fv|{T4yN z1{$hu9F}b?uaUe(V;t)4zvGnOG`mnV40!JJxTT_{2&Qea zo=cWm!v2QORu4m%6R;x!Wu)tpYYGRX8>NdLwc=5zk|9zuEG5b27dQkf(D!mwUZhEe zmt&46z`tqn_5qyb@Oo+nSQA!@Yx0jW6DA8aUwLXaV(K+MA7R~Ug@07B?)GKao{VWZ za|Vnx*@6{%fcI2BhB2PAA)jl{D&(W?q8-AJ5YaHxn4sBts869Tw~J`sUa*FCu}i72^7#K-)iWT z_IN~HcPc-i7qmpFy{qe(F-pT-|(!FrO3IgVKyV@ zqqhrl!>n)j<-&w%0^XIQVWl8E=sC{_13S+7R@^UNEY<^wJZh&WpKZwzb%!cILNU-b+p z+$ixyH#NyWOX&+5`j&oK^4&j}lIag6|Fwiu-u*;#V!p;VZaEtSX4i!!W)7Pnku&;vr1F=iYx}BMRGn?jYn9uCcE@Ztgc{et*sW}^(vza+F zQif?|VyzZ{*PQh6MhVYJ0DNaFdPmkZurK4Q#gc6Wiv3y7C68&KRm7g6JtR`{jL@Pe zk(g|&46|qYMalVM-Xaqb0A1t zk|n=kT48^>&@6rOoRqd-8wTBxr%T7kZED|6>5{$|6!z0a7)Iqw*hgDAG)nN=7;RUq zhbgV4T5*lPE6$@REzLVYg9uXza!2K1of%sXw*1!WAd)DYaZ^TXcbEBSX`i%BQwEpv zWB?aaI<3$sY#OD+42s0V^-AhRN)2jmC#561{g^wjSOe1*evr$9?7IZnSTi7}G&uA! zXw~WtC_&O>qzM)Y%Cduf(vo0Q1iI1%7Rb~$>Thy3vBs1(9V1Z8{YqPWiq0)v!CyA{ zsu{u2KLH|d{wd5f0kXTEK80qlQ#=bO;L~dx{8%SX6rKzb75Kt-bHqM#K-TO4jBTB_ zck`8RFbV6T(LGF(y@s}S4wj)T%8Hfua^FJU?(R~VwT-a`0|uMKvqe4@;Wf5KC|(|w z)Qh~K;6bhLV)L{HcQAl{cQA>YyVeNgP2La=zXRD4Z#|noY#gj(M^i^3_tOQVNMSGk z`|OB}3O0jKT&o`c!sx;X{Xp_i7DHpO@Rv!71silMoD^$zG&n;wKN@$~Xv(rF<;PTz8`0t_yBqFI1y$VQ{MdH#Z8C!b_ zTMFDwG-`5z^>QWuW7$4jHI)7rkWQESF=sFHqT>9y)a7WpdC zVbL9>Z7I*@k!81>kK`{u8C zoAQ-KhjJzTs++iSYEt?L!<>qMiKh|uH=neM}AO>J9Q zTVZOy_q8hKw6p-J#<|BFO_0wFSNhF@i=hpl98jZ(^#ni@;J(-t1vds`X%4l$A}C6=e+=gpR<#w%YNRUSj}ltm@p zVWDvhCQu|-f%AYYt^h3iu{OdADUy0S>h*x|teTruPELwd3EKoQ8d0%ply-sI+~3{Z z-aKj|Wjs{j;9YkV4M=d&z+aPv<{nGv2}B|l%K($pQ@YXUM{h&h2B-4gX<00B{$iWr zz`UI@>m_Aua_sjQGJ_-Qq#}#Vqq`D$wuK#A3y5o}W5l-t7%E73TmN|R>J@sPv6&4k z4o;~N7&I%C``t@;yLqs@`1s`BoWE+7rVze^60wmvK z7L0o2r3I|?IOZ1c1X1JA6meuUHd$C6NesKhphrG>mzYZxWyXv1D}sOE$8j#eXn+R(&;zeA}{yX<0{ESRhHd!|f$cHb!Q0<|&3Vca- zhJfBahgDJ!E=|FbjwwgHFM9!YNfCffn1ph#&>rxD?$obv_JQi7V2mz;jFgb9a}y_Q zLe-FHL-jf^VyGLbV!=^}%LiRxP>nEVGOX26+Re@NSR*(^GkWcBXa)uIqfwaE=D;o- zxNg0TKib0~dd36TnPAjade5Xo{P)}NRU#akkk!60>r|Ck0InDLBB5uSGVv2LZBq1U z)3VWZoed`I5@*|eTS7Y;3S-SNf;P(($Y#?~f7R=Vk?LsrMkZ}%fd2;#JI*0l)!=t; zU_<;$+7MIhDO%u>A_F>?&$8G)KhPw+6}n;Ss)>83uJaeJC6@MfK$AS1`PUlJ`U;wCs3&V zOomg{6Lyg(Z1VQ&K!);U4H~3Q)om81xK&;;%ej4qX|PCie8NU$_;0nQIUT^M#L}37 z6b}8`E$QJ>ND$sP&@PaIPBxgrn zZ@zi6SekQshgS&&1&F6-VA{)X29X}p90jE$E@wEj_?$Oy3R#^uZnXl`MFk};SzsMDHwHY`KnmAmPb?T zFJZK)sn4QS%=BxNWBQ9_1;9;Y@BI0FTA@U5by(=MnG1caWQ<=j_ki4VjwzO`^Hjro zJ(X#9>ZEl{-FZ7#-fJn70Uki=>Rw**<+@Wsp7O4u`75e3qRFT&*0C7&cVH|gHy=FU z^BhwVKsx&Pw$paNZbj*{<7q)GgCqGNJ43%&C&)gO>?=pgni&1xjM|LluM*N~daq9% zXSPD1S}#-7;HV!OXJQZ)9zH!Dl#6>{HEODPg0rOUst#?8v5;$=RBj2QA9EhIg@+g@ z_jo|2$1GPclK@@C3Z*aMMSPAy5zB=XJqU|x_awgD0l9Y5GEV>rN&FR1(no#8=B9RU zc#nVTfRi`N6wYUZOd+8~o_3 z15|uvN}xRH?V5)L;O+0$I|(T5?M|i$T_s}Id#iC&v+x3A3j_l2qh4-5cmNRKY^Xs8 zbnx&+yV(LNk9(T5ELQ4>rJaNrVIv6BT- zu4Na31G2+88pGCiRQ34b$`g>-Bm(qx+BmV4*m_=4RrBV6t=o76RnUr~9{MDc@dJws zKOP@1|Ab*-zg^>>I*i7M8N=Rqy}JD4&&xmI|Cg4J8^?`h9bXkTJQzd+yi!H?K~n5P z%i0RM*O78&D!gm*DB?aK5R7#3*X6&SNe~MqfybQETI*D@X?n>(rvrX##!QBss1sbjzXhUOiPxK_%)bfDbmu zQ5E(nFV;*sIb)$BK`#GXPpJk@O`&B2)<_d_za~<$t4eSgmu#a6q9DqE*4P|QQ7!>> ztPI&Em|L}@fJ~mV$19LUxtOY%mdHGEIK(4`?lhE9hO1Xa`4%v?tG{cQO3y}N@Rq-J z>0lv+6))Z81Ws7fdBN@~;YinK#a-Fu%gUHR7?F;mOEmA(@Dlx;)o^Mq# z{Sbn$cz6aATVz=F~|@RIO7&i3J~=GCrT=E4Syl(ycJ zKrCqV#b#Da!Z{N~iE6vc<8r|EDVQ3j6o=u9P0H_QK^eL!44v<3iC=3pkU{rT^@Ffo z3}hro0^FQp6cRkC$8=N+bc3^0ou(I@C3l16-?RYpT1-yaw4@FBHD}5>X30Uf#iR4N z=s@AkZtZ%wK-BNMTX_f9e`I|^A;&z1QN;;Ay$W^_Mbsfq4qNjtJOPp^vQhr+H z`1=ow-;Xc|(?CZJuamkB3#B5Sn>o-ViZ#1cZdnX!=|K#7c?k-Y$+|KZ(vjz@`s!lm z)D7@BnhauKs%vxyySZ6Y7d`lHnLLs|m{flA=8f8+ki~DM90m}>LcK1CT!Gkc^~UYf zdi(N{vBHixjz`i6u|ETl=EmK#KthfIe2>Q%;J7=c&{hq#@bV?|-_(!H%FH4_o$bKD zcBk7xrrx;C*GWfQ*ZzdzxS@icVZ8LEx?h$%f$A6`iSQD|CM?bICHo+9+pXF{kHd=< zsi@(&;f%`F)F|!v?y72)%5A{z|K0wK64T z&#MD}NPV4*P)iz!-Hdf*z%EWB4v-bg1@?gCDygq=on`oyFr}v$t~2h6`5NnB#~dIC zAy%3YR;d$mtT5Eu2Ay}oV2la_@e1ZXjps2;VKTz#P!39{)iFe(VDbkAVy1<(ttogdFXn~>n#%0uBYZ#T=`b(@BLT%ySe zLC}iqQ?dQ(yn4R#2A2?yV>lWc=P+6+9r1=*@IR(f4(LK`mqY(@p8Q z5cx&2u9F2lV@j(vaf7G{lxcLupCxFmg{|k+Kex8EL3nlofa54hMVAFXnah-+>1-pJ zv9*fE2A>BJJy%oq4X?>P38VBmz7=S4?1s`nd_day8rd=fDF%k1WUaKZXEsr1IrJXI zPdX)29lDny%%0#9?ffCwd}I_9%%+oVRGGv$b+o@p=>8P=-ZICI>jN*+?FYU3IBF++ zhc+o#7KB5I4IVsLK5MtJ`+=cPu@I=SMEn8HNSX)-9E~ZG^hIWVHSQSmMzvbqGwxUC zS8SAWD1|qvj5(G*KGD6vudewM!I&mehs<+Ng8!w@Kb=&}!1Y1@Xe=essb7aI&e5$B zA0(o~5#_&Aj~lB*FJL#2hSQoNDod0`B%n}?rcv~kuA#)ZU1xS8S2hkg`?&GwL1|8x zkV~-lo0}iAoSQCmVp+bBk+M~pR0_wGyh|c!X9@_l0XU0#?`YjQ&ytl8bxvE$&|*li zRU9;38gpa#Id5alQRN*`a*H=~N11pKu7mfv1gf<@a|7(yDdv}s z_k}oiQAAp1uQDEJ)B^gfC&SXt-Xo2eoT=DGCbSGw#i07G5qms^Q^qWFCjFX~l1=PD z1l{pdhJR-NNWKvOWFT*+(x$n2^+PwF1icMFlRyq@>Icz?JZU^30LSz2WS4&KY}Ao_ zJp*A;JyHi@FANX{fLT6=LqMm8u*ZuA`R1HPc&RUfKiSQ0J-pG&XMFa5XiIiR%vh;R$78)(fbS+!PPek6oM>n{!8avo5ouEfuX08d!yBFidw zOJk2N6O(8{K_ekz zVHYC+CqDdw;VhPz=b2+$R^=X&JH4$Cg9LX6q0I~E!n1ICSyHGjEL8ZDq~%;XE|a?P z_=Nu)FD)uAz)1p*rMS)uY=28W@pT?)7bM5QaavxeST!>_!joa*g|eAwI9e%X@`V$X z0-34$vs!vkRd!)zR~_M6x(mnc>HXB@WF&W!hx|Pt4CfLI4KOe0oDjI<6_+mZ7dv6O zjF|rOXEaZYM8Eh#m&DdVJ<)Od-o z&Hj6$%OZlVB@`<&+OLBBWFB&rqkL0)^X22;cXkwNTL`Ori~Ih0Cisnyg|Gm4%V!g^VG@1sua;90)Z zGuM|PsF=>F@RTzYuHj0YsA^eNEdHUKnoU}l|KBpHV=iqA-D}5b&A(^j7V|ls&728- z4wMEQ2N0|NG|s%p0M~;EDRCJ}743vOh1+dQ(fTGU>L@DIEX!PW*x);6o#yVjrhBgG zo@=`2n(n!#PtP^YM)0OGOmj0z{wgc_*Rb;KrTsa-15;IWE71NR8l$+MPou4}RFH;s zImGZjmRC6^P!o28@;A`5O=QPWOaQRZT*R*Olq{r^Loel2{2IC9A5KWGNb#9cw*XEY z?b2M)eRNe-6J{ghcqc>9f%W2UzuOBa$@h75LF%;eD9~a5F)ApAn1Z6?s^{+O_hxG9 zt?ji8@5dkHnk9$r`K_`6?3+oAoE}Aw!*W+ftTb!{Ipfr7qeKaZe~9)1RvArV6Oabg z{gz*eWhuFc%Rlpd-(2RhZ_drlNZn)ql(Ykx1h(wQq?;FyR?Q7#bN2|imFCgLiyt-) z7IM#jjXYZsGJ^JaLJ-gog8_w~i{qNM4T+s-Bk6cjTf4hrZ$G>Cxln5-%E_tP%Nbo0 z?Ry)tkV~vlOt=U1%dB^a?BpAv{LYpMIcJBBk-B}%;DZ3S{_t|;A^)d8Ld`lQ(QDNb zGp{6Wj378|VI>LN#Dg1QK{a4c`1QgH$3#n1`%qx}4O#&lF0vmUnj0Z@d77lXuc47K zx`H+ujnv|0tjrRr@`RXxm0wiq(4U|HcPX7}A+9}47t2{OoQp9bCRv7f0%;C5yQmt; zDd~Q`DXycD#&7Z~2S{>T_)Ou)60yA|34|UQJ9UDQV5iY}FpQ(l6(Oc6_ohYO;|9%^ z^|fkQBU#f0bjKa9G=6-zvig(0VJ)~Fzzd=ziZVVTCdS~l`phK3B|rkE*40Ymk+x}a z+#xFOUv6yfAHHdBZNJ*x|JTdyy(2)t2QRjdJ}M2hQ^o?1V@|*@M91kF#>WuN6sVy8 zE?rHnJjA=_MY^t?wk+2f%ABkecd;~E2X159^b&*COompI*4?AI6-(1ZiZnNF21D|X z1|g6L7>3W+u#;;zg}9(G|Ji+OnGtmPyd879t%to+9kF1FaAH?ON#w2mjbSg0-8Z~@cDSV; zu|a1r7S})R(}8cr0f$tLfR_dx%yO$oJkN1*2NXcZGY5SpXf)8V44xj(hm*^{%ZphQ z!Vg*=N2y|y!8P8&8JwxMuVJa1GIQj>joPkKlu_tiS}V=Lf8snLBZtzGzySiqd- z*O_p9_<%u@^M>FkrEceP!)@Hw?S@+^a=oDvrsNUnLp9Tk@djC|PT`_1f-5_pDDmS- zM%_`=H_gCN>2=%Pv1B(T*9i{V?~FUPvc>A0ZvenaJLdLXRw#~iT+{GMViui+cxEUZ zyKR(goC2_!jupO5&pB6e#(aag2|9>NYpUbXBH+a^aXmVDN}IS|#%ro*q<-aCrP3@$ zgpe~yAJQ!@O63a4F_mA-PoJtK^AR6BC6Ks0rO*LS#aA1@Wpq6$-A=BZ|4q(qMiE#) zeYLasCppZPKym|YnTs!T6+ecstvp=%Kz~Rjq#DcLCN;WcIAr? zg%U!VB+IJaQKL6xVdnJt$>C(o_gsd?kI#y@tzKHk+rT7TC8qMdadc?jg+>X^&Vj{jg0 zctHere6$6r&FLxS_A-?#`~%OvJqgAEM4By!%h{2zhrL5bH^1ViJ3^;+09O3*<#fH7 zkc7h*JJ@;3A}YJiXzx|;V}8Cfplx??;jTAF{+=Y^!Hf!-oMj2->v2fOnVcJw0w=0I zp+NY}QFsQY0#>i`p4sh>%W>4yB-9Rm1C!nmLouDFK?k695EkX_0yM};d^&tPgtg1K zF2Sf=6DRF5h9Q+CtUCugZzRa8?qc$En;HGv4?S@+T=f=*WtL&!=uy167OECv@hWT^=A_^%Qk3=1Bu??mh4S&cft} ziL0e9L;Xv5FU5SeQVfAlfdo^hgyzO+!UA$9uocjAfJOGy@R$F5@kVx!W0x!ya?^=@|d{P7o+)6f-ctN2tww z)cre+Sx_YeM)!;IU?>h2h|EsUw-g%qvX7Fdz2=sHd85@LSG`uqRz_dxt z=JxLMW)tBGp>K0Byj6afhDi@n_q#J* z^5x!I%EjxvdL5141|tgKPqF94nhxezUuitST1UHuKSzJ=f|z%D~ja z|HH4fwQ@Dt{3t$sbgwu_8R8EY;H&9ZWNdG6E1Y$EQ}MZCJMpYk4~F^l%Z3;k{l0z z7rBoUPq3B~Vo@ly!Ko_$HCBI(kBg z`f9Jf*PHf}tv$uj=nfD^;!iy)b&XA#E8Z0G_3&*8&mFy8q}v(L!@b`BUP`%_Qho<1 z<+Bk|`t0a`FR$FoD|aie4CA}MR*T!wjPCxwlXKE1x*>}vfB+uPZd5-RPv_=d)k0s0U|mhU?MHg00rnlg1^T&P|~I;fS&ik=;pNEZh387?nJq&wr7J zvjM9kO0S=1yjAYP7bM?Cg}LMR>Z}*Ff*uA`PWWSA_(WI4r2x)A#GfuZ-1l$NEaL6n znp(o_;BJA^+)T^CDEwuDzKKKr6pQrRb(!G<4pSu+D;yN74kGlsyeNH079o-*a<~VU_YV=3@a9swYX==B#so|=ACu_}f zuc4-#GZ&BQO`+2YYbZMHS(l|EIZc&Gu0Df@+q?-GWrjhTY>iGC>)uBEERM9F;8S)J z)v;6ST2A|5B?ehNZv4#`RQr04WqO%D@fJIS`iyv;xjgw@xEq*?;cY%0N5e$?mLlz) z2(?qi+I+#bd=tU;7$w`|a@lo@oX32}z_I*I2rey&WTI9l^%qsOw|@jbBu^?PB}Lk+ zD;6=w%}S6Il&)#U)2`R>U+Fn-_f z?Y#L4Z=vbU_k-@`YnayG%$v!@kAM5>Cw!d1w+s4qjrfchPBH9H7vuLtj^B$0hvR5i z|NafWQjZ#|4?lNR#k)()n|vTV8k0LnTAXZ?Cq4s$&I18~IEH;{OexYcD zF}Fb&F^M!(KYB;JB&Gu*TkOdIQ?sb6XrkT@q6?7PK$PuWVN--s@Iye7AlfiA8YRw$ zm(6MQ_1Bb6uZJT2^C&94FAXOx5CG8^9iG*~yQte)RPO<~tgDB(t`fEx3v@w>44#%g zJ}qG*lI4z)$K@n$p4RY0E*HANGhSBDs+brAN9Sb%}AG1*f4Ee5~>Bu?qFV6PDzE<)Nf zj#Nwad2qaCHc7y6SwO`&%^bf+bw%7nv64VpD|=3ss#-iFRM!v2?Qcvc)P~&rg1*?n)=S{pnO+Em%QtB#@_|MK@>`44kX%GyEJCf5zsYvd^H|cTcGRJt4Sa~CnvjM_DX2CHvsgL9G3FUaj=?=*{ zfI%&%F|re|=mJ*ZIArx*q&M{g`nP9-so@@@TZD$77`Zth{G2YM6^<`Zge}+K@74}J zmI+R9X;8J-NSZhZ^#SLK=939=Gz0)I*LTb67|HI356+~zq)XB&+YTAhvC6K+sr`Ut0mn^89My-IIStBN`C0Vj zoR!oYmtHyheP*4^DrHJp&zUtaVM4869D7|Q%DE5l3ll>`KuIv1rh@#SC-``2N zpN~x$mbM1n8j=~&j@`+*#YIg@v5k|A-fb-BzV4f3(C0ngtrFk1qkiocC19(KkYNH5 zH~FsGqlTG!Kp$$T^2KJh9xteIIqXd;KqKWednJFCoiduxYcx(Gs`C<*xkE-U2LJiB zBXzhSQ7y^MugoOr6Yfg?OIg%F++><<+|Q)HD#Jin7ie(xn-adK%3@F{tacP-xLfZF9!k4 zr#*XW>DL-ivcMIpiKDFOw@ChQ`M~o83Je1*p9ydBx~EA>_4TEWer_%vA^KhrEh~a@ zB(1Wa6wX#?)kQbqIEh|yyE2?jm)F~mW?)AVP$ZF{#6mf#mO`h!`>Or2$Ei*|-gIuR zV!a@Tp_=$5Er6KXnvl}=HZ9P?wGX7iUTh9yTU*cO5p8@`+MJ{~CeIZyS=;&gBD%8o z?E(TK83!}pZq5wGE?b9pThAlx@;^n0Pi{yHYx5>NK;Mo8E&G154^{@Wd)?EFDAE

        ^8=xsl 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

        CVv8-k8HZrARKRtx5_(Q2t1PU!O; zItFS76n+dprj|Dk{u(^%?i)evUj1oJmFGQr)0*Afh1E^=L2OnMeHDwUklolgCyA`G zgexSPs~9Md_(7EaSR37}eBdvHH8ieNFZr`1e-_7OmtMLmzhRq;}ZQys@m$pLO?DrVT>cW|_0wp! zMyoto3T2Ed58qD}0r)mU6j6j~rH@%@EI+OWVtu2v_xyjij*rMg4}NVOZ{aWLQ%@p8 zl+Y!LkQaQ1tx^7AgXby}-I(Dj1uf6j(OoeXEs z6`TM2a(}GGqhEvB)VzkJq{G32G#8z1s-l*Tjdz?NDilQ`PBJxlK=kf*T_siU$=JLwQ z4?nDNbIU9LqHLU`i1VGZ^H5p5An}zc@UY-(7j36ey!>_Kcg>Ym;x<}_QCLfxmI9{$ z^U(u$Jy_QPj8Voop9p%g-j0lRPI^*G?~B_f>dTyzS2lV9!hGOiLas3ruP?6|vy-_^ zDNPinD>b0!cgOwla`DxcIZXtf0HLQ|rdVvZB!0J&7W;jr4DPhYw zlVy~kIm-RKDt=i0aYf8|uGl?VT>01H@&5ccxX0240O$?h?!^FEWu`?m6V@FUW4Tr_ z=d_9sCzqI)6!+7T4JEKDDVUUc>D=n~)Lg6%u4|$=C%5N@IGKGF;0gx9Q@S|Eu+4Lf zd5_Ddm5sgK7uzpehre#^?1;(|fMpMst8I1O)tQnUR}=;<1DmaF(NEF&Te6-_C}k9z zPX@KYFpgB#wJ%zXj+&0!RZ(s%l&Qw4u9Ce6m8d0Ml9><(19vQck2q;@MZ9_* z0EIw$zu_`iaD-M`25IhtG=c{L^&W|3mHJcD3_UviMOJt1Qmmj{@%3&OH{LmOou1Rd zOwxhXvw=wTV6%Y0E2OsZ=ut%KiKv9I;;3gFSU~_sQ$g;)8)1fU*m0}db?~+Wc3dMj zXs?HSG^QSrGIwP|R!3oT|ldKr`!)3-Xvz^m;d=uAOr?$}ghZ(I~|TvT}+VVaR6RYBMFaE<|uO zXagCd%ebD0`Apb=enY(hR67vvpfQ=1GrAbU#sW*T`wGL-lZqN!sYD4tC^gVne(u_> z6=v#?Te12ro?mO|4DH+Uc9ihZ4p?g)ST5#HB-hG-u_fu=@nVp&Xa|Uld-jF!01t4! z_yBXvzkxQcaNagg@O2-~@?}H1dvp}qfLe+*;u61n_nlaqf6M!Ap~(z7!1mz`!Z3o4 z@3e6}VfA?8YGXTI7lU-eFZ|Z5z5#Z0>*c}W(c3CEbzq;t>B8lwbbhjyoRBiN>EPW2 z08AHHq)rI*fCj!ntpWjVR!`>MwASnYXVw3DtG-ZTrjvQ<k=rm~1PH@-{ppH7z77KhdHbw*^KLY%Fdc()4& zKNvf*7FKG>lF1>i!ua0&A#lA#Wf9QJ$;nCiWEua~#2hp`4E=er^r;2|R&^>8B8;l~ z8@Ex0MK|l8{PSdmnxHvvvY{~pc3tLD>HsqL9mMK^nb=2)JC?&C?_;od^j0RXPja-F z`Se0&@rY`mH1%@(@aT6{jWY!itqD}Rp{^4kYcq0y7lPAag%(3B%~wLWsiBDFJH!k` zhDsvdwK_R6Htuy{=_nVL=H}NjHfJHDdYKx7oZ8!qgP2Jdj4Xw znt#sBksSF~BzK{Zi1-yveZ>f+Yt*dDAyJ!7*ib<`kV^QyOPpP~EXu7i+3b}_Vr0V| z$)zAp+z?I|<;tFe_ts+o94UGVS1-H~GjC7k6r5^!J(l)$YqbWJ0p;w&zEGpD%dUZFSpEzAezC&qAjqeru z%mpJ~p63hr;aX>BfJ;zmV?c(=gkubqF7>MB*{f8eq5qsr(mj)|f`@8+9mWxa5VEp( z6~qyARA&_IpV_VrEU;}%k4=iOh`imL#Ltwg;wN*P)CDKSM*TTGQsCF)bIG2J4CmSv zbFCJIA#73XRrMo^_sUE~D-?w67Lq|}^=rb83(<=XG8=kX78g*CgFz362#{?%ys&N8 zx25;VqX6b|4 zp333YrYIZSmC0o_n8j-3@K>!+b6Dl;ZB4W>CwV&q-7Up>TKZJ_v{o8RQ(_>8=oVRW zb?n0nPbO}_GH{l2FJFUjV44fe(Av^$OOY>Tt{is#K8d;jA-h9=`ZIs99e`e$Y3OpCbGcV^r`eeugllUbKq2-tpy% zuQ{Cu;&94kZCtyPsZn7CF7IEaMm2hM9R;oTF0(Oy ztd+Bc+|2+Zkr&hiXEQEVNc+h}Z>#NOux(&sZSw}EGQb=lg^gsREoziPJ!g-tcp9hFZlqNEQ3+ao zIfU3tj(MD=|9UL5F0OAMlS4`9;4IIrAiBcW&M_}H&@iLl2hnmxp`M0718J&C?Z62S z(2U$6OY=Z_^lj|z>}+iuwRYEEZ5;~Reed|5OPBvjJ*N!Mxld~9z2!Q=IU-sR>_HxtxG8Tt|^X9I1}+P@I@8g83UUidsB+COer11A*xPC?I3i*5h+Fp z2+r;P5Z!+O00ayh?_~cRc@$<^;5`%G9R__XI7iJv0L{SSS{bU zT}LsPs5io#?ARc7E+b8sU`pL)l~fE+Z}E@g#l9y#Vz&sDu7FfMGdrRo?Xi~dy>)o1>|EaKm-PKR_oz#1Wf zr~3;S1@cNz2QU4A?xBxo2{- zys>F{h+~>Edl?*6x5Y}l03e3_!^o}*7U-SpUAR)S94JE(I3uSGs|o>H z+;Sy0{BjAwS7s7#W@Q&I6^o29-U<6dyxJ$rzmY$7x|s*%n!SE-r#{*12bs>;>jzDG zH+8?hrTaB4WCmoK{QKu~!G_UPVuLH?0>eZ;1fe5~`{3vI;9s5O$zu~q29&^=!t^HK zjGLi|2Zj;Ugzq6%Lk@P(OKg;zVv0Kn)PRfn#n3}^bTY=36`$c+2qOZO{OAn#g*-B% zE?`&jpbNP6Jqx;>240v3UPuI9P=|s}g6Te@v0y}sl4gB(#nAee3w-#UFtyy&gCb)G z>$^MK&+n9oag&)Oj9)c%nJM|YCHc||ngg|8hN8()RZ;^jjRlm6v`j%w7A1?`eO@Lw z3)(}qFLG3qaL&z9%mc(I<^tRUb36vS#Fjo$eu`=Cgi%(D`$f@9{D|d@F^h4&Ho}R6 zP(A~FpU5YJiB{dk8ELgQt5ZgL%19>|Y4fn?6Jj#dF{~LUZTH1k8jidpW2g_cYECDBRjU}X<5i+#Q>f{6i7 zKJ$E!$R>k#mc7MUXSpX+&Uwl?Cpl;1l&GU&^35iqj8QQrc3!{R+SouV;*B!@NE#xO z4NRDD7)FGKW+~n%h|E(;5gNo>6hKMq2TjY5J#NXMQ1p_2G&}ytEF<3@HZ8M77#}`{ zv35Gf3n&l<{tJXXj{dZ--vX@6B$%PbM=)3!7Yjv)S*Ok9S)<5d6|C_gzsB z%EtRw>o2!AS{tvpw*J*b%NC>9?kjq~`>N>p^(cx0R`ov>pOJ1p!C?!k7U;vkF@+^mdC16zDr`{DAHP{A_jYAsRYXsq)Z6mse=F z-vw_AyE&-i5$Y;m8`N% zBW2{iA}tnfPM-19>Xs|XM}Map=ktvbb^2FgX#3iKJxVQyph~uv(c^&~p2M?(v?h&gPy}$t?J*!4%rfQJ3Vti~;*dYV5iA-%)twJ`) zLn}OQ>EYf!7%wiNZVuP&&B@8)!dvlCh+kIm`&(MRtj?P;Tr-KqRd&YMMuQDgRm;R= zWjAXSaC!(|z>Af$*XEt+!A%9NHcG$h@qL?2#40)2NM{?PO= znD{j|b;Y+nFd%kNqZSe~s-bAz9d)3ljLJfW)T&A4X=8W1GuQdcZcrOXQT#V2h*ua` zSLBU>{l2{XfADKW!TWYw`M^nwJt z5PhDK<8PK6Uz7SyiS3lwPKoW5*nZ{2)=DTO%mN64NL-iqG*6iVvix|Al95cS85vx*b0{*lH7z3(Yk#Eat zi}fq1#f)Y|#7(^>@|G$KBY%w{NQsEzIg~F%Le0y{W`$!guHi5&g%&yDH%mJ9fYP{H z-*jmAS#by`s$&z`jnYQRsO_}$0Tl=u(Mq7sib7>()sh`_Q`NN=Q+}z)&>Q4l*(C*g zo0v3Y4MgA!hJBs*j>ALK=FoFB4JOJIQLK!?rqFF!JC6b=F0GxoI7V$qzkBb0q^DTa;}3}4iR&Wj_o5s0*iCX(6Ol+K* zHt2Yd8!Iv(9*3uiwO6gT?S8MC(3hIm_b$skv1*fviM~2IIfZqoM%qyLooua23yZ$D zDV|~Mt<>$C#;YM_F1ZK3$q|+45=ZDjI%NzUm+Al?ro%UhRg;WOTqCR7%^f^B^KS?| z?K~jceII#jBfE)g9pg`X>~h^{FT8SEB#{lKoTyzdBHYGNpjfj}{4ISOf^aXRi>ve$ zcnT&;%dmq{kYKZ|bVMKdR>n&iBV6CG&B?NOR$Y$Ya$BK%Y~#Eaf+PBDsvAoAjpWAE z)7+_2@u3e$x5wBa6Dyaq0++FH8jpq)&!XhdXT~tn6xS4qDI9Zz*3lSw%8!lyh z6*?aJd|Z|%)kviaT8*-<tK zL7vZz%&p9;ED#nOXTsn@V8L-O%X*+?tRdze&kGqf7w}?(TZppQRw8K#BN+on8rclV zR-@=XGBhKFgbKJN9T=+Lw|vTiA?7$0%K6n0_H~}DMX7h(UYVJLv`Vqay^@|NN)bc> zdAj1gV?leGC(FR6{~nsrZYSr)hios z%SlR(#jJRU!@P`!aa3dUo)`U)`G`aW#CT-d=-`zf1lN$tp%~{IiXfB%g#H?_&c^mN zE(F@didmF>a=jFNpGdYcScXKAG2|#>9#)A9+dLJJrgQrK(!KOn9xzzC<0c0EJz9ydvrYtAAl#1^6rkq*u3| zR1-_lwmr(M5T)n93=U7#muK-@4)DVZdXMGj6Z!enSV-7rzNd;bz)~X&Ftc}P2aUu4 z;@Lo`!4;!Dx~@9MG*<9QbY8L=fuT92R96`7PN~fux-4tkDzz52L}-Hs1UX5Qg zii?Q1U^1bcF1z6k2A-=&r=x1JTJ_bht<8UT5F(#u* zHFiOoT!Lq0<}e-Hz=mDGD3zlwfFDrYGdq1Rs#~KeP|_sc(yoVX$g@u3RPI`5E28k9 zyjMv+R@0*NAPcYd^`wlLrequ7+8u>~GS{sBFC@gU8~7^^xtyz{Cu0u;A+uli>#vWA zDS7s!-Ugth2XTBt;gX@k{yM)^%fflI4GgOB@cD3PEj)X&@DVX8UhB__NB?IIpft0# zCd=aMJn(>#SB;{^MW~vpp61vlbRDA=O`BnX;IzEjGW6&QSz`V5iA@mli?>}sdiD19>LQ$>MVNF4PJ7S*9Fz>3sBmIY)C=YzInIk^Dp+TPJi@J0mJ_dxV*hx?*GFm%LR}uvz(V z(f?Gp1bs?l`{X8#VN1woEC4h((7nSKi_2L9y$Pr!?pyPLWf-k>em~t5+ockn6`tdL0BbOE zz2M1&G5kL%lmc#_FqT^l1^G3Z_3cSxWpuH!pnpA%r-S=)%T<7<6l-I6%4&?M9D9l< ziM69}+{STdg+McBuK8`}v*dBMZ(P=d{JSU^bHOVpS(5crW3Hr;p5)v|XWK@Y9cX>Z zHLp-~rr=PR*q3^?IC~uGJmiAS;^ffvr^Y&OtchL(Y@!rhUrCf3IpE=GL$4*&uKK|E z+I?=0jxyiPaA1l0g=mzrnJIutn8l)6|CLzc#VIp2mYMqR=7UVI8OsYL3*H+)ln2OI z_n|OH$;Fs#SAv*1lRM(GJ$i(PJIO3jKV(VDY4#*K22|Z>L{Ck$eMgolFxukQD6%kf zStVdSx@2V>G|RBuI1syAHt1n)6X;u^0ij&MTYvJy3dm2(@Vl5*ObYrgU+8@H0Nx`T zeHEjcc>nX>=>kD%Uule6D&P;!+5Hfz*iQ|S4bF@%zb2{###GI;5)sCtF_0upiTiFu zT&?J9+obEbc1ANhW_H zM5|jvJOvSBEAMjWDm$C=5tlp0Ehr7|w`n-*G{E%ykxO2-z=5CyLBv3> zfDzyrTj+X*?=H?g7^kjoz6#HgwQS+$$6p|HBVUa!set7RzQnYI8Seudc}rk!V=tNG z0kSd$n1(G-FM;ju4 zn)@LHZ9JMvwdB&uyJ~JB{!B%1+kFM}%xPo5HiSj@z3n=v7eg*CBhRzs?W!l$YOvT? z5Q~fW6>l-{#D0WB>HG;|O(ou0l}HfXuXoj;1I1vH!y;zQrev-|t7F&Y;@djCy>x6` z;OQ-x&2^RZ!bPbiM0)YgnpDNUjE_Kt=5^Tt6&s^~3qu-8)U~X~-AYlajZqz~;gBii zshF!06LmUYVT9$mwiuwb5u!BMNFXZ2j7tv;9*^7QUtnm~v9Zu? zEL6EOIRImx0hE$Gwma1tHD?7tM=>Tsz;2wpAS63T`2cEl$pkO463ue!<<8#o^_|w< zix-DmN3Emv=Q~@ia*3}X!*jA&$t;6P4pg7^9kp8^fTG_iNP`$X(`qmeHf!ij=B)NS zih~XX$wf^Gf;@*`fGIi(83ts2#fn(m=w3-lpt2|E8)ndVIu6JthEf++^Uy&kMkpk; zF5RATaEcNqC58&hK25g9qjth7$8CUmC?LC}6Lv9tgMum^I8O>1@~o}~RYBbayv7tE zI)V2}nFcv=gWP>hQOXM~`S`n3NeU&f2!^3g#QxcBSvZKNOjrfwEBg z9lbs|i#tN#S*KGYu8U=Un5h*6qk$APFPNXFqO$%g2R)0tUMPNZf)U6?Fo<|y7-_Ei zUD95cUHDZBSb3=?@BK*86_3=IQ8@DZMdaCK+^QJAsC%Pk+G?15tWCOxG&2x8n>AXM zjSW~1kc&G8TCxYj@QTNTZ=|t^v>(QRsWx{0a`!b}A?H(ULnoRx>Y^)P_`k2v>qm^)I z+m*(TjpZ8OsYn8c%}7UiSKX;Vafc3+R6!+I3C|)-R)>r6Noi8kK^CC>t`kTtQL3_B zd>x{fT7i!6QnZ7ROu3I!CeP@^W=3EEs_OKvIOGb20>@^Qb(w`$KlS(?P;~4Xp<(i> zMiXTV#=-Gdgdw_$e8cTTOjVF$Dy(3Wnc5ev73Weq;WxTgX#HJb&UKdAJAp~ciHaiv zL#^U9>+ftoKUhEbcWZl7EJO8c*Z*zn;Bb3yS5yYpe?0#tEgWq9w#`lW_In3y@QSq( zk3S3VG&A$J3YCfv{+{b}6OB=LtEfFuf4nlUOa<~8$!dM4!Vgnr6&FY$P}B)Nv<4%) zFV-94h1GxWiS2Fi)4R^o@ITi7biMxY+;JO-{D9hEER3Mx+TqXg97R^fk!_h@GM35b&&-Pd^?;Q<7tcZP z0}^M!D*W^xzy0`s+Ncfy$?s=WqXiUmL?Kk#T%gWaT}i_Ay6#2=zv|k7?Z3BWT?hE~ zAcVa~wH*{8b^(SM$1E5j#`QSFc_pSO4GbYb$|P(NSr0slAyT>MSLD~aM}-r%zv<;q z;l1%Z4sK{`=cu*50gUC#-_{T2a*tt6knN;4dok|VBDWJuS&*{tbYSCRP>4Pv2AexO z+Kb~l=RI@R^_<6uU$j<}#c!?gyi<7%RpcP2E&lQ5`NrnU!?$9Qq_>kf(zKtlyK_~-b9622TX`e@`ykzQO0B#Mp%v05Cz2y-O#;t zX4l(r?wU)N%S-%Ey@Z-LK4_`N5I;jqB;AnEZ0p(>9PebTJ}M@zSRiTufbiqFwu6) z5=|7qr`6ipdC_X&3B#FgiMl!s>P<3GPYQ|SVR}wWM67iN-e&exE{(?4Gc3czW^$XO zHIY1IL+;&l!q0shbsFjr*6Flip#4s6(EMa!Vs_At_5y8%5=*-$952R*3VSc)(5q zQ`n^ua_mXqdP9e`WHE^l@3UR|!uFw!b(i_M$ox*rTGWV^w?q{D%}>PKGkttqc=X2IWH@uZc+E^sc_#0= ztX!d^QLZNXk4X+yqg1Lpb1OxDNAZoNkFa-j^U0xCOU+HiA)#~BFR;ETPv&RVV z&_HaJ6)tk+6#Pr~LTRPvu%X}1_H!b&%5WzFV33tTP&SL}0Hk=uRo_X;%cjmtLvku~ zM`Wr**$MFOQ%b$KHs#1Ac~=_P@eouu$e_5Mj&O+e$!H`nFfg08VH>Ov2j-#Qhc;F~ zfJ)MXG(4m=v|0N2B2LwNE_vOux?b)E*);&dqRSXPd{|KF_er;f7d8hEz(&rk_qMce z)Il|5NLG{woy!*RI!a?8+aqoh;0u9EMoX(dXLtkp;Cd}UP5za%eJscDGs(0Uc2(W? z(3x`wHRhw#z@&~Grd6)P#xg6{z}ocwQdXvrxb*?xS!ZDN>!H`dp#Q3!jpJjY6N@q=F6uSU z9z9w->vV7k(x{un%L`J4k_1Ki(8&4Ub~zda+UQ?W4LQpicm8|7R&TeRGwxdj=xme{ zw2}cgbt{t3gQx6ls;kQ4lj-+9zP;|m@Gr_;ZG|cHa0$q zIvuk*0z#dht3szTorp@dQm&ZQDR4cSJ!8fX%--vs1*swufdX)O{r9xgE#guPkA@j- z8azX%#AXQhZ5+Pc)kEe2S^GH?afN0JUVl>MI02^0+aWmu1Pq20epF^ljHx9q@GO&2 zYV=w)K^#59HrW70hCx!+!@DUvq*I$@U{o8Z;D`o?yNqd0e1(+~(}{CGGsW)_GKw1J zW|XxbZiJsyljw8D~d*oT5sGF={`W|YT`3`sYoHT7Y#g{ zC?rlhEi$62K<6m{a5KopQ$O;-BEEz1T3njul(JrX$P>TN&l&)0}UYukXU*piH*S*xaq z;z%aVy3(QfEQQo1kff{z_z{+^ieh)41(AdTx(GAv~ z{+#rX5=I^i z5OedT4+tcvz~FoiVri}PNsRz~$$D|`F80aD2p3+W6!3GHi_O2{Y+1NVW$A-BH&@|T z(g|_lq>Qr3!pSLroGi=>F3`d|hUSSZE`11N@1j@iG)ev~bTbk8#b`t5ic#~V42&eZ zqbRQ!HO%?AZ}4&{i^a*(H{d5T$~ zMg7;ThE0D0b!+R=#qHuYU95^1sH!_;K4G!8_(x?CU~Tb_CHx5B6XA)nomCc3mKWE= z5Dm&dRZrtdK~(T4=9Q(xhE#D8y;g#1Bc6)Tn1__}Mb^}gpFR1!vs*Jf1L9r@$c6w; zQvCUa6|6DW&%XvblLmNT?|Xz3E3$F6NcWUWgI zn_XwkIe{SjqF`)gS_wl*lBY6l%lfO5k6Eq8drGLd0h<7OULB_~o2ZgLjc&OsAF>G0 zCo*p=tGtzJCrPWDQ(=wR0dzU+Ij5pp78QdjC}(TZzm~b2aA{L&UOh?O_Q&QcOipsL zf~$aP{Xi%HiNP6hVwp@t8GzRHkjPRV#oP^ukNkGKF>YC-g^Xz#M3L1kYrW20vqECZ z3r%^UDK9kTg{HjFz4JnoiQHsnh%{nFM0b&v-D_O^4y1Mglr<%^OXUc(?s_3g?|GEj zC@G84pe~0{I`Y;{gvE_~+~|gf^q>Ll|6FUHyUM$Kr4F_(rSeTRD1G#XBhm!|&GC|o zd!nV1Z=hE4E~%@cYO)x}TeR3OxDyS4tgG>I(HS@xCjy^N0O&JvfYQ+Jnd+}%ZK{{ov+ zjH4Nh)%GYtP>)LbKH2%;b`Fx` zT_pJiF=v@`eHlz22HnifeHlbC9|k~y=tSHPiMLl#M;i!j6fKJVB>@-EFYSNhv@s(u ze2i}fqpF+D1YW$I;M~V{%2=?ho09IY>i!1FAs+rfC=U-HepZ(P!Z)(f3};8?Gn0o@ zRWKuoTgwSYh+t9F`<)6qK%ByNB+7Ld=ihof&B!e0D6#!Vf7Gz&lQ1J{TW z&&u_QZrd+gf#1PdP^$N4^%PDUL1+B}mQ%hfpX!UN>$t&8%spb<2p=CSlcSimU?#!W z@SYjz5C7?Ypil07x$$OcdFAbV?tKW}g6W5JDTcR+J{;z1EFwPY2dG7{+;|KaF;cz& z+gkbXYJFqx@VK?PwZF6X?^j#9=xcxQa_i`mh%_-{MgU(!y6~lF3S#`I)b$u&o{#C; zk#}y(OL&t$&p+;N9D27^CksWoh&QLmLErPYk@`R^ zCLD~};T53FNP7C-_S;?{Gsyx(HLHj<7_`Zd2{8@Ia(L!~xIt6Y>Zp&FoRLUp!0QZ! z!^#_tIv9%KinMmemHcXWERGZBVkQ$u$|c0}UyltJ#Py7An2b~-mmGOz&!z|!GQo`) zUGz*P*;THjnOHV!oW5dkLE>%!n4ttE>hElO*c$rIdn-h~I|LagV4ue>%?Jkj0ls{y z53B%QHavrYO3Z%3bd${_r+=ea8{D%Q?}cWZG2QV)taBEO$vYEKkWG)37?*4g)4nn! zRv;kmpL9l3D!GUF?^}6b80<5Sx{~l-EZ~w_l{puwAhiQIM^PUP5WJ z@mw`i9U*`*v|+V7*1A!hKnmhTrIM0x&(ZHROMGTz6~ zU8e`_k@8^9Qf6cv=nSob!?3SBWGGe?M?aI<#N=YZ?8j~K^?l}q(s?hcDHYlBgS;)j zv6J1bc#R2T!jTKu8&{l}1-&n@Mj8TC^iuYWz}@QE7H(sFsqS{6t})fLGOYM2s7XF1 z&^aU5ULU3Q098=hgO9D0vtvui`J2x&nGU=*K?@JD7^^@k)t7CvKt%{WgcNLxJRJ<@1PLh?Z=qncml_9DS&$QV0 zI+pTdl#B~zEUV}@yMSunq4W34+{Q_?(RCWXz<{B=U`* z2?MF15phnWFefu6=EP)fCRb+u{7s#FD*DNc+JiSs%WoT$TUyQe%~JjQx2Xr}M)i)gBQu2$+>DTS zu-OB+^#&9^6Sd@!$_M&C1SJqNR98K<0J#03( zI8SwZZo>d*3b+KHPZ#EAD0(vic@%Ek>ay)M%5(JrUiRTgzREK&;H%09d>jh$G}#gK z9>yV}MgGzfWu_Gcn(R8L%Q(%5lYF{Hc}->d*nb4#AHm6qTTa>Di1JCrVQLCp;r%yO zbnP|i!&5(Zx?S5X8wD`F^5liBJ1*vSRh1IUnqi`He@i@OZU3gr4>`sv#h-fa0YG-> z7Oiu68O7_+As88CSw87sjfL@R%KG_;E$DcU8!JXk;ro&jbA+o&qK1wU$HfcA)ijHx zH4!SFvYK+14-yD_81%JT1b>gefvDf&1|mDqBOjm-g2U;r5>u^?P*!B~$V$8%EV7H; z;>q&bV(fG(ju;`izbY2i#HY1*0hCG7vwIccSU!%onsegV#1M7{VCLe8o7`u4By5juu%P-_yFcUcTz;*)~$?U9v-Z40D z7Xb@F2HlnRch+C+Y(JMJ04V;0xgyoum%bMSugIvgkw2Yl%z?8M#trBrZA3-B##Zuf zHHFZdF*ERh*8%)+?@R4^V)m8n3>L>lr#i}*bcGIN^Ss7i7H3huJ$+D)r_0^f44KK}~Pffd;3$L=;c2BL>aJ1OOH9 zL3&D)7b#l7%JeTft}q8c*m(3vw<1H6FsFi?i4{dpZwFzwgCRfLc8Hdy)_cz(%GADs z)-T2!o4b?-;=Mc=k>K;o1o_NWL13E%tO^)M;rM(k56xL%f|CGY1g7m6wBw{NbDIMF!~zIYV!3El1MY^_ha_*0g-+d) z%;i;sBIprtZjt{>2j$W>W%k0l4GcMtuT>VpAqs*4zS0e$*xRkiObis<9s1NwVAOb7 zH19M~6m*L1Bj*+0)C9OtxE|xURp_woit-JbX*3$L{)RrGJXS=iDhSkqe5Tar=vx}# zasvSH>T|#`#6L(@Qo*CNixr2Vqv&oqk<~an8n>E?2xq**kZ|-S5eV)M0=C6s&G`u@ zS;pi|RYE_9Go1Ml(R?!_ESD~$G&1_ZMZbv)jIktIn#a26>-TZKt66_;I&a40ZFJhG4u=M#A4($Iqrq{jkrp7ccLa*)qZi5i^8f8d$G#!QaU_=)*ae5VUT zlU!AEnd zU#kqmz=9%av&}14Xp4nls0Wm`Z}&niW?KH)2t#)TC9?-TxKiq(L8o4eEi$a@=&~e4 z2FO$+$L-1o8B-3v$v8j&Cv3$q>R|+m$TA8ghxpdZ9A+ivFM+jvOk9zx6WmkEEWXfC z>9wpOrc@TFM*NSb{Y-HoIHl--oJmdKEihbatIFrLl*$^Gxh~1gCxjVWae9&g3yd-g zr1wy(@>H!sKv~I3l5XB$TX@ZGvVF1lECVL?avIhin0jExMFVo35ey+H;mNFjr+ zQKgDbpt`0bhDFY7*Y>SYd*@!MOii=0f8^^=8`YYOfJwu30k1i_hHl!zjN+HX`06I! z+kJ0Hq4fgS8UnW*l8-bl4zRl(1*&}9SZWx;PwG+-A(R313A)t3HNQ7Z?XaXi)mix7 zYQ5Zjy@8GbVuf;v=?BdwJOMFGK6tggyLW))n&QXr=h?=Vn<074d@u{^;ql4wUI4L z%?Sl4H9~ibecx+i=4RCd%3bO1B4AOlO#@IyZ&qK5iZU8109|iHxiovD$PfN{$z^zn zDEl8r`AOv{oHO!a0f6<QNTzNG$vB9f2$j)$i=<8vdx`qGOM z&FOj2?J_1^gGs{L>UJpS7`gvn$kdB+b%3O2ZP0bs1C5MhRF$yt4Jn>JX4#}U;%7@{ z0NBi-sxd|3N#nzu6&sAGHPofqp|2SFx2Stlq z|y#=Hs zJs3cbR9g-C;2AxhQ@=S5EGepi=0v6D*-`+B&?sOH1GNK{L(l6|gm0kfbt39am57SV zAgO@_$#D^cV?YX}y52=lN(Zw|gKdU1P*Ut0uy(aL4~JF{(J=6r9t!?20veCSvoIQk z|7S7MEG}G>ZV_f)nPX6!Uu-lM0SNJKFe$uK^^`#obsS@`0EyQPcbs<9YUrJQ9-nfU!j_Ajq=bsYn+~=((RL~0TFA|BA;#4{-C_IS936f+6i+}Vn{M6OiV)ay&Q&`fBxg0FMX}n#mFP>FTD<3qf zPSYFeJRjp}OoY9{5wV6&9%3_u20mHQlDu-|w8*dgDRcOHGVr{W@Rz8g+L#dU_8-UI|TU~q8ssFW6|G&4Z zi`BG`xddWP{R-%3fML;wN>s8y@FyIK?DGI*1-h}MSy3)}qdIL92Wv+pFL`DFdy=kz z0cTKdh?kuXw}2@d0vSWXXow8{=_YPXXnX#E1G>@UuJ61@l^I%11Px^RQ5cJ|ff{Ya ziULQ*rwLE{D8wwcoE0O4suZ(gFi*lBfCPm%vj;V!EnB93rvUVHOX-}QhjhIs4Lo`t zv?l|_1M;@yn&6emXfQO}x;S?_=d8KFE5K+NP>BcW^c>9iLg{kX&(EX#mVAgS01*a^ zuPq9M@GPzU?YoemOzczZaBF}4VEt(C0DIIRoYV~@k^taO1MLkjCStuTN;?_(4KF6* zzD7Y@kW_N80mV2z;LgxdB&X>Gq0z{(B;xr_uc~(MQ2xD0?Pm| z4LW?pERx}!=U>URyGp&noJ)!!HUx>Bu<^MfO82VYEhjlTZlt*Kwzx22ENrx{Il>5u z40+|Erv-(PRBLg$BAbOsF7)QVGh`2DdaIQ=Vzn9-84I~78q#copbj%XpxjB{Vbz`X zJj28~27<0~^h1fTs}u<_Mb)Z0;eH1 ze~j-{*}(slxse=-tfTghCCKtuVjMLQy=pAf{wc;?LrJo(F>nB$Kw-b`dQ``?QdNqc zF(P3#UL`&%rEAc!Y;SXE^4XOD*FJTbDu7ASJg!eHc5VWD(cH06Ec)lyvzqyur2AUY zad>Y0^;?prv2iXSvub>!X!U^wV+OVuoJC-sUh zueAndIVInz;mnN{BR?v7KRXMvl3nuJV)$x#!zyIEw7F?ydl+L%k4W_BilT!!GC zh+90F_{tt-y~mBEWn^sRPuN^~QoONTAea4+UmzKmKgJs%cVfeGyC$_OR}4?f*MX-b zv-Bk}Rqk5i>T!Hz6%RHU8Fp5@L^0G-SCe#K84Nv_QcX(3hqyIF;PKsD7g1VYz_L>y zYPy`9W!0*6hT7RsX0TM@x*N$oBrnb4dzckcR0tW5lfjO;N{MO50$DzDuP-1bFZ{$K zL=ns}Pn&pzNfzIuRX661q*PlVMK=lvV4vl#^5!>uMwXUe_g^2k(2At>YHxFkGP68h zi79g?Yv2|UI6(r8^Mlz>d6NwNK*8ppJ;`eR*%NM0U0LQctGP;s2z`kt)UAkvW?#~a zF|auSI91NOvCs*S_p5iIgk=z$r4s7!S14upiQNeRKLiNA1qc^`o1wL`)KY-c=>+D( za=evmLyQEO6c&@9QV1I2z>wJG@$?w>_z|VE_3b}Lj!Y!L?i5LIc>w!-^KCZy3OF76 z_1DL!1P;Uk`)4nRpzmGuuf&KUK4p@DTH^s;06u;C6ahbdv(-6=_xM`J$wCr5DI{>_ zeTz{fPBrxl#qeUp#7L3R2jcji4eq13+=dJ0Oa>bz6a2+r;b1WrUTob8lIojo(w7h? zuPK;hY?j{NWTa=r>M*b-A3*wQa?bRf+e7z%H@a_b44%l0pk1^Hv}J&5C>dNhVdtFq zEwQu7`(J;&@^PUIe?|G@LVbWt{z^L-I757D{1jzFBuWkppAD=tr_+4Ag1PGzaMfLI z-HkU7&B+(B2k9>0S=7lc>ULE>@I!a<>`B|00RKui4i%!t;fHSf*%NaP z^W!J%+5kay5Rg0P8H)0W(i?(^Z1huM<-ufisa82^Af$7Xm&BF9qPlY-Sq^I>KHiNVi72_Hm+5<7DQ6p?* zz~iYC1`%!V61q~T&g?@`s1ARfsv zxthCnh#A=CC|kjNw4_@5@PJs?d=2Dn#HXAU!K?ayuf?lzYt+oF##kQ2NU3l?PGz^I zd(_ z^>O-r0+fldmEx7NqbjA#n86y8Z^uS#oETvVov@{ED7l8p?IZ7)AnqbMHr&!R+R2K& zq{+HPapjvjSS00GInN8dNiyCEf^SsVz*HjfzI+@tWsO2_fZ<}x&GIpjrLvIJtR%I< z?D!<7<9cr0zI4!!DAbM`GFpQXtR@~qxh%euo5Ki&!cd?-l(fPFSV;@0`hZm16rfht z$Mr-T6%!z9tX37AKA6KdatO>CTd7?*KsL1J6j`y6l9(c}D7RO+E2<$CfguV@sFcE7 z6=-}|550QZu19TPd?~I!tLEL>IclwMw2sza{ycbF8DCl!i{07m z$Z<(^w5k$FH8cjeL16dvAjy>J*UD%uaF*-k+P0R_bybNnE? zH)k-gyN(swj6`Lhs>fKg70bN}=Wa9B`vNf4upsZObx1T-dlH&ZS`?-LPJqJB1p z$|yv~xRh}gRFS5HSG}*Z;)Ml8C1i0PYlnk+nOP!bTvYSQ2T>cerTZGg38+A-A3w%m zE){ImfVVN@0wNDW1)reIaRH-(Vh4qq#VC&$O|n_Sq>0h5!huJr$`GGKQVa|Ptz!=r=keM)V`Uq$^lcJNlNJ$PwFos_dKO0?FlVy*$T7h9CFYQ0X6 z>Rr1%IxEK-h*i$5ICA;E5bI8Yb;9}?;4PoiV$f-oK768%K!J%z0=}oT`ka@cCbXK6 zJhf!Hj580UN!!IJIHhcTqIBF-46w*r`h+ua#?&v%(c8P2vusKts!1)nUS@;*nA(d% zUmA9Tw{JGaq6OH*Wxz19H$6VE|x==a9HY;nwaT}Cb%8?nj8 zS!ZKBVZB8u8z^)@nnWvQ%3fl1yDh+`sn@c})MJ`};h0bo8Ie7bJ?%hGJ4{N)^~BA^ z;wr@3k!wG(3F8>d;u%0TuOAQCVFc`sS?D_)Rcj(nr4V`4Io>$e``!Ln^qDR`4pRbn zVl3qMQY|WH`6#f%Pe@zfGXlFPEbu zZ-*n_71WH^!>mFZ8(0}7Az+b|bG1wH5LEO}qiYopk!%%*!~PYIeAdBprmrJQ2&cs&K-;3%WV&PHM3~{_H zVzIz+E#nKv?WF=E^GNO>7CA5;A4)R@Pl89ZbwMCYLMh6ds=#-m9*D$v>E9vJ0!)z>BNYu%gO-`8W?1C{G zkX0z5CC?;|8HAD0dRgsX7G0I`8*ab?&|YayOq8@4cOeQ2f>sOJkcqTY6)Z$Gdn32g zQZ;T%H6I=ogvXl{%U!Pu5j^B9T(2|oMgeC(!R(AcJP42f)OQ9zu^Q(;i>}@2gOnOX zYl{2z0u=<87N&iuNmr2NWhb-VnH^$4O|RFr6m{z+#-m4~w}EK)AtmJy=eC6@Bq?DC z)oTG#9JPT8qXi<7*mHoi-Ux-Bo_!IK*MI}_u*E0pF>r1APA8NGj7UKBAb>;ysqcFi ztVY@Q?H=@M%m@bX6K8(JUlg_X@Msf*^a86W!{ygFzX-KpR3(i`Anf-x>Qcy?m|_AU zylMkV$+T$N&yANb=xe7x>YBR(EC36J`jsA-;too)6vJP{R`grvhRn^x`5v+Lr`U*8 zbF@z~uO!*>!s(Z}MARl9)Gd`J zsN6DHETy0*&XnmI*U)Kn?~Fk!sMhFC^%@U{l23`&lxTf%-A4B_(XCW(--d>xTZpt} zmCe_4bgxO^GL;=jx~@g}QmUG9`upMPFfJxte#Td(gKlO7p-E zKA+wpQp|sgS_fk_zjaQwLjjgh9QwZu1SEpctq7Q8Q@IZsw7Oy02Y=Ol30 z-;~5nN!*mgO-WoF{oFs1Gdueh$eb~sNrWy@G>_C7#codQh+til+;!=!6~8G?)wtG8 zv8p}2DgG}ZcoJB~kUXQrl;}-~-o4)xD~S6%H^sWQZ-MNY6Do33Y?d8&Q>>A|c*>_5 z%e^Va1)kxRiN33E{HcuGMP%=81oJ4x!UdcCu$N%W^*rt-$X4{)Ydro^g}f;#w?4CJ z#zXvFrb)p4+1THIv9taXC|N~)Wy5|oJYGY-35BM59k)e3&6hIGU`7L?zWM9=Z(FU+ zofjLstzXNfsJop_RakzL8AuR2sdtFg@VqstNhQ>H6zVM1b5?k9re*tNBOg}Kc=e5F{BgQK0z*2|r}=j%JAS)ptJc8;J~ zemXM~DF$|8DIaw08G? zM`jusHrVk2GG(-&utXf#1FCcd2Au$ciy1#D-T(!{c3k#1S0T$Al0Bn){$wZ7#A!|N zO?oy)dAW9~Tr_*VdQlT&8i|#Q8i|cXj&6KQ$&zMU#-L(t<+qkB8E-AW-jY#;H#_x1 ze~m-KShiUZi%&e&95Bkj46ADNqUU;kcWxdqBl7u9^U2EErxLOJnxPil!~$Xiz!yrF zv{W;}^kZ^9#C2mseDIOgGmrk7B#Cp_s`LgcsRb8v-F|R2;Fq;Bjj=pGFIOkgpvFEr zXeq`p(T&UrZltAKN!E{Wm1+TwSGV8kd(aM#Zw^!po`nQxGQ*ThYirNWMFV z=hf_ZicwcDkWHt@3FiE6nCKMq`$02!pP=KcsN-{uMOAu@CcY--&7xGuK=8lN1L8)A z(~--qgV|mtwrxJ!b5MB;MirucDpo~8+DA+VlrHaji3HySHmmexR$5AN92Vx<)ihJh zFarkv5eFVI+zSjUg*f3PJcb#Ki}U8BY8a#wP$Uzo{K5k027)|A(p@>)|~Ysza)d9BaHYbnxmeU>Y~ z=2*^4Rl6GoENX26A9hntOmB^*TODn$0Y3*WK z`$ywpP=Fo!=z8;6amF&Ls0)ewsAPq@mP;{d1Zo5G8^|9|A`qG}EL?Ly-Ul|NpJJ1H z6^xLstuPH%KeC~3+kAI5IZz^p3d4MpDq>_h>FHRuwnzh6T9O$Ou52HC7qEJ74! z@qq=R7Opq%iM6vPtvKq`pqrwMVfg^f#=>e+0ODD(=Zf|1<61^GTDL2u3F9H&aw6jv zpi>0JkRDnco5HU`TjXnjY2gq)M9=pIVt;$1Q8F{DdjVbgS=L8)SF*+_>K>ge zz{1kUjvfc}&};t(zI5#&-AAdg*0fln;$y_%#R^A|7Zj8}^x;JDPzGLi)Hg>mzV~{2 zL<#FBj-o2rtW6JN$6^e8@>FYI0Wy>c8U>)}I^V@XH^AMuy*}nOz8HX+Pq&PHR z#w(xIX%Hy8uhmEE!V@6g9cvg*d_jEjhyOeLwe{Q9!QuAauGHWg{2)AluEp*iX@6UX zub&?tMMn>_vR{ZlM_$P6JtcKO-)Xs2sPKhT9-?Y)V22i(9fG(B7#$}92(E3bYzQ4# zf!?T38eLdS%m={jVw>w5+%rHl%x7eytM%{j3W2}l4Jn~>Pp4z1un6tGlvJWtWJ$D> zm3xJX5v~}ClO5j~hPX;t4s(&f*a?s^?meJx`rwP6^#k~?#oxDH9&GIkDIe_YwhqP4 z5tQD2B@VYX#o@18J3G=atZyW9%*eW9=D`7;AjAceL@OYwC7UtB@ax#}urYAJ2G$vH zc2L$#Kc>Eu@{XI3Xja;uq1(IH#bgf{ubc>y{7%(b81Opp)Bsr5fO(qE`d-`WOIp|( zIzv16W$3j!7-V8X8(56i1mmV7zbnhEykVh&ku2>$RjkFz?8TROe<}cgfd)3vAf7!0OqlcR7SvHEhy@ z7A208_n1;tHKEUB@iQKyln)~0h4~(27XUgkq3neEA?!fLQ!1J$liZsmFv!;#Bg5RZB4o>MisKy()_ht%17T_)=rY>_w_qx|pcTyb_@1 z*&U*KQdtu9dJlG}4Ge1?UzMvmg$MaPobq_e$Eq%lM-QhOES~VcjFu{k84nk$r^&05 zPVWpEjV5r99)9_BL@9rOH3x>$AKa8XIzY-O z2v3E2iU}6dBOs&5v$apWgyiYd+SA653(H~zK$a!XVsM_xJFezkRYwEk*;9@^R6JK91 z<0BzEO)?8+gM*{IDp0j2Udbh zzw~?nb&z1gznrsoAij#9&fwAioVlZh5_X5f3gocXNNPh{ zCSV+tG-#uO4WxiYpmc!2o!%7&;R*#(U|;5-^9M?Lpz-ov^~FA*6d;2;u!k-jL<@Sx zC&4-FVjG*m3V92&ro?fXY7-z|b|KrtL~+o@9BdDXpDf?aldD-DAVt?~WX?RAU{_hp zU_>>Rx|~o00tnL}RMiBOgjRmvKKga<^^sWL{kQmi{Q!iOqkpeyX_2CxVM`cO%fZw= zmhW3`cm+d8O~cl~#;;Ig{rUFJ_R+slweVv5Xm{)IP`ua!K}hVc9~^COyxsw+X#e%W z{@&ph#@w=PwX*sgq}H}ay8{c@1sT!l2R!G0!*)tV02vMWcE<+#3TFrdTLpmTThm;W|%hJwQ`DppFjOTwHc++IKa8{JGR{!~iL!S!3^w zlW#?bE^?b7Xpr(Z^jn%0${vkHUzT;X;sW7XtOJ6=QZ+hGD8MVDGj(hv=+i}?sdkY^ zi8{r)Be}Ee>llQ*VOFSy*FeO(PG~kZU~SkHg3QrDg$ipn8zqpW>53aZvF;(JmBJe5 zc7KRBkjfRa(*Z2)hJ)ZLinjU=kef1a+={?RJJQX!;}hR<=|d!!BJ1?GVQIv_gDTdyeg?^0h1047yN zITzw3zVnv)9rj3z>pjOdm(;?_<~(lFXo?DEH)VB!_3C%%G(>#Dgn_Ed*GkrvY<53z z8d)SvV^hsW}y- z6O08EU$jx8D`<+j*sMg~=`lYb)FSnE*~o=_xraWSTI6(tz6Br$d%&KK5%a%>&&hb8R!9YMa5-d^#Chu2g)Fp zwNZ*rM7{h{qWw7Q0I=Wq zMnBXU;7%h0MlE55-4?G1e&OjpKisV2NMXZaZ-qOE@c-^BD!cniQUa2Tjm)RAV2RRY zHaTl17JV(pi?M9cG&Qn9Az)AFK-=~ilD{&u{jb(vZf~?UUct=tSKTJyGR}&)DmHg^ zq+kIL^@!mqVnrYp@>@BpE-SJ`cQhE{;_p5G-_6&r_MwvemRSiS!VcO51?y<2wtiSP zvAja^291eP_gF4v!qYfk*b=@EY*zRaoBWkie$(u1sbRo#r^YQS8j4`rCgXR>P)nHa z@VC*!5atBzh=elIb;)ar7)Uot7kz3aL!nBBNYSu_Og2BqAy|RFm%Z{lP13#$Ii3K2 zr^VX?aF&NRqo##5VYRp>e5j{>@u(} zoxx}z`nG!p%q(${@@naq61>EnZNW=rVTf8E<1se3iI`OnJb>oaSvP3SV^`c-^oVgFB7pU9~^^cYm}6wCO>J$ zv*TvehOLv>D#&SxELPKYpxJHZdJTvC=sC{_13S)nH@;uKSgPa2QiOjpZ=0x(%r{b$ARHzS0bS=` z4edrrK4{^uX2twfB6%EeD9Mou2@+-Gvq-31-<RtAnBm7q$x2j$^4dZ`6Fmnn=Scxk@9(a^+M;15u6)&C6OR@7$BUV6 zj0uosNh#2EdOh36gG0NoM~~%!M0xQgF@DRfX7hnK3y3&c^4}QP2!x$_5MK2)C)_CU zMK?9cUrWgg8hV#}SjxJ8&?S>EO4-*EvGVa(G$-b3vc@eBh&n%dHo135sY%4%n!One zSh`!4{2GS}CxYqg#6g%>LD>T_OBCJCRKKZBi)~nz*`Zm;cwWlf*wm)xY-rAA=FCWF zrj?1cm;+vOG{74rJSP_Loo(+uS=Ye6gje$=(+U*(Gk%vcOaqM~<`m5#k&?$pi=s$k zGOaT7o~Z|=*c<&6nFt$bMb~ya4%-q9`)L2$wtJ`*CEOxWJsHd>QXDbysN0Jv6s~|T zjNP^K8pj^xcWm`SDQVuM-}rUD-rPbx-^G;8x!&_6W3vk)v04fabR#OrFoED#1(4$l zkeFCce5_=7P;s5=G0)^7rZ7mpB&M0|dT>5y=c6qRyK+@R)3w7-G8e$vWmpNZTXei?c^ol$5(ULkogk0nu07Myz*uI>h3n%&@Uf_k*XqoYKsdL(e}fane| z(%liBHi1^}WZu{lzICDZ1q*FRR;-k^Br`<9Y*RDp-nZNU-M-Ufp!I@53<2UdWPT%B z$x^mq+SvY7p(1_qoP@Gp8(NN^(PhlYZDQZC(j|2-DA~_A!q6&T!amB%p;3az+Gx9C z{Fu;MqLsMucO~{yDlPRhi3Sm-BIJ(B!#Xpz8QAg{qXSPy;S5@Gv}SjymxlI9*)*ka zDNhD)F{RV8wZf)Rip-!$JZx4H4-#rneLE>TGTRTh1A{ftZQ%=fd60e&a7S^}FL|0R^)3+8RIB$rFVqLqrAMu-zQ7&m537JpgT6 zm)X01%Qu*Wb78d@RCiY>ZHP zc~lY)@`i#3wZ4PR(;D2t00xdb3R*kH2;`HzAsqe+vL)VnwtibbXktebMd9UhRT!ZkNFK^!XbfimIZCi#Zr8v`fnrCkGgR}VafgYfw0lk^ z{R}7Yn>K~NILGJ^Y(1|KSKFpIkYqxln2rnduRsMZ-@QuzUDSYhBsHQ}0m-sRTpA^9 zYfoWIfxGei78huiEBPaLPR2S(za}C<{)V=^DpyMlm@@D?bn~EWFQRLf zo^#ofZ&`FGSCWs)X|PxBixJ0$zA6B>fIGU#N@KpgR@}C=S;>4HX|y5{nw%k%eQ2$z zX)9|gOwH$6tx9uRT7X33++&U=D9a32_M3h|Yo){slnvy$Lh6K8c+gK|pEcw=viKZh z*3Yt^*t1j@bVy{5!*(>cMk!%RO^qd z35!a+!$RX2OrS`v0_PT4Tme`P0%e3{QzZ3{*Y5-2S@6`s!5Ccx87U!I z=O#|sgsLH<4b|(wh@ozziUoZemk+wYpc;0-WLT-Al$%@JV~yYx&FGcCp&k^>k4B+a zn*+OW;JRi9zjTH}^o$3v)4`~#^qfhD^xyBmTN&X{hpf&Dvrbis1>kyKRwVRvQ#yWP zs!fVMty|W*t}}PklySD>PfKV=Lt(5rM$kr?0@-ZD)L->FVx&5nzL81W8Q_1nVa7Qm zs~UWt8Q2itk~TyaTSE&xQe;5q^0i#-EI-gFycN1(s;ZHDsH*cF*OHd@Wx1cAZHDZ_C!Ap~Yw)L**+48o>@G#ODj$`v$wGKb6#6sK%?FVv)9Gx#`& zkDNfE`Ue?KRZrPPVr-MQUk5UjCu>kEajI^!IOAL86*HXM3rvGWqLWiLD#O3kn&NZ- zrxHt}2Qqf(*KSD-mqLQ@KBKJ*Gg*Cguc{16b4*cz4s(+Y={p?i3sX#^Ocyw;eFCcP z_{>2ejzvO3c3v)3O&G4863CSQNIWhZhXy@hqOSWFZ=nQJUmPUaU+mKUqaMW(#C zcvd~dX(}w@^zc}3zc>WggTLte0w13$B%B^@?XMrKAMG8~%F=UKo@bh~I@{#lhO5Z+ zjg}eAlPF5Hp^dzV#={A6x*~F=j{M~!&mUPc;rX-rrruhAzOlLW;^nW~|NF0EAOHLRtahhs_s-6p|GeuDTyOZNAB3a#7nfImEw4O&^7PsFKm52HUoa*p;kB_Fm3S*E`Mjy*PPV09QFsPKX; zc|>PNKHfM!o-fVBdWT051qFzw-@vq&k6lj&V|yYgO5m<;d$5?A-~Az!Y?O2}V%SJC_y)fwK%??~%d4EyV9 zi^+{gkN7+XR0NQYI=-Ex9dNv&?6aHEg0u|w_f@Ea-^&Y(Em-V%~<{_ zA+4t8>eO*&D+H=$nW6@J16w;2gQ&2ycH)-D_rPk@MDqk^QQK7&+8ARY*Ep%%0!BaP zJZy7I7%2C|CDUV;E0{@ut^$G5m*hpV9D_WT3n_XK7FF&^e7OU1?S^5V01}e)S3pT0 z^%WZ%%Dv$Oe$)XcZw1qgVhCj=TM^UqQ|h>l^j%+&!wv)GtOm}L~v zEyijoEyKt~#aF5X%9EL0^RNKCv%Afl1eDI~PEHZJio~uDM&qbv;RVJP2n66uz1(^9 z2p}M~p&A{~!NUigRvV~1?xk{7KQ8M)X92Qi=wpa)guqe3)>Ys zTL9sK4k@_+%B2F4t_|bSRMd4||H_d2Um_=w%5^r@Aebgsk z%8!N^j@=sdL-qlpX&R>*`KUZi2f$Cg-yNsxUJe5(PyCII ziTPFI#j`@Pnc8z1w4uIG2Y%%2Lh8?FX$F1U;^Be_%`n@se4rj@Ix#4R`Wg)b)C5xl z9JoZT*y$W8*U}5Y0omakg|PKqQ9W5&ehLzsi~xO|HckyCwwjl$s(5q2)*U>8!fFRz zAAOR^_<_ZRHzy~HZ!s+FFRT1jh0*YtG3f)O}7T@Ck3yUX>lg6TouL>J(xt@zx zs^~sQihXEVSwZ)^vYeg@@0$E6#eF~^80q34i~l&2K`ev}JQgdhv`*!U9#~Aq!^K!8 z;eBRocje$8Q47#%S@lUFJ@~7k$J!(T2JmQEwG#^nQZ6fa0cs4A8%A&sYU~<}j*FPK zmLta@PGpVFOC-wXvdDEZH(#|!DtxpmdvD8Db{G}S>eQgoNdkS_BspdE z3M#3d0{CEa98qDP^6{FfSk73eNRZ24n+erGPZwI$V2v~(_iZF4$5jb&#wFcogeZtI zpfxs!Qy7pTF3wV*KZu6_aqzL{XyJ@#Tqgz~(8K7^W15krkVipBF(HswoVepV1OO zR%jrF?kDO8VY?W}NRR}$>0uNSJgFyiRLAHBi&UMY7c7#y!SHXIgL%zIr)*NvhWwg^ za*i2t&~5SPY%V$wc(Yr(9xjmT_npnWgPVP1vxGv9c?_p6=RJi!R!Pl^XJav%7?*}6 zQH-`BCLyN<(o!kTpDV$HR1gyPNsLJGWBONG<>c4U*0K}bX|obcI`gtIPuoUq0ACI< z4wY>>%3%XJax<*$Sgs?H;(!Dxx8eouq_?OJ=qAcKQ2gfp>t-*kYfPfVTb{aosdFXHN@PjSImD? zKXO)j78dGkT@Bk^r;ALzcAKx0j<~M;3GJ{UtiEQv)TMg1EO!dkF+vjIC5la0n&C@! z*NeAXHHDrSFE&m^4aW^hF=j=+QV?2 zfg{b=SO*(&fFOie*@R@3x;DoOL%prleQ&uTDh#AoF!!lFk6{WUAEQI5X%Js5^CL-j%Ej7@}kw_*TQPvkk5%A73p!yg1vwTh~RgO$;Yq8iS z1O_~6v}M%}3?;Q$Sw`NtI=OjI%q3EmO~4667khl;z^sANHk{OV%2jPu_L6ULGQe2^ zGe`Z}-#a*ZwY7>9=}TuYo2^P@Fmnng$fn1@s354)J%hFvKrgILemwtlLV|N64@I1L zyIJn8+cccTCF-mY1g*$EjkjN&6)(1raS7o#+J2~=!)T>c#24zHipQIm_=SWbO8Nx5 z37=18+ga(KIQvr!olcamP2It$Dz6y4%=4>OOZ1BLMp*^OFE${dNW;7 z^nDdzP|29t>88|Ni2Nd1SIL5&Go@9UIM-_dW%951wG3KoVCz}&ugxuG5T2d@;5bTB z;jrK*=Q3evD%(hEZ0&JlgV(M{zpDxRhTq9O38VDId@Io8I37v^@d0V)Yh=p|q!<{2 zlCjd-o>@no<hE4^hJ7p zHSQSmMz!0{8TYI5D>h0wlp-^!j6RlGd}90pzq*>82u3%NIAj_3B=|3R{^_J*2Ck3l zOJgC5PW`*h;vC&7@j)Uw>{0$Z@uaar^a6GRX*jJZqOwS7L;?!MX!5;xbPXkq+f`;K za%JO?vrih2AC+cQ33&W24eb%F4DQ9nAA*R?=Od}IohKXWOeMgHu z8HE$ZEHgU&nvs%C+JQ)P$G=kiGy6yKjQ}76`E(*}nwb^9Il;*4uLGI{a#$0;NsY+U z#!~`tJP%KI=HCt2xnmR0dBDKa^Yuq>ZKCe?N5=Ez->G9N|ZK0S-f@R-+~tGE5IKOd>P zftmuw;$YFlB#4eqX0(a zrU=A|9mElVyDYZHytNgw55>Bv!CR}$)0cL}p^%lhng5^G<|326($66flM-@x89bz1JS zOrbhASK(JOE$6~XnbeIZr~GlUFfX_OCkZ%_#Z_Kl^Ii0cuk%Q|Aafj?B;|#QQ8Sez zJQ^lmDC>#Z{&FdmFPx|p$V}Bg#KNPhFbfN_s*h_KUpQ`0?WZayM{+lL$UgwWh+TrA z0pAB!KwVl{2qi$zK^B+Dxx_U$;>j>88nXK4M<(j`2VT}NcC zOA4P|XU)rtqrk^N1grR`yryYjL0xZKHnb`^p4Do+OVwCPhyWC`u~Dv)aww6~QmLsY zW)wZug!QuWA&WY(gJ=0t&0JlEpkg|w!Ww5NT*Z|*71gq+82m#yF`J|=|7)4l370m7 z?$wi|=09WN2J<|HDJU9NGw!}VH&at@Z>^?yKYk&vS#sE(zbos&zUkD+$x-wztkzB{Cnstz3%Vwn_cml97g?j|a1ZF0S$Bx+y$*VU5m`TqPQ^jf~M1w9#lJ7B6LG7D<(-!~`t=DH4bN6a~0T*{KrZI>ThKoE5{l zXcJ-YhMzyj3@>V{QlVf+&ijj6V?*V{lt_ zW}@H{AOTbBV!82H*)+x6Au1nUt#9ld9=A5P_ILLF{c3CX2oUhW%dMkNLP70>vB1xe z6EF)J`na-E^f$d%$Q7K(KcZ%mn9V$hn=&}h=Q zd(^jLNt#HJ=E9aWB>!j-0*QcO_F7?=OK`_nA2QSUv3b12!l@@_f2$|7F7zORt zNlHs0ikyM^ij4!|vISs25ifo7aB-SI=Lw?}lXJ8^5Y0q>^A;`${UkF>80(X5Z&%u))` zj1)(qgjOjKpE4Dp04}Ju^ZIBm!U&ao4(omCc6u^9$^YXVlutE4jy;9MUOW@5tX%A<0zp+Dp z+r5gThX=Dw*^796JapUT$qCpKdle6!ld|ZGMbAzdcwy18dXzfC0HbEZabSWypm7E> znBqudfK2h(=yI~c!0tSHbXPh9A%W-mD3ZRoQ2X!WB zG|;geJpDW$jxK+c4~i&+AGI?arN)~KuJR5RaHiV2hNW)8%#i~(D!WRlj6(0yT4@IU zNhj*Syrq;c`d-IUUJ6D)d}&Rbdnh+HB3s>SS?=dRn3i9xsO1bs*&pPH@JtBh?&w`o zRE#&~I?C5;YZv||7BHvzCKHa2A2CRB-VkC+soS~Sa2vOEyWv*Gx!zC-UGj+Zp^9n7 zc!R7}r*Kgh)|Hu0l=$%|qpt4_bTe>N`cB6QWp-0?o#3GTv2h1Rwpf+(4FEW5N8i57 z6$(5R*VMj}F^kS@JTnxI-84$pP660V*9hOH=A0`zW4=M$1Qo=kJ<;)K9`K?axgMRa z(Iz&_cunQ`;xCR>Dx1ZK5b{jYi)4%QvT}vwn95(}wKcJzU*eC95=dOuD0IM@^wq|9 zDP2!Ox07qJzeJ&>)p-fk73J;Zb z)G!T&G#_?899j#{o*-LuBVswGmW(A?#X7mgvk0rP0)h;h3XCps=Mrn;?k1NU?aVcJ zfY^}YF+TD)DB2#mUHRg}SP3CXlI5!2QKL6xVP@3%$>C)5`&@=58=sBiwjRo0qbSK^ zge2sf?n-bWCTu1P&Sn&leN<;H6W`;FVp}{q7m45sqQY*K`I@^K)^O*xY_fSOYJqu+ zGmc!`%{`e?MU2yl}_ zGnO-fq#HWa48PJaLgUP?5{Pc*vSj#s%NbYM66F%!B{us`gWOsQ{rs zUcZnPZC-?_BJv$|2;(VoPw+2^@cuRGyd#EbJqWxG9y#Eqw%txc%>8S9dp@r0rwXud zWP(dE2ULdnWB?)=D$mF;M7$Alex#W$Hv+FL=742@Z~Zbc55Ml$Umwp?kPx3oo8W2y zNni?1Nh7Gl9JMAlY+j}Z(D{TjusEU-GP$ z>VJLs^cGX>;J@X?Gc0nt#>mNOtJX-@p_?f~8x;eW8qLHK; z0H7z5{c5kF&PD%HfSY^I``@!L`C;N}iObOJC7enz4_1mH@EIe))G494cA7ANJQmmr z=sCb5dun8te>ieaLGKJEEVW1lce9X%cf&0{XEWy*IsrI#l zPcn^;8ey8KehZz^0@&3*8Vmg{+Pt023H&N_y3B{Dz>Mp$`d99y7u z1B`4clGS~vjJL`^CSlTp#Qko;OTOG&OL_4+D}ML~MAo9_j^$5ZXeRC|&s`rnY5EyA39JyMl{ zfDhy`II!3OoVr+PJZUW78IEUyG0`0#I3Gk-BUgqA?eg=Jg`{(Pk}b{)d~@gA@=bNn zx4YcAvCetQQU5n`)apBwg`cZ8=CB_$gPniL7vSFBvxCPAlx7Mo2cz&;5&9+$`92ou@9Q$d2N`^D=DqAp zDxu_z2FjJjQvE5csrj=33=4bhD90n>Qe)CF-YgNBumY9;k@-uKu`w!1<)W`DlNf_+ ztQ7<*{gkF^iNxB>xvHAnbVL0-)S1mV@Ae^&8bs@7Vs2nv0nfbBc-mP0MUK0GMc7}w zwU~wNGQLS9~nLwU1v@b)2z40m*Ye3|3KrKr)D z_Tjp;{7GuJvx(uVK9jZPd8VPJJZEt{sy2mAE3Bc^X%}6Vip*&$baM3q9&WQbWRxBT zX|feMWvqJ}@pF8n{Rp43o2ZJNT32$~MIVp+sGRJ8-I#fU6G+* z($D^$+l*$Uk!&t$(=Pe#7E7A@oH@5Sm;EF7A$d|UDJjxkT^W%o(4Kz1@GLyPKL)8| z@cjM++`$Q$ooBLvpAyQ&yTU?Ft}X}I%(tKK1LOB7aEf7nx){GFa{OL2I2=dA+N;<2Nl#w zZ}y#Q#_qN~8uGiG9ABJ}ejQGoU7OQ1>5PKgo8Rs?k3M9Je1R#Tgu6+7ME(YOpLQ^4 zQkok{9D?I2J>T4G_@9DPaUnY(>HIAhg6uU-PB4&5}`f~OJRih6*)8|jGZ2~k+KBF|DFR{?!O z)D%s0UL9hP)h^1n}=)XM^Obz!K-6Avu#mLP8;pcQ2t#EvSB5b+#Zg=_MLz&vP{bvup95PqQsp*xtEK#an!QUU!gNv3PXL&=4! zlyGRR&|I=Stg&Mk-4UA1n6stN2hJVSibazirr(6cV}mOI4`Hb1k)piqqH2h=im_-b zVBMH6i%p&)r@pR@6^H`$y37p4tb$5VwbolfKX|eUwKBKlq}el!Bec=vn0HOm$|5PT z{_Vq%l3 zj*&|%BwdnL*>=c~j#YLoPVEOI3pj2%;;25v%xO^G%Fm)F=d7gOxb(`|?=$OURw+}; zdd{qY2@`7l;@ImdQO>=GU$CI4rb~_?>BE2!PWl=h;>x6PFWW2v{9eRrGE8bmsA$%x z)+H#J^9&1ur>UIgx1EEWgWbu?J#)Nob(Gz$a-^fohGo7sa5Bzrd5dITDz27nQUToL zjwbs#I~;$R?Ay$MJn(}zDu~_A2KwNPaQjL&4~`4W1bDL-0;QY`asN3EMNmf?7=RoZ zy17XK7}1xm-haH#nK0K8IkkGg@-Z-xDi{VyYa^*k%an_>l4R7iK&d3jg_U#m6a~Or zDwE?}8FL5cOH77GFZISv?6GNZ(M6BSWIqfgEkpK;%P&gJbqZ!E0_!MRq0RF03!hJG8jKvQ?)*)uf%s_z!X?!`9lp!JV$Y* z8{7AI@Ov_Xb3_D@#DNf?PRlbObz$-;;w5xTxZpe%x;Y|Y0rSGE4pdw~##mUwRNh^z z0n%-M2vXq;o3ORDyW8Zfj;WQ-Nk^EwY@($#>RD43)qe0%4-h3cvOVCN%opD_xBj!c z^ORM0(+7Myh-z(WF&%)u^YhtoXpM2}|DL~mndB#y)0s_!63}?2_3U%4T7b@H#w&t!?RBZS3)@C%0VKNWG1H3iAYSx z^3&*&!Slwb6$c%Bwu*RnN|~FWcu|e7VRo$-gDe zra;aaASXa>lrd}&<(FzE7vG4dY7^CL_Jgkc0wQ7_f)<`ZOmnumzrWku+Bu-v!Tv26OyCJvD%1HXCoOLmYqox4izZsMT2IowM zC_Ym~3tHIhkbog+Rhu1o=8>NxX)Z~SG(pZwuDGqboWcldO3DZQYqe-$NSE&&zsrvK z%UEy>;wS1U-%5#g6R$V|<#{Wtby?y~dyeJb(&w^xfgk)=#wS9)EOYRO&n-8|wkLKz z!`OrWx+ww-LQDn9o?$Vvp{Zwpzal2<_kf}*V48tkJygwo;wH)%%&*cJO_9d>jFZ#B zV{@nRZ!?d1<1aVml$-h0TEGp41J2i*H`5H&OvWui{J3)~kl&40)r;0?h(FeXvBAGkHNORzs-e>lFXE44FDZvW4j1p@*-JP&jeySOWC1I*1IjV3^F z@p@BVDUkY~sd(X3ZvJExlwcrXyR6?`aDLZWO6_%Wy_LMY#tFO5g7J9S4@C|G z`=VU)JQvK^*qh|ec+Z-$*V<%uV3|4^Z8GB=r^H@lia4A$o5(RkLACUB%Z{80*kwM;hD^o>m;z1maKcLzG{+g+~qg!YPFu=~D(}}**C~lo?fIy~*CS%l+ zH5{uHxxPTGFaG*C)41EG4D;L|-)f=WqwFziDe-A>%>Ekro2zPDc%4vE%#o5w6J3ci z!VJ5l(_C0xOfH&L5B1YaY&Z87NCSp|TvpMD8(COe)OV`^?ncM9=T9#E%2-1!JX%zu zR0YPPUJ@)o#^b@*wu-^PC1LM0Q2|P;3YnG|hIB5bD6Q~JA~MdiMR)*pdO*Td+&vqp z1yWh6^Q$3jEXPWr-f@3L35$CL&5tm6WbaA_b(Abh7qcy&h9mT@>8Q8e0NT^*fX6RD zvmx3T@=gFa;+ZAeB0k=>MNnB=h#q56jG+>**LjgYe52MstE4wotpjjY?c(Z(pVW^_ zdWDbcjAoolpJgglJf+sFCs@F?W;!k(%b{;JBP8U_rc?2_Os9A;saLkXmetzVX6M7v zh>E4mn-m&p*@eWA$wfI0Tl-=a7rRw34`tN2p8} zyPA%p3sN5EP%a|Ex&b2TNq+m{`-GVp2ILUn|F-5Rip$#Q>=|CS%DqdhF3!8{b8R!J zuRQ=|FEi#wWYiA>gef$NM8ibq?xc9gwqa}jLd`-vlKb-O@d!o%U!z!^WZ#z%!r3{4 z;&!I<14hGV_O2P-5i^k2v{(a^1;Z$@bX-fKFyrU`8_a2^zY?D8IFDQ)n%s_SU?R8C z2C~Pu$dNjV`XCEO{qSm8?Eos=4baHvD7fkYfQ~|OVogxnW?~4)tq}>QNN3t1421HC z?L^76UmFZffYc7gio-QW@Oc!T1)~mG`9`O@G2=;K%8_B*Bwj{_mrO*y-%@BAS7WSA zJqHuAb46vMEEt7BI}N&M#4rGwjWv4_!xS2Z>Kk}L)y52uPT)AAU`oLVoo##E9364K zTW+8CqmHUwD7K2pGGYLmFpCwv{%ba{-!oywOxXW6|73$rArF-<_|f>NJV3^}p9)iz zUW^Q5m5ZIdTos@1$pbv#X(o&MTEf?(zJ-zjUDxZ$TN`!Xj7Q5GaV~>aRDrp(68bWc zA$Z&ZWkkm}9 zpj%f4149e5a2FSBm4odt^1<1WP484yLqS!q$(*tljseEqQvfl`b3RCZwro0&YiBh? ze8D)H0N10VTaf4_0Cx3l*guoXr- zsAesJj!%g5s}eCeJ|PuY?dK}623O>oK8S1cFaEC3gJ^4U$NT9fZn2A+_!Vg;C zL=cz?(b}*KPeH=)O2CqZ%I?-;!u_W0p$g&sHVyku19HZW)2r<-yZ6HKHMPT&0NG|A zTB!xX#W2*woCC?$m(&I>4Z#P3!;?u5Yv(!JndC-DaFM=Q;R`= znII9-0Nedv1OsM_$~BlLlc%~gP}?NQD^{JbAE5Y!%psZ-#PB4RVd*L7{Fw!aFuIMhiAD<9bCMjHGN0KePQ9avZfjhRX!>&A_6hbTdC)# z3*=Zdg7=S>SC@ey1^iyFya^(0?eu!|0!09-msrHIjcRcdH$7bvsd?q6AD(V*JwNA*M5E>?MC9BkV}d!1 zylutF0=^?jL}xQ@&oK;+YnETsbS3{I+K@N5UvFs80FJA8KZXZy>JGHy> z^kC!QKlH%98F(kP<%CK~#aE)tq~Aa})`VSF@*FZqH+K0R^@5AUMsAR!5;<~+yof=b zIvo-fa@{&8kd@7dko+IYvS)+Cc-BtSmvo>Ct%Y2w{#Nx`_anD(9=s(Y(Fw&TRP_O{ zx?}=PM&RKu69n?KojL`N``j49Agqa>%4pQ`Xw!N+Qe5tI~)&qtWBgfga-&>@r@ z9E9a=&>P?nop-Rs-T2&nz_WslSzMR>h$^j7w*x~HPOLE*V0e;2Ng~2E$5%s)PcaBf zIw>?yzG3bFfrQc^fhv>Bd#7hRz0+*U=qJH$N$?{nI;Eiez_?Oek0Amo4o3jcmu9dg zsu57Rs7Xi}+0l6lx;&9Ar3?1oij5@t#J96UKx*?zo7(0S_X3{WCUJP$^$ah$~ys?50!Vo*oM#|{7TZ;aBTI- zDJ%+!AXu~>ps3((J@C7f=((gliXIX71T4J_g-kzKf3hqgL(viy_`Cqt>gQ;rtOcY< zE7(&>Q`eb?OKpiLQ_841yz7$Qd_thkiqjhpEHL_<>Sl!~Mf+JfK2{~6tvA>fUbCBQ zpYxrC^weH%HEr>wWTEtV^*w29fCHZlai`Ym|NOjuxeVyL*9+U@HHj>t^EeHV1xKNi zQZ{i5=%i<&x`vh#jRSjF6{ImhMI$~G(gKHw9fay+{%@*Y)$vQEYq{eL)mbt9!4SCWF<#J$ zb8$DKXuFT<59^koGbG#DFXmxAx~ElScHaY7ZEk*Wk|JYqPsGl3o955? zME4Y_Psb?ZW3d1m@iMvyM@x%S(1zTOdOk$qKsuVEEHB)+Qjw4g~A1UTwlYxYK*}*$^L|D~Cmc1HwflyMv8O67hx;1H;72oCKFpKR3EES@E ze;kh9h6*MOAO!_Oj!T93C*vtSJ|9JsvvZsztgUH>qIuyWGr_+wtHa^cG8=T=^+5Me zhpG}bz9Gdk$IMTf6MnX22VU?FRgbBAsZpmp%z3rR7(N+Z)0Blt!4aiph2wzky~tz{ ztk}#W<>^9Z3}bQiVx0tPWy$K*x|-v}U0M*8Xkg{nSj&m~MOx3l|5RV1jC(7nxjjx= zto;3W_3tLz9tO?=*~1KR#Xp@Vs9uCaQeJ3xlER2*E4zEmLy0Zwt-4r#qHa(Nu{sHX zs~jI(Gc*(KW;P~t!<6#57Y zBTcVyz!#!QM8zf8Q7j;tz8A8CmN-BPr8?0?Oxq;VZ>QHQd%@Nt4U{zd2CUt(%fkWj zUQULAPi83iVBL5X;#nAt#{ctbYj+nHPGoStE2u0ms4cG4>nkm^F}qS};hm~yB>F0P z7&Xbc;>0)`9arArn-3?y3C-#BNJu}a9DchE-P7%Btxd?Zt}2L@@h4O>tJOIN(Znk)<1#&NZ;IP@tFrnKxqiu!3nm0DwcnV6#1D$u)Q>p29E(Z;2>ygak$vuitU$M%G%K=7 zv#QfJ;RP8ZdEuE&NaKNka$P-dx4DIw@-Xwjt%fMe9^KeIQ6`sOyi80vz3z-KJw}hB zb;WgL`cW98u#`kLthSt@z>)E3!qYw(cY*n&d_@@OrNbdW*$fvzLZU4%TWy6D5srKZ zL9oEv%~ByGxVbT?ugQQ|DCyOq1queI!`fstloiu~BSTckesftz`ohD?je(G$75S@_17eD{tvF=MfrooOKF z5xiwKn*W?me5FUJ_o)7G6&V|Ogw3Tlvp1FtfnlJXZwvnBF{b&G!;PoTScGn5j=bwL0SRwKSG?mreNaPEVIAvw$gNPU=2Qi z^wZ{?={L8xyM;z4=DxY!f6Vbw&=M>fkn=s?I>#4XPLc;_ba#vQzxHVD{ZbkJtIF?} zYJFt#*IIGEJH)rvqbge>QF>tbt{^J5fBGWgA8s8~8`uUy7D_VY;}V@n zfQz?y_{)^lIOUW~0-zyL#0ymG)y_@F4kvVU9C+!B+3s11XIeChblZHACfY=D5u`Cy~UA!R<+U;=2HpC^f zHKUMXGZFb{v2QQ4bY#^;N7ZhSDw<@AU1L7X3?MQ1IVhndcC9*pEbS^b&sj#uW^0wM z=Q`b(xXBDh6>-#=AzE4w@p?XFWBC_v1e;JgLq;-THo+EOy7RsIJVkAA-InS~9gm<9xylz53P!&LAw&MBCFQd}HtP}WAhUJLFtM0w%I zcVtq2EorQ~f4E|sN98%z@UU~TaXRM!-u{L3Iyc72#p1Z-uOPZ#!_}{}fl(jD@IKG} zMXf-e+{82qJ>Ps$_B3uskLqi0bNBHtyFoO0lj-K3B;GY=H4jLoL&8vxJZnS;-gA`S ziBV-KU;F*w(oue!oH{x5_m3v5cvQo2`-VPLQx`l@%%jZdRmqdK-v_xwfIMa;w5*sE z7i|IYZ+&fYK^c5=|f5Mtmjdj>4N<83(TP)=ti_=B!iAJ1T)QebB!LFzPRrcg9` z8km&wDPXCy5I)COeQg|MMSsIFAH3SL?qE%#<8Igw2l3*x0ch`&XdI0IB~C5xx1*YA z5w2zNDWuUcI=Ae2oIK8+9M0;AISyWsy#^CipJu*QzwSk2K_jz8tT5clw3n)`^Y;cc3ngZ!!2E-9bfDv zL)L>f`kQgUGADbODZ#`o!CD-13S>PBnx9m#FqX;|DZfry#H7@Hoy4x(D8IhKz{Wz{ zN}?oYKPZ{qAR5%d%Pys{Hhvotyul4aO&xFv9_Zg>zZl0*WD1H*kBZ_xEN%dVzMo`y zk~S!OcbHFG+gw`hZyC=B~AR&TY=F3{Mo*x>_s> zYMl^7!()=$gX;U>j@Pi{#^{l_?RpI{mQ=DeTJN0!5`qzmM%Eq0`8{^~{jk#w#$m}0 z<*j>l;;{sStMNH?2{;f7>TU^uOflUtHIo8R-v}lHb4f8%ngCB5`H|W^1>K}gWq+}T zfU_0e{~2Z_5x@&{vNS80I>l#|sH^rR5h6oq%k)>kJLoX2@83J{mx+VM5rXS}FIU zpwkRGon|yBXFf}lnb$M{%ax&|Jh4F1J?%nIyG&w>dgA7sNDOW}vi4J(u#Ukzo&jVE zdv1siD=fHU)8FMdTvKr>1=XX@@s7II>+}lIXSVp1q;MEz`K>5YWtO*128T`Jcv#}a zpt2yt95yQW-xB>Sx6b`_D=%OB6%46Q0KP^E#Zum6CkX zF=+Xd`a07HH(lH|h6_x$kMH+|A|tOuq5m)1agE)hjp} z80giQVPI|r=6=aIj(EaRIG&6KikgW|fun^kurkU{z%prf>;Xkk(D6d8u5|=OvThs> zdsjU2`7TaGHJj~WZxZAGOBf&xdMa<0OB@TZM1vD3Sy+5hg7KC5nBQz+vGlGaBeT8( zxWoVD{lh1v4|)SIr{AgaM7%cdc*R593l8`U&*RZmgF=7ffhbE<{Dp-Ie-eL`rQ9l_`N_;lt5`KNF{6`VF1n$@S4){t z(8N~M-m2$@W{g62`HSGX*&PO7Hcg2rVxe9s-?C)T65~TZo}5YW z@ysSCJhs1}Lj`<=Qkr!ydGwG*LhNO|e?H18F&}Qg1khd?UQCsY>Gw=D6hy5iG9pu{ zr!F`X-8`KP+D%>KwsiB;ql55zi{ikWRUwjxyu~1DPohc8Syl$)Wn?!9lYiCg_JL;A z&%aiku-yYWHBQzP_X`vMhL-`Rlvoz`k=50%x87Me#vq*0X(!P1t&G7_rS1hhD50UbuGMIy520BNTa6njp?i-f?&9L$HUL{YPWYt!qt$71w| zB-9K7h$ImEUUb3Am6wz^-JTH);44ffG8*F(MfyEF+QPuT-B^a!S?1g&)Phx&bSSY3 z--f7NArEAVBZTm3j4p+3G1Q+MFJYkAc5l+LcLkUL77fiOGce5`l;$b^zj9Xeug(wI zn~C#1VvA9=nJDdOpJKLxCHr4E{itQp>8pY8Ql=CR?M_;oNNWUQgg0Mu529gsLAJsPM9h&a&Mziua7-M`RQoYWr~+MYpRzj8UAO7jy<(#0zE$ z`glR7P$4g9S}ILZyLp)`t)!TpEi*N)q1Wi#8H+ZfYNK7`90aXCtII@exvg{ zQLapHe+?~1XC~t2E1R$D=vP8v} zSz?JWt#y!z`g9Jm-Lq*N?k}e98Moh2 z-|%}}OW7U$S#%B4Z=F)ba`g(r@tI=y0@D6i&{-wo4Cbq zXV9OgE6hybu<-9m;;_GaB6m;Z?upzzkxL_>k5A_8&i)F7&YI6OQkN>4N9?R(Hz#*Q zvaU(+I&|7*zcJ3#xYmuau6=)F{69kS1Xv1)o>k(W?A?>S-{Hns!`$z4V{Cf+D-b?= zLbKc$+hvPxj13wnrhU4x+#6$D;5lBIaNou zThtrBa`&SSnN!kEes41tcqkeHPFiXhp!zBZpQH+qDhG!t@gw7b=O zzPtZ)W4AP~v`xV75j4wh=jNOua#yan_SUXd*I(NyqHFt$KBOWvWIb}=@xI3tRaYj6 zhh1@ZcPLhe!n&6l0Y^?IKcDh_Ld$W2;69tVp<&s96vB>C(TS}L-+p-4bw3Xjl zx}@7$e!YiQ72fR3gZb$~Lm}g=h{-3eY5`bfV25=z`fxgkMxBL4z>LW0cN>q_o_r_~ z({EU6#Z4?BHUNB~^+^wxZ7_YGo)7We*bpClWcKW%|3paQ0=6oiVI{rbYN6AMuloFP zxlCg$FD}aJq#88X#{@ma2q&hI1;vdtO)Kg839iyD!13zz+Pw(c;qg5|@W(G7n2zvr zY7P|y3dB}4@^`{{=WxA-Ap2fOhu+3o+-_m zVT8278;Lf-a+MUl2Is`J$wZ0bjdgC#OI@SI>vC5z*FTua((yg+d98b1>z>!T=e6#6 zt$SYUcjC1)>A613m0z=v^U~Gsh5<`jo5F|PloOK3dPv_qs` zMH9TYJOd&=#_WLIA;2c$@p^m?)ye!G%8b-7Xuk>0LJs$dwJ1l~SvXcY?)*6B+~Slu z4o&=_J{*qGq{kUA&%!}C3dUj5K|P6{cuLt%@qLnqWL_PH!g-L#z-TfU;LPAC{TiS1 zNPy4f7_vj#JAt#M;jo2?!J&;LwBWpnVoIsI0FOqe>KN9$9Sq$twiHEH!)t@iebHESNedU|+7CzxWzV9Lb{^~)rJS;Lq(E-N}X$WkFU2IqT> zbh96h1H2Us+CYYBBE3+xLLJDo9bmHd99Z~+r>6FHo0ezC}2L55d9&5*&7FM zkc}HswzgA~YmI!DTDU8?f=Me<60fmkuMlf-MFU82d(<6{ah0$frIa2pGQtp*o16TH zrLc_y_+OKMZ$CfSeyI*N_Tb>F-M!`^Z~{kx40At@qh=dD!KSo<#b`}1#Nh~& zJ#hKFknaVFORVKeXN52?Cj;j-*U;Wr7_e4eZEji*z#u0NFcC^?Y${#!ioOmxAa&kn z5$p>}0IML^_(6!n{f@FHDi2wj9jx)W`Woe!{cIbW!Xr>yveYLR){54`KJ<3)i2R%6(uWRT>HSA0GVhzf1|PCa!-ZkkrhXws#ZIN9clq{UBgf1s)-CtCR8Upp7Lv5 z7sq3UQ;k=S`Jbny%8KXZO7$cybG1*;kSPMWEW*F#l4w}J`l{L7-lrt6U!yXZiO95bfiepUGN^++9_5_szGWvy_0q-xecU)GX_-i#`GLAsn}+MEmry>UBKU(p z_kzLM1f=j9;^girKv_~;3fo*cR@#ZRGM`@SoYYoN-;_AJSsMW7Idkx`2HOYQY%YuK zlK@9u&@Vkf$!4wdi1QJ!Aar+&=dhLDXdR;**&N*UI6CD-Em#TUL#_rtcZ5)>MRuO&`ao*&DVb~TWMC@jbA>57gg)M=> zK%GW~|6-Hha@r%BT`0^AWr~+^OGQgwrfssGOBP3Df5T_1hat>K1sc*w@D^>31KRb{ zMUPs^ku|Z!{bXoLl5Q<w@t>zya8iP*2F`v{DXSk=ybXWalqi1gOBSLyYxhlN(97u zX($4*e;Gw6r&7R9hmDH<#pfE}sLR-@uCG{fJRG>4>Q7Z;R zNjo|(V8wp2k*u~Uh?68i^^(>+^P7g7`@>Tkwom6T%V~);@L9dKzpY#=h=SIQc0E^l zj(u&~uuhm`gmHw%I&GcK=Y>brH4pIve4=LZwoZN+(dnsi7%>5E>ZO$a$=|+5N#*T` zxibKdUU-T4hi8v0M_x8dVnYfPUEXetf?oJQK?_1F@Tvi%VvPi$_Z&4CbzYz%EAE?h zZ#C4tC3wlJkfVNbRdphM5Pp+`LAN4T!?0d*vNu-jC#?1i@#`2tRU=5EoP0hB%_mtF zXY6$ZlOSc6@j|52Jv|Lac$f$Z%;+iGdC5*ZNf)@0 zvm%@N7RF^05qAr(j_z9^Al2gWRnKtE^%CC~P?P+#l-4cLH=n|(0C|lT4!!6@;eVs$0D)bq;L23!))}- zz2C*u?K%GrlXYfk`a4QcxnjjGrKV-L)-JU`-dk6$s(|=lVVR(rAk%B!4Uwye@LV4e zLn|4b;C|$J*Bl&D{emXit{K+QS(kvBEnRH z@KGsQV}{s+Ilr+w$mGy%6eZZTv|348WA9`rZ8*j>FiN0$I#YPVmpVA5ViilVqTJ*b z>tNc$4{}+NeU~5|YZk{9zRH$?t5$bFfn+BmO~gp>mR;C5$3t)^x8B1Pug~X>`GNzCe@&Py?0Cq0WC|B}7mhHo+yC!tN>2}SJ(_yaar?~>s30we_jy{mA%jC2;Jd4>0@f$F0Wf!6H2 zA&BOBAf z#-lK{^6VhM4v>vD{%8+}jVi`7Q6{KKmEQ9a!f%^+Z&nc-?IiSxFI*2*C3ML3B40$E zY*WS$H`69XF)=M09l_aP(vWy9?%R^KYhYKC&C>1`?05q@(3S<_W>R`?7sN65oF$G%lSuBnj?6f1CU@)Zj{TV zIoSI-P6?0yp8ew=i={cobpc+LjR#lxH9!BY0Y3+kcC*01KLS6eE}TGV0+eU7fd>`$ z!^gARL&fPo{*i)|-BW{Lfr2FH%u3s~U1{64QEA(@ZQHhO+qP}1ChzU;*}dI8v%Npy zyqt%_h%cZ-!z?2+b&*d6kCsw)S$VTrm$=rA%9A`&M06HD%Nmns<~o`@p?g|{`eQqC zm<7|XS@%i~BdT1BNx3ME-E;PMZ>yerr#G8-MVV63Xxq!bl66 zS4DCk&U-f#fEwv$N0fj~69DfL5kfU(@hcC^_$CDi-v}IvcP3Mv1m@(zG*GNigSiJf z=14#!BbS129 z=fBY%u`mLFMvqE@8JClQv*~h`%0FxWZ_L z146`Til58J8&}J5Dp5QC&1ZGlsXeU?5Zj?Y&XSs&ErcH^IL`nVz~Z5v-^i`s!{3gp zi~IKoHWMLwY3#W|{>K^%xIQ9cuu9S66ik@Kd5)!VF$gi)wRo;S+CSA=PR7~T--#~b zvgjVyCIj7tDTGfhtM_3{%Nsewo^>#&29nogkZ zePzB>@G^Nc6}zZJ)!(Hm)Df2a{Pr>rqgOeYq|)3~&8Fz5qB7W13hn>1tLDqoYh40| zokhhYCGx3J%@tDL`!TU_jXFz_(?`}o&x0iL7fp}x^x&~d6w#Ef9UZT}4?~Bnk0J|` z(p|!9=eZ&tCkJe~Ff$zd+@*0)T-jphCAlK#I#DYUue{kJWjBo&7YKW^XpjUvlq#Q# z0bjtC2zdxEp-%zpY7ba+6Qawx{F{GI*sOIRSmnWft`(gHA36+248VTj1PJY>=f z(HVgZO+@$WS{;69IW*_0)4Q%KyL4`(94$X>2~CGb%VYFmlmx|5(o6%A1Ei)wH3H`g zP4?aA0CAhjCuac8kB~e&@C6_MyQ9lrSeV*e8V8^&mCvWvM_i^o1lRNumRtG}J0rg8 z28)>HOzR{E23NE*G!Sc%B9}erWN3?Wc7CVy7OiTXjOl#~#Of#e&>R1(CvJLw+5g=o z?^@2%CAQ$=fD5);Y@^g>8~nxQg(EnYICSCqS}Gb!$sTW)cH(nq<#53(rZ?v6_8uw= zhQOi77jXvoav+23;?08vTjlqSM|tW<`~-!_4BmW~Y$1nJ;SJv5mlBl#>q`&{iH=I> zWi4gF1fxVXvR(taF-y8ti}|(5ESmsI18rVMG8EOO7$CF5qwRh-FEx3~jnl*sCQ21h zTUDoUy}tAvMF@8Z-90AAcH(MVj0-Pdp9zV|e-|;*gbG04Worj*&7$Jk)~EAyzp90= zrxK7e6EdKC7BM1ugRsyq1~9?%`qT4Kz_wHW)B>iYdoNek!p6EfOD~hL8eVMBU_i*z z%i9I+T2;v~gcGvwY(5ZygP-_25cr_m*_(nqM&hTQ$#hhIw)|7diOJKcJg2Ij#{|%? zY;s<{yLJLW1*o~%=h&^&qI~5Ibh`WeLMjR6Rl!TwsaV*jz zPet4Cjk$vN^$q_%wGAez<(}3anc%930$e)1yQkw%dOyx===|3^=z}*OLTsR}R6VU0 zT-5teY>0!agZK4Ae{vFD?s?uC2o5|a43k~6r34Btt0g`25`BNO{bxh1#yas5#sG)u z&4&+iR3xouB-&Y%u;SA!Ve20PZN3s9W26FW-+tsd3Syq3P-pNN^y)6qvOe^4IWM}P zWa?`0)Ze&WRxDAj_+YcxjdaxDrA}tJUDe{xXL7ERrWfF*!vxlMuM{ zfV>OcF?w*@i-(cy>^WjU%~|H1=vZRKwbZ{kDt)#cFtZalUVzgz!L>yZ6V&m6oehM%v1eACm~}4Y(C6gp z$oO*wv6-kF=;(D=xvWhr42*6Ew#Al>7$IB@hJu)6@4#tqb5A(I)P<%JjzKNjC&J&i zQ5t_M9jxy=yo(R791kQI^_jdo!V}sdb$UVHLYhoTUyp_v*p+^@7cG$0`i-MBhP66gdid zAw;rS-~q(iZ6T_$k>~=;g-wHQ>5xFv2BU-6LRR0N=T*@3-7dpq^y{jSgp?aI)U%s` z7w^SWRRJ5skNvHRe0L7r!7%th{VD9F{}lGd|5?}ztfWj6f+ihJ!dtQEEBdMHRgOzW z1e=_^j(dybX$g5d0cGmSS;XJhcvX+k;@bfHec5cDC;7E2Tvf8J zZWV?JxKwCZjW>dh>prH^fC{HB0EU*5DZnzBbjJMlt6;IbX|5Xzu0Z(H_yjb3BaLE5 zm?d;%iw?j|8fqp~v@scYUj~ffriVWU?kkDTaK!EK*W96V=C6d7C>D6GZu{^>`9)RH zf>JzfnhG2~{|-Po4ku)-CjchVyi^D>F&g@Ag!YMZ9O%PJ7=SU+gEb_D{N#<*@>?ezML!(6pQS4Fn>$S zB!`!MW+-~GuJLiZOf1tAbQCe*l$-(AuVeO0I|s+sH{5cs?HG=7=e%}L{J%X&CCic zVOqk^yDH1eZd3ia7w1EzRC#-2cj22M3FIfUOB=sAe8n~a278Mz7%c7hd;%H5+k{6$ z`~l`Ki|LU;l)F$F$2HhM(OqN#2SFj~VB&LV$e<}IvzFlRKn_fQVe2R~wU*8Bh%#0< zVzFL%P$H9}eDa-mrxev&b5_m3dLFubeGT_*Pj5T)s*oj3O_>Y$F)@023S{aeg^t}p zly#Z&s!~AwTBn7h3r%3u5NGvrp)trO%nU#og`r2P01U!w><$B`>mb0-^bg!i`Z)hb zJ#Qc8%E@M-_J*nV(Gu)KL8jI*j?wXQ7Q;J8%ZaWq6jJrf?+;4z#*F9PdPoW!U8Exe%1&2xMu@i9%@A$*kbzmZchrye0 z`}OQKNWTQ_eerdm=wa!08>$`xw3t}r6}J-x?9bvdLCL9jI>D#GQ>#Xl>ba!35s1%z z6|_EJB>vVHh)_xRhF;RB#<^N4#V|SXJ`_b;6ql+YhDlMRpJXRU}D+GZ|udim5df97ASrT1Yy}mJ&ai+ke^Gb0MNpvxe%6QGLaI} zL2yoTV@Hd6#mowp8xFH98l==P_bRVF-IOc1UD;D;(aBo24@w`PL`o4M~ zl%#js_EZgIB4MAEC^GzjKKxf$9wXGRmc~Dg3e7VmTA<@wBxNgfg~n9ZqlVl;S%!Mi zSM7AkWAK&h>QGkpLG@=O^M`6z)-(&_me&38zS!H%a>zq*2X=dC^yLUxRtcm~1MUTV z_P<4S&CD8t?Hs$LaWOtuSniB+l9N(sSyQ9|?DhlzYynCAW-x_qCKWy=kH3%Cr`n*v zCAmh#!J1!k%9M8(C5noQNS?SSqAtp`Q;=|G4M(+?Uy;k3-gz%7COjXA0^u_d;M)AU z-}=a59czWIlJ1tmO#7Y6Jp&b}Db16k9+X&%bKfe{#+8y`d=KETyilY|QJ|BYpHTuw-%_TyMyzDN-?a`&~k&6rnW*Bz+c&9B3Oz~ziL7Hz`JhP zmI^`c-iGfmM5@E@6@pMaq@%yP5G$Q%ose5)=wQ7Qm{1<#OOXru;EhBLgV!f5mUp(? z+-vP_bB?EzHE0aJ!z`9l9IeXd;k=_oSk3lyKRR%%^^v=;@?j1vt1Pig!^hl$sdUjZ zcPwd3cTm@}lnls^)vwCd3z~$j?&T&URV+FXUC0%;k8u&i(~!K-AIbD&trnLWa$i^! zI62QNSg&SAc)|Xj3w7d=($e~=3 z71BjO38MmtmeW^Xaqfh-s6+}1NcJOmxXK>~5zCBrx|`bD{R4cQ1+6?ZA7$lZNlv*lCDqey0Kp5J52Ahj9X z0*C`D#K|pjSdM^_w#LLgi8W4lrMOGN(XUO7lC2#HhiTZ8ZM)L@#&ET=G4Wc6;mPSp!Xzv)14F2`Mc_ z6;6&8*Py2N6kkV@JYSNUTGT-?{l%aAr}OB;Tz0^qVc`&ixq-^urAI87Uj$(p6p;X& zU&-Yxcv%`M-Sok4svYdTc*MjYv_0_kRdhPe)Kx6Zx+qNg{0s^GiO9`Vis*_Z0PQXq zq_AjA{-OosJlN&iYxI%7M+T1EEc8bMu>m`D1ZZ@a17qZsQS_@xQFn!Z%~EA!X81k2 zI|2fMs9H%!NAd9lzgxiyFnU8FBShww(~SrX3Z2rPX|}Ib9(I?s6O@F?x?U#0`>||C zb=}3rpo3n_+uLnp6v*!qAn9uQbSspD06{?FBlLCDs0<^t2K4A!3ic=1< zsoL+TR8L1neS*b2DvFuMp3&H0okYGujln-8| zNYy*bBNUn1KuM{8SmXRo{aIi zkh)0fR^L%(yeXO0+3%QkkT?Z#gRdbmvH;B!oj&oS>8wr^kf3-i1D+mx10UUIhcUrT zcsSyNVk-AnU6kn}dOp8>u}f1(>Y1(}(;Ve;m1I~a6n%qGTK=@pc7n630JGTR+GZEX zBn~R(;qV(WfEk$o+9_;8n#Z-P1~36Pw7gWW;x=jpa%Tul_iYwY)d$sZwq+liMAK8& z5uIbleoRRtTL3~@;+Cq=3Yao#u8nT8$S8c}uTta94ZWgshQ{`_+6^l3EK-reSZBTt zBlO6>FMQ65K-+6b0g#>RTg--?u}7ir8^W5;>?8sj2nsqF$0QY|z)M1#3mxOKDay`C zMjQLI^De+VNgBJT=VMf*z%sOh$>*gW>}a$zE}}rRUuZRKUbc?GngQ~;Wb9+HwWW>(Zes6%?j+Mdxe z(xdRakan-gC`nj{zuY`HQ*7g%spM^vLA8EK!(2v=nGhx$O5+$Qthc$9-bN;LS>LO( z_NAGuw$8)6{AM85E(kiP%jy$gWAb{W~D$gZ!?Ai`!9 zwO`KE(gXkP7{FkvaI;!MOwi=uhKWAdxmsWeaJ=bxtE=us_L7#f!b|2`g3sT9$Xy(~ zIimlqE7cEcp!IPJ~z!;gp%dS#XkWDBv;H`xQtO z1ZWGfIqZGb6E*|b_eDKV$5NeAmdj)X^}B5k!wRzji$R_7z4ig%U`&k_5!gLFCwtHN zJpCbaC0#<92o_2RoXQQ_;?dEWvavkhHHx^DdQqdm&c-f{tz8A2Ei&qWe7W8_oIHWf zsV^x>SIRcKJN9>LL6!XhX){DIGyl5=RC*)aZ?gyRzqvtdlk% zBQ3vd07XdT8=TB#q3*z$lE1H_5B|G}BvQNXPH~YT4Z(eI%{p;pqkm0u&f?j$?2S4f z6D9K%chykPDZ(e zlvKORy1w`CZa6#0l4S!fWc{=R;+=2~YHJw5^V}>@*0tPfRLUs>@N31)qO}N_;9~^P zEF*6D8#tl6Ez=R@2W8wP-j+!YzTLB!X%$bgT=Q>TjWi%6XXFb}ti-V{`t>VSx3;;` zt$L|?rBx%4brqXt$;O0TkFsKZd+rY6q`0@Q=YS=(u%l$d7m1LKFI`m`G zb1F6tj^%Sm05MNUq(qe;SGS=!%~WqTP`zA^b9dbL3{_8xcoaWS6>6pn?<%W@xujL> z_*GUU^5Q5dD?!Z;;A0j{Y6>w`%_}5=y08xtQ>g6gl2zO8KN>64#_0P81sxN*s5(B0 zXIYjch=w0*+X}2ROC+W%#5stFkX|fG%sJU9D_i}>Pne&C7CPyT?)dr*deM71GzU_a zGEB6}-f2h3X#nfi?`^0qn!A&AaJzLk4%QYkx+gy0(p@GW8Y3=j*?7)>om5*8wU770 zL-#j=hfbpeH6+sjB}&;}MMy6~X3WLGlCu#SaYC5wn}9@P<%LF3i*sLwl^%|Ysk|)e z(5pP`EE~M#p_KZ$?69LV(`e?&ytWHNim~OvT&}@`5g=R$&QM&dWT0Xh0g|E+g;V`k zb}rdL;ewT(Gw-Y7CUkIZOGX$`OV+Dr;8kLs?iv$`cfKoS)!5k0PWQUiwwd+xq6#wGUl95hXtkC1Ri66Qk<}OIjLh_rPNE<0O)T*CmVd+V zv+W^ldIdgB-u=DZfGeKxaI34oTGd>!{9NRZf&NJEeQkrodMt^H`sVXCm8)FD061uz znfid3|J65e_-S==+07og`Dun^U6`esUolS|G)?K<^apiyA zVgJ$e4u8{z_O@p|qVKHZ(#T}NYMqeo`Ivt?WteK7TEj*{QwvZE8_X-()-W=qD@Fju ze@g1PbtyXB=Otr$w_&>&u0MtfDYslosG=83#z;IUL{7Hv7Wv1auy9En&WZ`iZq9#? zJ^Uhx71K+NX&{;WTwC?NVo%;Ji-XE6nxn6vJ~9-`d^%Qns0C*M!Dhd2fv&8eGG$nRxMyoPb#~p-Qq=J)q>p zczn1=YPND94-uk5Cb}i+fdhI*(k-HnLGmWdCt?%TyosnwWg+9=SHVq0AWT!bG=5A;EutLh;nXN00sFz>{)M=|Y8R4z6Ks!3XCmv2=c~))(A%jO;Lb)uf3s5w zVO(VMxD}MBf!FCG3+nP{Ze2GQco>mK!v!0~-PzRXQokB$db&rl<~iO_xU1Cpck$tX zt*?q%Yqa%}v+oQ6Qt@1TF<={HYmGq(9nn>v6MDBeVSqMOT+Xh&_o~^gdhD;=EAq*{ zLisKtGebp7=|kmlj6DI@RMzm2C6|GY_F3Out}N*&)Nm&zY>lsvV?qdIqEek!#xMhC z3W3p>-ZL67Q!f(OQ^08ISZASs$zHImK=jP{I+(M%;%)b+ezgd1n^q6qJQ;_NG@S zOGY$kR2fBk>v2PvX?e{m2&2r05{|fme9@J}(Wn;~c9@uS+00St{7k3YP5nW$Kxyk` z%XL-NWIvcT?I~QlJtAw==x%V#y6j&$475hj?-wZ|6Xy{vAR!=Qjs}}~5||%NU`0@6 z5tc0+HC*NYGfU2O(H}x(b#O)pg{QJ#TBgcIrY{V;y?~TONS}r=&BX4ay`0F^kY+{* z^1OxVaTbgAyTySfx(wfZ*iuU|Z~6c(yn~r)FJBBCQQSkNG_A|(_)8acWius)oTjMW z%SS3`UMji=4}`F$0pB|IvO~>$L+;*?1)Y~4N_WJWH{2o`!AE_#P33Pri;(D{UI!Nu z3m#-w2Pzro2M-OI(7T2}n3rl?*at(&%TY*31@AINUt9KHI5>;Huk;TBJ3Kpi%O=+v zU`{e)Sx(=4)?E}U9J~`}d1D%AcPR3m$=u*8%FrJm%NM}cW502*0K)+D>iCs7Jvc=< zJwimWJTf+L1BCv-5-FN1_EudDOa)}6h?;`9YW=9dDC^Wu^u!mIBopVhCO2=_&FdRG zoS)7Ix*it8zon>W_WSkzA~u+#v!yMw2<-UGtyetnJex}K8iRECJ3n2^(uex@InP1z zR>;j;8BJ+%cM;pVznij%xTJ3}QxoXFjq&9Zg-YzZmT`d89J6D8C8eHx4n0(AZpV{k zDqhEXty{i6xwdrd=~DBR#46psJQNMFhgV4V<_reIaaaJAZl{s&WEL#aC06ps5 zrWC$(#{{%(J`1k%a!V7UrT3%3@KlFA|05mrW^qm!j-ay{jk~l`Nj`(8s6YdMY>Z$g zHOO7fU_h+cp{DZl+Vb&j87qY*mK1De7^k`IIJ{4 zUF!Vv>FbTf6YZh^Z>zZ;+w;st#SV2cxFuKM`M0E<*_J7^?g&7m)s&%MKSmZsgd8>4NyXI(L|BdD_P&>i+qP50X|mOXk} zM28+P_8?RKn;QsGZ|xWkFc&a|qoPM!$DO{*Nm(L*?;8eE2-}g1<~M)gv5r_ttuBybW8tEP>Zz0%?xSiT zgT7}}>mFn+|Ea@~U0QMZ5cAgHWnypR_vwN$&Vp6}<7*KbEu(A8vL4hl|7x~9ob$k+ zZ2hj-k>%+l`$mWE#C+Id2Nz2#d-^5M2TZc7;Zb@E746yy#n(4|J-%bvH_PXcz1^kl z=?hxv;0)EDn9ECV`!~?eZN=CS+~3#x5fYhuCpUh)l2CA|FK;8tSF=$_#ZvQd^PO@e zAaj=}U7nt5QtBxLdYK90FEkV!M0IyViwa z-Kr|vNYsJ8jZ(?QYA28?9VvDV7mBo2ZZC!Xu^ZYPWJbpofL=4cN0tpOkk9T))(x{0LZA6{{bEr_!p;d)U>c> z(84wUBvw>1{#`tTKTR#Aew8a;Rd^tIBpw;Im;y4Zd$mPc&9V<^DcYWTngtW zB*4;zpo2^lp8_NV)#;Qw-^Lu);D?^{x8j6IC!mukoV0!hA91n6Rq&-GGh`}al2Tzi zwl>WY(}b_{wbY2Ow40Cv<`$R+x{on0fZoc-wpVM34ga|QE?Dv8wcfLcq&Sxt+zYb3v<9rWEQLj#=v z8c5tqYQSf8*oTim@pqR_blpO8Vxf(GkwJr=7lTLAP zZymL+Suqi~ym~X$B|0DHP_kIMQ81l$kV zY~g&OtN4(#MuFs7Os@|7a@FCH0FBIDQ;30m2w-M|Xj0BLt;&$ET4?;xOQl2s{v1(o z;Jm|6C_NM9aJ;j{<hb6|rb{>c@*v2TQ=zwgYnjN$nk*bVnV|ty!1Trj%k#!qBdbVb+A{ zzV zvwe$F^5piJyDR6!*Zm1dzg0?)KiL_+$6Dbt51VCWMp9ou%#!s3P$GA`aq&yxY z{c=*t+;-LVn>&FH(|IiStX{z{-gN#KJJD$D-|fW1!otsN`zb&$9*ljNs-?egZeRB7 zW3!I@okc3G(8woUWJBSNzQJTT<8Lx67TgDV(rxKikn`vy48?*3G-3k1a#@pqrI#v{ z>aZ@V&qDR$8f@XC{p;@byXW1ykBfW`|H_^(8HHU+4B!B0U!-Fep8-5<>mUYLrn_Q2 z=Mw}4MgAL`__lno51@%HKf5IQ6yhW)H?HMM7|7tuGdv5;yWVrr+^kV5>xApgnlbaD zZIzD{qER5_cr081Xv1fifJW>5{0vvCCHVD#7h%~jITdSZ(vuqUbegRax8_wt?2&Aw z5HrNR2DD<8&U=EirC7L4Qv0q(-7C^5^zl(NL}5x4rW)2q72pR!`uf1)|n;wHVNJpf{I{ut?|?B$qQwE_r!D9Fcd=og&0Fj68%` zGFO0C|<_T5@rDWkU3~@@DMdd za7-_qxB*BjERU;H$44oU6Q8DGzrz#TxGpP^7>4LPsGx;l_!c;}A3zK!pSDCiU4Rj; zoqi^5E8b%#%{(0DAV;};hOgE}x3%Yztd=xAgfj6Ur$sWp|PN{tG( z8;kg&|7jR`k&Xckq|UoWKD+$q{6Ans4R-CDZXjw67My=#$D4?uZKX$RSbO`8>8{JOhy@#X|f850oUjtO~+WCRp{+{7i{P-Zhkr_iLI$W*1z zufK8KZH$U?So*tQkuiSsmfLcSJZ5;!d=$MSjr)3 zQ~KZ;X+nqa3@J*C?)(6sLBe!9CXsw7>~j10VJKYLiP{NX&oQL6B${&tfkAFdsQ;}7 zv>Vo>tNcAimv>?GBC!2lU!N~1&!Up7nmjX37G_AUG1du~DmAo3#@lGoW4-+Saqup| zeDRl-ZxX^E@avJjb6f7epoqSC%Sp;v&0$E;`0;4j7`@qrRJy$wi5KT?9aA*A?{RAS zK58&=2SERj5r=CCj(dF{+ZoThg_AHej0XQHBTC*6YFM!g`w<;11eSO)3~P;MUKv3v zQ!I=5#07E#KtM*IJ*QMP3xw0kI>+Iw?OGYXTzX2a`0Df7WAb~%Zvw=+;9K~wP$qoO zT3_sUZt$2)foP+U4){uNjb59fHDJms97R1m9LkX5?Hl`oLk;Itk_X!6Jbyp`0VhZL zSmfIDZnLYkYxMEu#)Ox-096R1x}6j77>FoSn-MiDA?n#1Qrc9_K|m`^!nO>Q9|YUP z;E*_EYQSg0#E_JLE$z<>UIGcG?SxjZPT+i3@#;NfyiL- z1nKY_BX|{&*j@qiFq}NALc1jM__Q@{EvcmeifFl?^dg-oGIlgp^|u>m0bRV=R1(!E zwUB#W%lAPXcj{S{3To(5xhgTJi{R4GU_dTxLt^fxc#qyvN0o4J7!0(4_7QoSe{BUa zJ)_`KIqA9^6Y&<6s1u^HcOK4kl-Q|j;rMBanhZf|y+bz*$2;wXi!$b`Y8uv9-YBVr zBfM)^{aCqui@`=6 z#Z6RH!6ipCekFnG??iOU*BblhcAJ(sP;59TuG-w9^h~p=3644#a0P%x3Md0$E0~1Q zuh!K8^PCO%;MXYOAboA@HU)VeoX+>i9X`}8d(HPjDjOIjp?{@qH5%W7@^TS-(rF`*8W z@$IxJfTE!eSf!RI9k9tuJj!q;`~RaPUfuyoOmRW_q&br80e5H@_8lRuo@CfGOsV#s zxvG0SVJ7v~Y3S$Nlc2ohM{Fmh(+!$PG00hLjzIO!@czXH9L=R(-H+=ME>oywrBnIs`x@SMpDM_){4OqVAW{kOV}1pgm(BQTer)0fQ==2VOg()YjA?D~XY|VbiVz%o&F8ev zLFy@TZgKr<5wpBao3z(c{^?z|EK2HAh4RuN=xM=SUQdEp1QvYr-lyKO<=UuX;WUET zY7S)WwaWrGH3oJf+zjQK;#eQj{$~r0D^=zv_Ad?Sz4XWPuGL7|H>W;IFsRVZmCnlN zZZ&&A|1J=WfKLtv`0%++RGvrKT@e1qJ)f-nInEwjq)a}^+c7oea6qXc!i*-R1On;7 zd`3pdkQ!;u)*MY90u)@BmvK>yx`1DolY_e|1$>Hnj+Kk-Gt?-aj9RUR-y@ZzVdvBS)$**Y*w-&L^!NlUL|uK#vx^Kp`w_AHE?Z zyb3m_(+Cx50KxpsZ-|c#>B63K7Nlzkn#o6y*2w#RA}H!lc1c7I*K5r>-vzUowhRz# zz^6D0lFelSk+N;6RfhX@JC_ykI1WgVj!m4j+vbt6X=( zmJLl3D-K!KQk#as1%zI6o$+EP;)A9C02HBpaUv2zHO}5SI4CU`p0$fM|HV(lV#*kD zw}O5*=tMp+G7pS`cI9I3$1g|uBcO`;4?uDH&wm9Je}zHSNx7qF&|xo;UjijM561eM zAk{)KC;zvGV)H%YrU-^ZL?^5ZjTo}2QH>wwhqcheqxp4^!Q^5KpE@yW0txeah-|3S z)C%9Wi08OELTC9+7Kp zgpt>Ny~9aM)RDxzxW=nqJ(hQiX6CYl#{bKMqQ&C{yL+W0R^wohsYM;F`3;%>(KJsD zRKOFy=au~xq2b5V7G{R%-u;$;S%yTr(GcUa29rOg*;oH#6m8k7JoqYc5JNwWHi$Ux za*MuYp(`ifH|@av#yM(1(O#AG`D@xAF3ODEVsk3U?9}J5kl&shtUXHd>yVx*&uB<4 z9g$x_z&yP~l(g|s6uRrSEE~|KQ=jk^yoL>XBoXar@e=}o+6lG)aXSrVu^O)4jEq>romX%WlUuvjRBaOln+hhJsWdBB8Ogt4S8Ge z_;Z|#)Ma}pYOrRz2xs@IWN;-IGF1*xavD)EyUBEffLnZ}OQde*|AQSulOB}D#F>?q ziM%n(mDMBet00olfAEi8g3jflYCF$WnOc6b5W5DTbdX}rw^e?Vehje%6DsD0Cn67d zsciy)d*w84AtR}-_mYS-pkRrls4tYWAu)-1ABv?<~RL90=y+X+2=3ZliZc2bjdvr!F(J zXx!!mA_gWxj;iDgfAF|`{?IGIiWC%Sn6J5B3L8O$t{y&FB-!PoF6|%zU>I^7S(Jk0 z^CGHE(Ch~<&Zn2f^43aLjD__Yb5Od}hXFKc*m*ct2N(jmWixO~8Sq_eV<$N;_Yw~r zgm zoX2#2qSFPlyYfX~)tLI4S#MdUrX9mBmPjQh%yk%@Yp>S!g8u9oN)4~FU~X?C75$DS zDEBl|U1g+xoM#6y#i%;)y$M@yD?3RKsDjoP(?q4GWR5-Wv(#68re{|KyQHFjYjG1> zXeZ3Qg*h!mrkOhGcDH&+nQHhn_J&blq~r#7dl$;SDESj|EScia59*^w0mOstYL*eW za;j_HVQt|rx>MYZK6A^2nI(+=3Aug+t8B9g*B;>R8BGrtS1gc*a4UYr+NVC62y8L; z^rFtjLK$UeDIgIw3W$9Uw1zG1ZYfn{&_IH-m=G{_7kKBj)~^ww7YdO0MD~}N=Oj*- zT0~zq_=m#3zJ4Rb4WWrEl5Qk3S3weMM*$6uky)arcH=~E$42bC?D&i8z42-Nv1@DM za|7u3(&wk+3izj@>+ASo>#JmHKvfnlCR9wJ)}ZmYO|D0Z5IPcULYNq@tU!Fku}H8A zz=j!C3SKT<3{Fta0&@*k1lh{6morGo?}zX4i_6RQTk?C8BCo}rJ*EdOv=kL&0A^!e zc_r;BXcUdvp`DIWTcdqw$2S#Jq#Jc3|qG?0jTYBup@Y$rmX`k)FDy zl@VBZJgK7wEg`>cA)q-2#~J()b_*hWm_5FE&m530r+nfKJ8M9pt|@HC0Nu+0n|U** zUI%Lt47G^G{0~lvaE{RCnaz^NM`lfs;-r{x3dVp)_=(_V7`d?g1$LgET0A`L$LP@`M=K*Jo?el2sL|5+qT~vDEE$XZ zjMyZk3-s#c zxT?7Ru`ZCDi@%QBgLB50guPVm=AzxkY&Kg{?#Ai=J~S$+-*sxmTC-4~_RO&dkhIlx)nnJkuRb&3%7YbF8~ov%I`yUvcTE zCfV5rXF`nAbo4XjLy+!#NsAOl6P+n!QSai}M|j1At=@`S)tZI?BW7a?3*a#3z-L$_;`}933BzHcMOi*+mZTYlHGTeR1w5j#62Snw&yw_vcGO&w(^7 zbwg`VT0>f%-$#+d51L_3DXT<{OHSN=c2wGH_Xdi_L|j*5J;u#0NPUl$+>Dm`aY~R?FpJsrEWsZVVO}2@TR1Bd=VG z`GW1AC&Y14C19W16Ky)S3}0kzq?g%d<^Pa(wm!x5uPvV*rNd~aHvrgX(gISLS9w-d z4jTjhH@riixJ-KP2}}*XwYAS~S;VSgG9xuNv26{^EAwALxI9NLmU)nV!wc>sJVgu&D}9=mN%w;)jxQfHgWP5AEo)FqMG7&m+&|Hs`>6E6FO%coO!&*e@TYhZ+65N%8IlO1 z`W|`1g+j3KdNflpqCU-$>t_BA?f6V_H?xG?f2upz4rrk0?I1}RN2Q%&NF)XW#NtRa zyF9*4*v7I`02ck>cGBPS#{NcmmsGOS&_MuB(w)D*<%ilg!~>f$0S%^Z84k7Iz@FOU zgeqCVaulQ4{)@PCTC`Dms^eK5Kz|ZD?24MQ^<7xwzPD@X8BK>~D!s`{@*2vy85k2K zk-uB3okDJ-o!S~*+8PnI@6V4ey+5c26406tS%GTywZlrH**Lc_isVt7gN6j_9+Hj) zaU@of6VT-V!_&2sh=>B$l*yH>5caL6QyhT0pWg6_;FBQEsVLqh#*C6$`Xh8@(J!)E zyQhYK84|6@z)ks_8LRB@E=hjYQ`kVC9j;`r*LuC1bCneRY#o>fZ@+EmgZcufG0aNa z{AmT%Aw$J#G8^E~iipI3Lnk8i#is%2jr1wbkoF>6=BO$BuOWA;=q`_!p|)H zKgc`TdB}AHAmP7lSVj10J#%wG@=&-W3WUsMFQH2qULA=%H# zRF%p0!S-0G7QoVfEo}uV$<+R?e2z5mu>*xM_a!IGnQ70kk9b~k@7o$y(oBGw|Fe?h zE&|9>M$?zzxC2VKU(YpUu>T+Aj)0Am*PMQ+KH3c%@zT-uaKu$Rt!64T%acX}SgFN1 zo0NazpJAvtnU_bVK`v@&5aUNfv717yf$eB{_oyS8sE8hRhZ)Tm(T+Pdklj? z%0T{1e42dqI~8MGr2XXeoc?0{AA@={Cg3{zzDYWGP0b@bDGdUai)G{YX-i$>2QG7- z5?zUylqqx3F~)_A%!WSpj0{FbBlJIEW$iy7>~J96!|(C}{s-O;HWhGJ%)9W|oBlT8 zLf(Ue(_6dqD%85(ev4%-{f@Z#d=@wWVB;P+d9`njV>Kypp4oddVb8;^BQ@fM^t-bS z@1)4g=EonYt?Y*zI(3ue;+_KFq>J2XWRtAj^h6Ax{b7y&4`}C@n?rV!?Fe&^futA5 z{kKV(!Os8H*#N189f06%H=4EDl zYd!Cx-=f@hT%bU7KX-#s-gBUUzJHud2-`ovO`W7KSHO_(bHT=^aVNzMZ+#4Bv7Fz* zlb~`Ru3{N(Oam>QBLn5h;E1PTnQr4whc&bXB~7X3gNzBaEHQ=147Wfe#1f=nzZxY( z7w@#k%z>&_k(SI9RjT^5XW3Bdg@F2|28@!JIV|4FrKCs|>fy+#9h#N?!!FhF9;x_P zmM9~Ki-iBQbxx)d|B@OKyKgdtl1D;8osChZe~3=Yk`An-EwEjH#D=&%G%e!~yO5_r zA24JV(O~T_@<9@M{8&seLo)hh^2V6fGMSKCbL=fav#W<4uGg{}3?ywRB$If2Y#=a;&OfVQA zN(6cTA4^ApJ*J$EqFWd&#{2kN`2aU4LU5Y0@cbR-ErRm09%&Z4u7 z*B{hdE3G<9tpfIj_;lasloeL=2Gk}CCPKYQLj~dpw=B4}RcxEYStN;%8Q(mXMMKC5 zWXGBK$iKNN+$V#fg%}Sy*<5m?;?f`E7_lZD`9VZC3jb$HCjuI|vo%KWB}{>iUlD(< z6KeFVH}vcP>Q;@xO7Mc_z5+)pFB2mTFy)d{RWiXnX3PLK9 zyq2ax=g_i&wiZk7@1pVlKsp2nO%8lmHed6&a9GO|CzGjA|Ab0FRXk_KAbM>Mx;1`> zhh-=j=lXFkQElOUP|GOug=)~#6}8EWK*ZBaC_A+{Y*h7w;AAF6#q3$rnCl?I(QY=8 zHdy4RbcXt;r)AjJk)+XA!d{ydXpJy*phSpN)o0oM%|@hkcq)E31NxHK0^umwWdT5CqRH12v5W8{(;zm@0tJo8n?Uqz=4p4H?q zMObSt02nJTdwLxJHd-Fm%aTPBP~j*sQN7Q00J3WdT9Qfl>JBOxxdi}j*=*YzJ?+88@=DW zFSW-E*vX2t&R(()A`dAWwxc%zyz4-J0>4*}0O#D26dRG9HN+Q0Tl%p0zdFydLyh<- ziQggJZtuNm{aS3D${7?beK0=nMzB-r^D#X38adUvLOLCYwWfqR#}m}UP-BYYAo=QK z1|a`#nfiz|FIgy_{17*(NavLzC>|mqK~ee+<7u6{A05paXgT{rDq^x%jpu^WFu>{Xs{PSa^Ax7;ib?W**`Rho zv`KrUG)JgaAR!R|#7rvOdnF!YlWf*vC&EGV&+SJ1$ZA9>FvG$XT%$j>7$^Vj1wF6i zX$dVV&YhdH+(}f+Jy(j(#=+F5fsCX`DifvvXbdUuPnJ~czQ))d-w#&k4rpW4Ncuq? z{cDS2TZ>y!uAYsI$tc6O>OZu!Lxjj+S%Y2*If zpR<1sp>VNBegX|#&|V4Q?Ra3=L>3Ex^h0$x`|M8tB>_E-Y|MiGN@pEl>jqOV{_% zX=D4RN1*7~-YRu*{XT?o0ZuEt=-N>L{}cW3SDrg2lnie|dr{caLJ_j)--RX@-Evif_(bEm}T1BBcXGeJuuJj%K*ot&_F zR9XyDhRMUCe4{?=c@CBwFLs{%3O@!P|1aUES{qeq?{ODxq;utcRfj~P4#_*T!wi;k z+Z9WVGMJB--#)bzV)#+KR3F5*WV6GR`%)D0)XYeU7tqa>RIm7ILIwkg!_a0FFwTB0NpA28ZCIM7yPZ< z5yqLmMM;zsK^T38W+jGxW{1sSp&Z8d^nMPrn|B|SC`j7Rh>t=IX8RqDql#@usm2-` z+*`qjNt{i!DDl#GU&KwUrcvaEzl0B3VVpD1j<#f?=+4tr1d9%~i`)t8bfKm;4j<3* zEsQEdq&It}WqHqhCyL~LPEr>?if8}zOYBCW93XLX$5Wo0W-(7t8g+wKRwr=+G!B$~ zcj!jbo^TJIsOV}kcXypS%^D?7iW;l6^$+(*XlHocIQ9Gr+@f1w@I;BKleOJcUD1XE zp;9H&Oov3V*Z5@#WBe@@8FS+fUCa&s6Omb$rOWA+A2uE=GH$Cc7stB3zoXY2x+OIw z>~Xc#Ckzx|`DNzEtTf$4xeJ;V4DC%rpa*Ba+0Fv;dyzu_yY#N4|IjiI7C5RV`yZwE z3v-m`!Ag^6U~zl4zNI#?eie9rCzQx_+rT9xDwh1ts-6D6i4FcGcMm6XB!*f`InkrY zT;Y4n5VQVppytXmWj52V9;7gC&@xXXI-kt1f{>6k!SoQn= z5@Z;*XGD$6==g?Dy&eGI-7~ridQ$G5%k1)v`B$GkA67)S-HfY=h;p_iM=ScgF*z9j z3ON5)-JM=UNbo-d8IHe2)<_bR*#f4zjr3=do(va~Wv-6Fgl;>;7wpc@Em3fo2cvNq zZArPweJ4=FBGAKqghxUG@8+(H7?FV$x>1-WG}yq=ouvSVLBVTa%K z4$OeDbmf{`OJ=!7Q}h4n$CP+8Pd^2gEX)!A7T&j>m_D2+2jz8FckQsRuCI8&tz8t? zx2i}{#F++1$%fulBGRyP7aSBcrC{rk0d>pjrVkBr=P`U(PXT6`-XY5biD>H zpaCf%5qZP!ga*-CUdAgu5!WO9)O%`Ik5E06G&cnD-K&Dt1N^!YKR^Xa!`F3^#x%#H zX75jq@XV!G!DjYMkUnu%&Au=(Ow0|SQ-B86jiiL-v@w$hnUXnH(U51 z3O1S5bSujecRkC#dU_X2sTEu4Fnt+TFvUfqs+}Fu)1VA2ij3ddqC~OCp5@FI< zi?JC+{dq;KSe?_~X0vduaT#J*a&E1e$4Gj;hH%-9PRBGs7pTfNFC8N?$-uGxM-lUB zL7b1Ck0~Rj1m-jaXA!K_z#Ub6hkXJD`WZSg=0@Y3!Ip+wcZ&%ruEk_$Sf=^k*+|Ju zRc8k1`Iz~ClV+TqrZBI{5U;N!7HXSD3U6X7hYXtYaG?%?7u4YgTKC0;(BZSlk{x4J zt`KG~ukOcW1c$hOM~Xzstf+?~$&6T|l>8jtwoihxHnG~e!uJ}cYf1+qT-3*RSZaeNljOj5zcKb`G z3jU?EM5#_lu2#_jAKxS_Sz#PBpt>111Qdv2KvspoXrC1|4h1_AM-!!XBP^V*T)@^tMFY{s2^O zsp|G@9gY26LUtkmXah*>Gm9x;GcETqb@Fq%KG^~dCdoM@2KcRQEm7KA7B4I;Bz)u? zk31{aPDa3)GbS6X~J21ga-bSmogt4HQrRQ;N- ziee_0AcuQw5?Bng)cq2kMIXk>0xH3p@!-4tW;)6AMnE#p?un#YA0m^7=eH8F3p zA6Q?*#V4}P2J`qJy(|lBazMLV|8A@+=yhB8@&0hUsgYg4&UOZI5(?+>WB=G9#P+5z zC96A z3EQ36)0Lna<%t_GY%6GEYDyQaVALS14JjbD{Z)0x?Yb^7yDLYhiXXHe5T=geEr>*+ zX+j%eG?XLaeEs^%7HZP{i=0+0&kXL&Ng!$J$PualyWjyz1#T#zzQ|VE_bgZlojM+K zYKf+0s{KO;?DVS13G9PBqVr#VyEs+2obS~v3k8UHv{F7D=F}o1(AY4}+fv^K5v@(H z5kHQz!XDW_vmtls?AshQ@&}wK&QDABH!!V-4fVkg4sJ(EZyi_Nji|$Cgw;x3VgIVF z(0-zPXhc)kPm*c&qhe&QPlF$Tof$vL;?0>v!3a!KvY9s00V2)e3t$~HVS9Cc%l!XQ zjX|NIVb6#OORa=|&;5a5u|kQ-Z=M1-oGDU2#axa4=F!CiE$St< zmh?)aO=}cq4Byu;-&^6l{!z_va%FFQ8r}Tb+I}q<1X6}@ z=0l7;W1fRz&D`uvtGMJzFIuIqZOnrDCP^IM2)n%3=P5QJoY@N6N$*TPW)Sy@9mY3f zZRIglqLAQ4*_9Fd@rn> zdXUkuG2cE+Rkhp;QbYy#L*o(Bj4z5*hz340} z*?8Q>A;wnkXAuwud&hVf<-wQ+5LH%Zj%-<(D$iKP?`U=J)S3=b^O8|SEPmOcBZ9E& zBk(>aAYnq;sXV_J;E~K9lB4Y71`euU5tZbx6P7QMYR{0xK?0(M^L#$PV+-HP(2ez~ zIUA|f&OcPDDH+)lCs3(WE|K!`QgJZ5Fn)<5_cIDS?S-2Fyvck`L zKNCm$y@AoLN$G?i_qbG`?nV-BuSSU2~Xflhmq9QLPT>)aE$BrZq9}Qi? z`#z9K1#bVR*kt8oWfaOwQ!L(Y{dZ#^-9^xczLlXRaxNMv;#QPd<2zY8+y*ir_m`KI z)@b0&0FO8tMgaOUW$dXZt~!yc#GnfmcnyQIu<&fknfV;H&g@Hkr_(_N*{TYs3c`U< zdb}> zcHmlj;+UsE#ajIl`f;bHEitzJ9HO({p8Nshq{+?K=Z<6b@qe|SR z6>*iJbphg`JEIxV2C`wBrX=L0B7qZu5bN<+ZFF9~7`!+*nF;yBgT(Rn$qBehp^=(U zU)j8u&KZam2A_s=V_l^Zw`mhhm|)VVwLO|yB!nTTew3%3#W=-ubn#q){M=O3?0h*S z=7AUiT?~z7>_QKZl4LkR+lB%my@ZpL0 zOhzIVOn->2JebS{&Sw&Fg&VCLa8Me$R}ySr)-UcyU3q)N`}p{A3UY@+Y_3)?x)lHE z0aZ}!Sp=uvJ`~e5yRSZ{K&brCCEL+N+{R$J=ioPVX^3-rGIQ2Wnm(t?XwSDVZUCSS z)LO6iVRzufZ_gLS9369MLP;*O87O7zE}A)V6)L?F&3nb&=gzni0}_yPQfk(g-EqQw z+FYWz96ktyI3Rg4@P{Xx2CBM(T$c!v61sWCd`nB4G`0p62+rt`9m=6PlW>AqTF2gm z;xJ5367LCO4)u1)CDtevO|AgIIo7=tZ4Yw|N49QeTzM_u$sm6qcc{?m zye;}+YT+L8ABV1{vUXmC8*Ypd1?^1QOzRP{S3!ao!gdm|t;mRNm*FxuE%4&_4);d6 zIK0!m%ZM(GNmfL-{PKTCNnNFNRbuhjYKlAUw{&BvT6ed2W}zt#1D-(K4e*<80VIeG zX+8p2=+5lx)S;_dXyY9!SN#9=yP7^22fke~=^%ki{UoO5I7*1a2qQRJ{vpejz)QK+ z(i?2~4C#@$L|C=pyefuA_%n>{>Xh1B^hTUx8GvBs24z$G zgKo953Ye4r-v#V<19Jr25ZXC3gCJ8k4DVlaq#&FJIQgMk3M^B{Y9U^xWy`?Pq}G!IcloQm7_ALM;734xMdpO z6=Uch5On(6N!4*wEZeeZK{YJmz)rwJSZpq%17=SvenL`~To83%QL#}aMhc&X89vj4 ztNR5K@SEZ)Q=}BLL|50u+43?%>PCILc^qS*#fHB)bG1TIc)Ak!~bt`Xpx|=s@ODa>|2c(I%~N!Gn%nlC1iL#6`o8PrCFv@+Y^E` z0F=YNa|^4s4^8Qd_9F2ek$Y@khz=+C$eP}4*eylsiT{9+TPY(}(vKzfqZ$$>A>VV4 z)a?ImjSA0JV?_66tTUHTA!!MprB99*obKasRJU6i^f%GBC+=d6yC(QGy`JXqxb zlyc6MB%e_oo=lQzU9s5FP-KYDV>k(mWAQhh@Ib#2BVtJX)PBNDI%``98fT<(j-Q2< z%gYGD6_CitAo>pi{`IlDM^8^vmv%~6u5X_v--cZ*`bC+uhOIByZO=rf;Cb z#S3&YmcaD;*$8{)xD=%okY3qJ1%WdCOG{N;six`0qJ+azS&`fV?{&s)XfsP*JKqlt!V~#TaS|I!ZkZ_hL1TVSs=!QHOlFP+q@uBzgZdUbrd^PT?C~z&VJ_FT8`g}Eu{S3a zo_$x$oH1$0kd28H@+#?0T*RJoK4Kb;EYRp^fOn`EEGPT)EUZUTdT{6()*N5&0`y|D zv0$V*#rMB-Hl5ze+SoErXBt>Is48(xFVs_)3uIHnYf@GSVJ;YRSQLm`v@n)hAz!~) z*SOVsnn=A`71efH9o7_?;e{jLSyr8CW7+_=V)cH9tWLS5)**{~VByHu0$Hq6IG0Fh zUoe*#!-*r>b?T01emG(qPL`QRreMT$l}BfWn(esTm&8ipoEivAX1BaRor#$K8}#}l zTq-VY8p zamXQ`;!v~PTLn9R?72oe8$KN-cv~|(KGP#N3Hi4tMc!~%#h7qw>fGmjfBz!RMe?}j z^xxp%2A}U#*IetYTiJ7Z=ZZkKlA~ERU%ZyxMDxt7qo;Ypiio!eO05a}fD7uNZ@@Dr zL1cr}s3^Z7zqvKS^32Z6{LIe&{K(F)?250DI*5_AfnsmYsHA2 zS9<8m`jMP)_}z0~rnDMEo+fn~=dxn?^6XsOvSUEcQM{pjeS2Ft#1e)h-;pWY1;K5O z6-H}Z9u8B)p2_*Jet3U>LgFP_-HH8-Mdhvl7J~jOEZ)|(LS?SLDcCt4LN5J0f-DA1 zv7YpcTi!i9JQUzCx-6O)O{P`SKZCP@sXM^;ChXB@ezYw`hMQ0YjK1aZaj@D3ED>Bu zR+PGA0RM2G)UNC4od=DNu9vJI&k+U4vgt6e*3%_*(3FOd1Jg?h@>EkY_{r!9HylE5 zEfjlZp~`t4O;UyqZr2e0gRB)_Ifc=vo{r43a`k!OhKuz*5L@1}4wOHA19sIP@q3QX%)ZhS}x0RT^ z9|eN<=+M2~r8GJraKizR86{@xIQn=_)1m03bn;HvpS+se=+RVvFHi`XlBNVigmd9r^BcN(4!%Yc!~N&+Ug+DavP8oAJ9<+-2K9GwmB^ja>eO> z^YJKL53h3CKF`NtmqYNDWqf{0KC9B>eJxZX&EVkP@I{-RJbs53*Exzd%TBcBvGxVU zq@2KtzCA~1wbHKVJrrB?K;L&n zx#HvUQ2}L?Zj8KDm%G|(DkRa}G@B6VT3jSjUrMC4S27(o<5H|o3Q+caJH-#7{2hIP zf_e=AhlV0z4V4o)0sI>^KN>@i$hHm08sS6RL%XEh(m{refs2H`n(w1YW0ZOI4953- zcoJr(+GQ=!38AHQD`@-oxKy3)sJ_{$9s4?q&Z8ped<#b_Q(Ky4w`)YAlfiK+BN_eb z0mZjR9V7l-=_KddfZe^h_3=Y0aq@II&+DD1uI67K+n1%|{UBe@mqWy2x{mJLCqO{pss*Gu_f$&&1LfyBcnCO-1gg@g$qbGS-zu%^5 zs>IxIPGV!Qpc10~s@ykC4AeGM*oDLPcdQpk%~m=Bm*`5dD>{;-wsN^i?hl`nWWzAq zECBX@5Uc>Qqf1YzK9sXXP3_SLuKK%x!O(sor=qCCvD!-K3>=ukA|W7KJKxS-?vHqy z2T)Om38_Wks#&vKgP|muU z;sTtVk#5&bT?xD}nt6H^KdQ}!@#14(>Oj#zCJFKW;r-}zNkwg;^{NQKjryCifu<1A zNED5kJOlSSSz#!76Ogeo<5-EPvF%uzWD97*)cBbx#C$u9C<1ZukN#hU8{|T*DwYU~{DwK#ip0^Ib}!3jZk3lBXuOw@}XH%_%M+ zRL=lz${%1e%2zKH{T8#-aj6ImaQdtzcFw7Qp44I;+5sWlpE=ZV56Fmx()-LtNaBRZ z6^#e7%KWi6;vT)dPyov@QmtvxAx zhpx^pV>;jHWK%F8yBE#RZrrbq=2ll2)q``Y%8LU#8%&yTx@l30eA-CigHbNt^Qn16%7*a{F(!YHmB#YQ7L_%H957lVbRQ50 zDJe9c5lhFa<`oKHfrQ#dBMv~#J2|M}Nuo)F0#72Ou91&Z9FxJAEAPj<=wBr`~H3b702qZB-y*x8D z4G*v`0Y`2@%Z-Xg!-|?A!*HReUg1vdNv2DoB=*c{7^|<2n@CW=k0~ee117s6VIlfT zWKsGfx7?*=89pTrRltxSxLuOG>P5UO=!fAUzJgG9!-ObK-J8V7ilM_W47UrioX-Be zmm3M$bMEnR6l@7_3*A@LQsHeamQLZh?I>c)MJQ`Lcp3qQj^;HJcPLalcIpOWFuA9K zwCV0|xy#r#{>-|imMVF1th9)tBO!Y~c}-G*XTKXqaI>ubnVr2%os^)hfIgsU9x(Bz zX3yZsGZfL}A54TZX)V2M&bhBEsakRcwTM<^UCfV1BYrk0lRf!Ya-mYO7UQz&JXANP z!44tTzvk|scOGr}xWM=DkL>xPLD;o;9}b|_MFw_}xsS1mfMKj8qSb)zkD~gRI|58V zC2pb}4=r5XFe0dqkFuY7D@gHF2$>)`@RU70Fx|BeE;glSSPn&#$8{cJk;ZEEKt+8UnL)cHAtV;w-U)5 zwoBffc;|UUE_8q@WUxo2WH0pgOEVO4aDZ z6rdYRE=lEiCtXtkqC#!{__M;mcoHf~2I~QIEJ7X^@?;a=BiE#AN2G=~m^cQPOUurJ zQpsThsKXOsP#f+-)amUz_ktx@{1Ie?Bcv2GdEmi6M;Tk8kLK4^5|@@nduC6vu9n!~ z?Mud(2>N&y6KMlpV5I7q95q1OlsMm`FVJQ8#4?1D1E7HMXU6|<%pf*qe$2yil9q)? z3~pw*mZ#-~LUtf1mo#zlFZyIX>$nU6+kjIcvGx{c8oWhVQw9)~l&!l}SjLNZ*% zIqBLkhRKDgO%HyBMG>`3srn^{6A2PU>I|9Uj03`_FgEaC3~dft8jPPUhyR)-3e$w= zge!iqtQ6c8*OFu)57T{r$~_k+ABN!hYQ8(1yWg{0)IYo)F83-aFOqpPD!kAOY2VA8 zLRO&f$0so$)l)>fw={IFF4aeMtDsNHEx}q6sFD%bCtp*r2rWWIxlRKmFWsk&7<%cC zl>A$2j!?{+73TO_z>7t;^^CQ4D2=4@ub;WU{gB)e!jH9-*p9xRa3psuM#9l3Se79+H zmSfnwvJotOSrKTC=_kmt_~+Q_hIb!@IaxMN88%!!kyIf}{Tv`=_=D^Y?>v)>3AC92 z%(w3i17q+67IXsR!mXnWvN#~V?=YdpMdDkVrSk8BsdB!0Z7Q2mRys!QsdVH@gl7q^ z7teQuctno2X3fNfkTe8#tua1*vbLl30yI>p?3XU8q%!JY84yL-Ew4YiNOxRnB0HiO zTnzX;zM!~i*MkzgP?}D5wX&QuM-0jJ+TQ&H{4<`KC6(E7;sjSvMdMQ_=j^CE7_vdF zy>Orb8+^TnAaHJ#v4pNO_-wD7>d=H$e-wVD(v*tN(|S&P08pv+NgNA6jykmJaV`vU zhpsE#Q8gVE6(@>`k%@=NdzE*BcxXZL6qf(^xVF!OQ0L2~>2)t(O|5d{&p)7{EGW!5 zIlRG3*yb`6|2;W&l=V~IF(~IriAEp{OC616i%j-@078%bbigZ#4j`~Bf%cl5*3B)T z61)hKm#}374&J$#ZDfm59Z0JM4UNH^vVHwqW6P`d{Obf)KA3 zw|2WB{*3i<(}UNkSm0PU4_La=!#>ZL4g#9v z{h}Bm-hJ8mg~GB-(1L}3>x+*3DX}fpb@bl`CgYDe+Y9+XQAEttXroBz<+9=M7@~~d z&|_+dpPN)`=}!|3!f6Bu$%+MP!WY^vTqZ1HW3ke8Jh(dP4QZ?!YB&ZUB49j@6Iz*| zh|*WI+XrR^i_kqU`Eb{R(swLP0@SNLMGWoPly#)JAui~pASbe)uvEJ@HI38O`tXlb zViPDJIwcXAn3St63$n$87P=jk$rO&!H}6)1j4{$6$-R)8%q=glA}6>613s-0Yc5N!P<=uP4_0Z7_2pQ{*gHk@hHLshhNTmqmy7Dvhu> z8Qs|?d~S!|n%ZPG)|8IT8QY#7U>iB=bZd&u%r3CI$=lO68Nk@YSXD}OEfu}8(k z@(7+TW@}_ifj(M*f9FoP{~+oD{3C6n-eRTM*y;ASL zs1R_v?1Ul&?874QntV_HN1jrJ!P~x?;2`|=gfo1>6DlPeC}r{Zh`UlXh-qmimPDu$ z?on6nmcS!trYEfDu3l0iO9hPUgc5WS4M>C6$&MDkgzjsJNcit9Lu;O=|G4080SWsF zf3dSYzR0Q>LZ5GH=S1f2od#xLkI(ys3v#u12Hi_*3kB6&A&Xc#lMZm}@9+jv-X#3T z?gOdDM*wE#zk~YPUunk4>tlj3S7Ta*k@!rC#2_XaI)f)49kh-El-pdmoIN=s_>UPRYQ`kyA=7O%^Tp;^Uk{I4Vo33+N@Tq0Et~m@Ftd=6popticj+2wk&;>(1 z2p<2tiNow;`r2SDP{46l`<5?dsu`yV5{9IXJt>;5b3X9{Q6rF^QUs+ zHr3L{_+eGkp_gl@b)}F}i%`K+|E&fu%Vjf0%&J+{ttz0Bb#DdS_Hi!D+g{hW)89>k z%&Tm3`MWRZ{3vR44P{Sldl)@VYX#(uVv}82{7)G8;tP7*H3v1CoI3&#$TB~_ZLSx} zu~IP`2%^Q);M7FWIdPbN(jS#`u`mw_UTK!jv=v8>40?vzmn&i65k^GVQdh)eeSi5U zCZU)i#y=n}g^P=x5pz>WK7&pJaq6TV1A!rtl^(3#*G5~hs^r@?x4ethejkJfc(ypo zSZiQ{Xp#+qKUX(bfarGjcc~PW_d?FR*e`($l*wu2a135$YZrIpTBZyP*!d~A>M+4f z^|YkEGHc1SvW0&@;fx-c*FMrDFZ$+D=Yfp69N2GnAlSB*| zG!zSc-h$Ovyq*_=eMo;_*W77>m^@OJ-7yf+us-~8-H+TbRist*p106g3( z^&c;u0_^;RJaMv(j1M2Q9oOP_=uu5G(q9x}?3}LmmZ6>{W~PzmpJvicHsxMktt2=zV_gEhzYE?T2(fy~dGNxhoGk ze1`HWE1`3<(NtJjoP}r;^5ZrlX{y2$Qy>zP6qR^*8VgGK4$VR5USQshP>}}45kxI7 zNzIad^DVh;@$JTx{l0YMn4hJ*jFalir7!m@?QQWo`W>_HBnA}qo%`Be`1A*t((4%I}N8?+T$H62EE8;^PN*FSLRr*jyl zIh}NoCy|YNjzWw`fI=IUTmOByEE?8ljQzk!Psy-M(gRMWq$02-Q9x?MOPaDpfVJE= zLEnxX8L<-zWK*xVY9Pp-ys&G~i#8%>1g#L4P}m9^hV`F&mDrSFa43e=He}YSH*ij8 zsg7h4a5@r;Eoz?%wL;g)BOXbQgxM6glNQiuBCE1avK0q65hwg($-|%q+Q3&6Q>aN* zMPj2rMp468d%Cm5V`*#68poRB*XmGbe-l&L5&hYarkn6|pn+IhT;`P7NHvHo(p-ZU z75GPJ7a!ZwomrOE`t2}?OLs5rPQbEl|s&F_=KFy*Y;BDSuQ;*+mpAl(NC1@Dv zAy5mz5CX6Mjsu`oP#_d&)9~6~jM4^$0p{fK#VG=r@(F}pVn=uw5aR4MXq{P2cb0?ob+ea)KOfyj3b8FiQmA zFBCXBQ|ZA9e|TB0acZLViQ?60c8P9se6=&Jk(ngiN;4{GY!kn?g*2uyWz=&pBQ^n# zTpA)%naX5h8p)Y++FX9dJB5^~)&eMnN=U-PFrdh5BP7Q)eF*J&Xqw|M#+Iw`bt$U> zPLKyT@EFR=76P8Cy8UQL@1#Rp$$>Idg;@3>j!X6GIcmYI^*y09n2j?OLo6Z(%D718I-0f=!AyKVR z{y%!c0SF^`e-MV)vD3-B(Y|;7b93P-)RM;m{#uCxTK(DdPm)9S14yxbcg8>DmZY4+ zTN0U>>X;^E`sqzvFaCt&XYTo`tDJ#^8fyQ#*{Y#VwLm8!k@`Mazb^pM^r{(U=GdAZz_kMTv|3p~A5s`cSh2di2^vkn&Od z27iKs9`{z#2~93gtjR+FUy6`AvbdvfSD8k&{C=Sqp47}=1%F+ih_k;xv|lmlO-ha< zNRhiNjJ_ui(QM~}`HYYg^&Dr~XT@W}oFyb5S9PZ{`FEX;2bE&_y#weXG)c{FnA{n? z7os9_+u+V*F)5r7?L7H`Mhc9Af%VB~Jbegv*4i=9=o6ZgxlfI}SnU-_4BmjaNq6P* zw6GHCejkh);5vDKNO>H?cUD+HV9t^di!s^tB9KX8dT~5&dx^zXiiMAd5~8-19I8tL zmC$`m1E%1GIAbWw2-Ha#=pLW@N2PWXJW_@4pQg)zD}2!syN1$Mtyvj;8w`E^Py>5h zRgG)+^UMH4=w7reS3rqv_LBRQ_!KL`HE)qK-UT-d{a?~z!hBB|{>Vf$d4nbmVk9rP zcvnt={8Q#G@iD8ZeD5_;l;=NftlhR=)TD9Z{L}dU!a(J>BIs3`9vo0|`D#|8^!~N% zw-9Xg=&|s#?nCPc*l1?Z-dL31tYG+{AGb0{(480VZ)61^RbBVo3HU15pr$$#; zOLCJM9mWH9CeDy9eDD|P!f^U$!u@j!M{6dJB(vG;wx7e569*Wr42<2%c@kP^a;UQ| z1O#212lN8NNXip)A*UwNoOBIZtMU(}5AbzTlt<3~SdxxK#IIq?zX$`P?2;~Mw0^Zd z;K_WOUlR^n@zrLXzrKJsLN+@E$p%Ds2uu&;m7Swd9)rwCkyKK))kTw{A~!XgkdCoB zW9D=l$(t@)IorBq;l+{km20|*Si!5=Jo}P$rdr(86B?XPk7#lNUNka_nVl^r{_>iiEPwgUP$a$w>d-GiEUm;ZgL0O zPmlKzS=;M+0aF@}>7r+fB9G$PDpw~%u@EaP<2qq88&_<@>3>!`C{~(p?IQn)LF52P z0gg9HZXtJj6}-;dMY0Ti^Rf+>wDtn6HV2tUwO0=9Y(xE1a0G(c{H{yQJ50FgfNVhRz9)9$yTIolxn412n|2TPlQIO|%AHQ7 z%e}Vc2A5Qw=Ue~37`vw+U4m#)(A~Y;+-=*oZF{$E+qP|+yKVn%+qP|U_BkicnYl4> z?@Yvc$f}2m%BY9TtjzVTIz5EAm3TX$g1-yT`I3B7X^H8x3;q>0KAm@4u1;1jYsb0| z8;+D`wrtf6PtUPkV8cy2h3! zIK^5+Gqm$z&gBiPm~2s6kIauR{gF^^TgP5{8Fa~^lQikyx;V-skBrvOB6che_KDp2%EhGLbrsc({re;D_*>A)?#IixG{GPU z_l8(m3y_|7*%6{-LAJ%y}m7nk0jx8p?NUdYFpd zs%(O^k-ajFMR7JPV23@M7pE;XvNE1Wp8SlCq0jj1*Kss zQr&z1FPgt1xT(5Y5kgsz`J#q8=w!IJZ|j}=)mRu({by)_>gFJl;jdnF&9q1RHSmR( zv$x+XF>rT%;;J)z@AAPUbo!P1aH{h#HE3Lb*NPeZvPB!6 zK*naHaK}l(3x*6e(I>MyQefRn20xjWKU|5j56XJ^Y^qCL$^i%Mc>Rfmd5Yl|_zy8W zk3m}+#vjxDVCJj$41GIB_+Vm)kr4x_u|G7>`x*09n8PC2T?wy9G-{G_R`zn*Su#l! z{pu&nU5l)mU36}wPG3P8G`MpIxhowf&DS2)Ub+|m+4LpXl}^gNXw-gVh2f;vxw6Hm zD{iLrUX|r!Jku8oousna53#VxFJW_fv@h&gcjV*hV4AbR98%+~)S0yWG3SAWt`ok2 zm@A~8PA`k>jvtMaVpCpeKv@vWXJ_aM_`E9yDbN_`XDxH~APiFJ6nE1=N=hcu$#oSc zgrK$&o#ViZ1BulLZ*P)8lbYOM#dFa@1{L9^I9Flm)0$u=*f*MlSj7dgCc>*7Ir*pU zUl&YDzy&>L?a~|q<*7$CB<6$|l@L$G8BLSPweQb1;hzueVaR%BAKcU61Q+S!ko^<; z+#|}8Z%}r~GsKUV3@EZ8JfNe=f`F%CW9Mt{IO9NHwPUfkn*c~0{8;c>=@>Zc5`j?D zS#2fBRWP^a&K0o+fQ`OcIBn?y(4DWB+l^zl4Tv!A53hb*t#o)@ffY-;JoU!oy~?sM zapyovKG=VCXaB?POJ|LaAg(Vo3Zg-EG_vm=kzoJWgC!2>+p zdWNn?Q)BT*X%*kv!%%~oP((TdCMJfJYHuI&Q-|K*@c&_bdwG5cx=K6OH$s5#Uf;69 z10e@0dC@H&xT1A=y?VZ`*<63D+N8-PSa(&o%BMBbW*`t3&fj1x0gE@i#K<7KCANme z;T=bfG`X?{d1qHtwJk(8%u%Ncoh2td*C$bhB?}iS`IcScH1%5aErRF`2O6l!dn#0& z4a)mcU9|ci)Nk&WwG_5`^fG7=RxAVHSK18By>5KPpk|FT9^``~lfAAJ+*L>jq2^u^#>r3PeWAXN78yE~A9y4}4MjdI})wVC{n^QEA2I+s)A`|2ORS@ehJg2%cE= zxuD-09JNvEhQwqhV0=7}s_t(a?_kv4$(H};0`A}hqn|MepAzBB=a_q4di&>0ya}oB zm|Uru(k=j{pp0QQ`%aZHF>j+J|38>N@xvVwH9qG@sT+Q#1dkn1w%2$QEIQaOzGm2H zz8-ZPc;JV)qJ-LL&=Y3PFf0-T`d}nNv{bYI~7Y2SFAp3rl zdmGd;(Es+>zhnr$_z)WA@#meq^BNg$qSC9mmm90e5$<{dB+ki49?ht-3~!W9aJaq#i4mMS0iz&R$}3E)Yga&v zgyt-h(YJUoqo*NJ$mzo>F* zybRsGXGCKdRvuwJaU$Ej&B4%bqd87ZhmmGxmM)W0)Rtf zgmQN!X!EfQecIAC$S0&B7;?QkG152L+BdM}^?x9>-b{R*Y15W*5H!uA`d(k87qCCx zC72e^IOmejgk1D_NzAYJHV1`yrUagcUoMqwa4RbG1>Pc}w-A2UU_p&g5__zJV_VAp z4aIFJE$xm~O~_Uze1K(*^6K1fN(a71HlS&z<6RTD7KD~Hb+ip~;Mk6QJ^~_$$3o&v9g0b~qtG-5X;Eq2 zQk#ZcX*6+TzX7w#Fv3YmFsylrTQr;4U+YivqH&sI39R-1DFMz~)7n!+Y^P9(ABkpC z9Qn&$%2)uu09PF`cv*t0BdbPR-N!K@)4-VMc~~wRovSd-s8W9xMY^=g#twG@8_6yY z3fF!Hd2XFLcR)Jy?xqLDU7&UTzcj#Jxv-eX@1YZ{-SUamQhaUKkEHJNkf6pp&aCAq zvg<4)??GJKe(`Er(cuNpm?;~=7S^D+g7$3=jNmzvYn?M3_KIaPR8`vf_Z~Z`7W1OA z1oCHnetI$i93b?9<50m=c|UR~qN&@nuhQgl_wu8|1c+=BO?{t?{Y#&wV;bMVju?_= zJ<=zlr9b&j6N=Q}!jjxv$ofOR4GC2(l;KHD0#Av{JP%o+Syuzf*e&vAG!qsPEVmkf zmY!;D>hQqj7*}33k60g@^*Xt9qu{%sVJ^j->D>_VC02yHU*3hL_bqa|7;|TT9ncvA zY|cymHwvKcx0InUG>Xo)ZFHdStAHSk5cO>ZaIs+wXu%5(D~5}1J`weGmWv(hB7oF= ztTMjH*HOiV$oIEzQjlOPk=j6=uH!wc>Lq#AGwj_3hM)?uL}9i!AJi1N2daf$HTtHF zOfzdc!Iq28U$ZSl?^(jA)gMSZeDJ*no<6g~|Hc3V?~e&p(jr%dpySESS8Wh{#OrhTI>Jp0iGd{ z_AC!l-uM=JFy0(scjBP=q)tXVF6m`N7$+OK#-SCZUTKoQ_wDtc>A!Qk5VW+6^QSin zSua;lJ?5O@g`+3#nK`=G=aXI=f%M=a&v&(m;Qfv zfZ2!kp7>8ui4Q|vqNT*3ne$K(S9E$S@Lq!0^aS#As8P4E@xMBf7K^zNfk4a$6cx0A z`OmavZ#B(qsqeWFuwYmjXw+H{4F!Mu}Me&xbp!U+pEHuB{(Acz!89=Zmx2fAfz_SmE>t* zJZ7R9!03bBh5K(AaP%ruP3jt}j>LqU_n!<{iv4Ns7Bu4wGW$C)cG;LG`?nL@DRK-* zXcu$e0>r`|X!ETNigx-}pHNnRe@X-TTWa`O&so{EcprgS(&{CKIY9rnu>YrQ#FrGc z#{C8u%5xda)I9l&q{Tyk!7Q#vhqEGM^x>EuET>&7_|LXjq!OfkLfIVrW8%Yd9V zZ%OkXYFqG!$Oj53#RoYBqW(XDw~CY+Mxm=goIUkiqsCJ$j?M-Y%1cZ?j9}f+c1gzO1YDVGv({bI!cQHtRx4=We6cy0O zxCZ)ER_6qvQp7Qt9p!93#GBN08mn?SmiGztqeWUbM2fmsS1U5%TD;DWoWMaK*x8_W z<~O$m2}&$Kg|Z`fZ8O04fN4A(4bQbs-LS!9t*$L52uK(HZ@@shXmXHI!f|K!7u;_q z$$E>R*pOPosSdI?QyY}hkLLPxo72Fg*J*Vs-RvS0UTk*DV(?9%OeAGFw5k6w12Mt| zH(>Omg)ybcTtWuRbeT%yQSN~`2!LGaW+~L}`BSe3$~(!Nd!byXh6-}I=rD)l=O%4F z{>KcQ6C?d1D`BrhJUgV84J&a=9xUNeMo9f~74M4mKxttHpeSSC}SskNydT_Wncln;3%Niy~_>?XrEY-2Qbon=0= zP;IZY=>LOm9E=H>zc6U4ZRm`t%@<5Xx>JV=!_kPBfL}6;Z0qHx@HDni#O@;HNcc%Zt1`_nb$H%aJn51f6D-R>EFOZ2cGSXt>_O0p9$Gg-1mlDW<^31vxoWv`h#SU>X@Uc#j zChb)B+bJ6n_XpRSF7+64wh(G`(AzH(-u9PMnrq$I1-3F2keGzSf`RB=U~A?;Zl5hI9%(ieVCAA0I6Gc|t%A`6UXi}#Mfb1U zquGi1M+lW4_ybOA+S2(z*o5W7#?_Rco!wuAkswQl85t<$Eu<^S_rswXOvF8nP|;_x z0C>ZYe4%n~4sICk;d^R*^cW69f>?6<^E!&{_mEy}hF176`-OQyu-k+f9R?LhDqA-8 zW}8XwPi1Oh>>~u{E7=$0St5Bh!U2+VCOw)i`)u=CEL4`-cGo9R5^NR_rd|&>po8{P zcm*Xa7h>n-2^2|kTh{CvORi;>UmEh*oR%es61LR!UdHO8S) z`uLU-22!Uf0vV_txPZ58v+?*xhON=1t zNZ)(!bcQ*$IP`cY(&Gc??dEASV#hAe$*?90mpTvJJUnyL4(T`*idsi_g11kPhT6uIMVW0LRcTHI zhnoqf|BeTX_j?>`-^dyskD`v3!}b(%1p137T#vTxoR7Pu2kM=u;%Pp_F z&G{&Z)Vtcf!GT-*n*pbr0p_8wFyNzu&fCLBrx83JPQWJ~JkLT$H}Vhe_2IV9iQkeB z#Pd(>5rDYtILTp~vFx?R$1Q*FqV1Z1_}=VkGoXIvx-CibmLISKKXZcMxIuaTc@1#o zd;X&=$Gy2le%wgx{S26xrqywE$GurKB8SM>;lAAb&+uM{=f>1I|EcMTHE;hxy5{ml zeY-iT9su}JO>?~!z47|E+>75qbez9}Kbbu&?s0B%pPRQV&c$tgoT0p({p+xl-+&(`Ic}e{+i}sr)mG=}CqnxvNezc|R7tyAyT=Q~!&`?ZD}$TZDXUPS90;o1 zJl2>XpOdJJTnP%PM*pW+WmI;8L^YoxK11_V_Sjnya$lXp=J0PyAlxEBcLOZ7(Aja? zzK#41VrNLwXh8OXls@|q3hLcX<^FF~^b}S`UhYd#tf#$259{9nPSGxvv~9VN`Z0eqoH55&HR6l9KlDI7 zTFsnrOfE#_i3uf)vc=E)M1v-i&go@B4p5>ob;?LI8=LFC9;2qe`wo#j?okiI2E@Rl z7Zd@ZvCQed5}B13Y(Vui@q1f^6*SRBgj?>e`G1E{x16fc22^2J_xDORSNCoF+$7+g z2lRVa*0=qn?tY{VJ1eVtUgc*(u7D<}du?k6Pbz9U#f8OWRXH-a5HWbm9nW^OHm1@# zYjbZdS;w1!loysBQ@mwsKrDmGQ%`qesbSR3?0ViT?W{g9f##PBeLej913f$)ik-A+ zQndL*c3k2rm|LR|p`mlk` zH+T8^=JkIb#FJI&1zocqm?M(en5nowxBnm*V-Lj-L6|dnDni*>+t~DJZjK36aUNvT z?XAoyB7^@N8t!RD-#rw1n5cXTi_#vH>KzZhM1UIB~MOUi$lH>Tp-*`_;t| zVXb5>WxA>X!6vP=s)01+@&0g5m*9d&;RSOl%9191IX zVb8e`;u9rhValsvnuVQ}-r-;(NvdId0o}+up2mic@b(|s^Zl~utubBV9X>Q=0d17! z1&_5owLcRiB}X1U)#Clh^Jn5XiJVs?JaOV`GI+ry)M=yLfUY`)y;>7S2Yx#Gzc05Z z!9O_kv{ZDx%U2^x+Gg#IJ*0WzLxy6)(GPJ8*qZg0rcAnA#G(g|%&qoKn&TwBJlMb; z6#$i`yv6yTiUt_!&hzr(_Q*e8p42X!n3G#1%ie04$aHsV8R`##uh7%#aOn!@uUR>M z%EQt>T~J)rK5Qen+oN;Ld}F7^G!QdKHXQOLiZR-tcU z2#DCkYHul=|2cBkG6&3rg@1b5-A9#U8{^6le~->E&Ni*pBdD2&H4@M}dRr^lhL zweiJUXLg2*Mvoh(P?f+$xB=G69~^rO{fs^O!2FRtkHtI9Ch8B*2T!@Dgd3T2hUtr1 zjES%r*3%^I8RNUb7ROOv>Fzd-j+24L>yJQ@ z?l>E7h|T(;jVIRmMiKn)zZ&TGp0e9xn2qw+S2G&6Rx5awn?Bic!$}G0rsT&C7=Y0I zA_2dvx}^Q3`!Me$v8Pd1Ap*1``Rd=lsje*=5=b?B^4@{G=9!;SgEK(z*qE1iq8i){ z_R@OZ&(+;E58X7d%e%K;Z9CueVD%d-ICU2WInTH2(}vwypr%TeraIl#XNN5Os~e?O zwHdWlWq{L9NZ|)2lWof^;9}u*ZP>HfXV_d3TCtbjD)5{t7<|W4(S2AfY@TwK?aj9= z0lqr!^-u4tJJtYSpQ}#Vs!XT$6q_s66|JA%7mz+O{}!#QW7W!HnzR0~#34=1zcGApHWIro6Vr-c=N_a!|4 zy&IKkKP8n5XAzbpG}mX-Z=BQ1(DVykw~sNy8jB7s0Yl%bE7`gY!1r^}g`Llb3o+dF z;=-3hawmT4M#d8lGwi`L)n4c2A+bf28PX_U7yUz8Q&fmP7?#j;WBiiKU|G0Cr ziu<>NU&;<2`#@Vy(02uQ>j?JdPxW`gduRLbm!H_dk@BAW)sll@Caw!@~Inm6>@8rxl;b?MG7>$HIX!F@eg_g zJ>IQ#PL9D%Ht<+U&&s;5M=2gb&x!j0P)FzBA_LlbR8enRmV6WyB_*jzA@y24O z{u(f$1FNZ`)m%r&Jm?woB;B=mzTDD6 z_f&7?p^hywrTML~Eh6F~fk}Gc+GKnp4AprSnsg+YF*55R1uTD#%tj2xY+QbyQLOD} zlIThfOOtD*L(7$5O7ima+V@O&=F3|ii2NcN$snUIJ;Jv{IRANfXm9rx+iOUI$~4t4 zZ4z5HzIsrT#LGvM*KCqowQAoytbL~|ScnH>r&iQnuYwyvr)Mk_UI`<^H&+}Yw~KBx z@JQ{iz6NR^az8R{USFvU6Lb%|J@9N^UDy|M2{dpo@+<@FW-2E|e(lL#gqX3{u3qtY zc6xT6TeVjEa`oqPv0IXIb*^pJZ^yVnQ;!Jma@uNt*sxf-*s&QoKYRY#?~OSJDMFIr z+By|$rVngQZ@$QMNeF0{bYt~(i@|y__~@Vrr)JyGUfKl2`y1U2?|X~;u5P9CTqW^< z?6>?I?;hofIg*K@{)yt(OwT~#aku8Z(0aJq0XTlOO~|Djx6S=`qL8pjTfwLc{f^ec zt!*Ysed%rlRZf#eDoHL?b3lyO)6?l+TO+4g5tO|Ql;}hCyLb8$^Et{(&4s=fmelRBx7JE8*N!;%sJX(Dcx5fyZ2eC0k{GQUT*8i7YVLfPbqqnAUgC5W065z9EH zg_U+eQV|4>4Ht1Q2-v!?zUcf1^Mj1=gV71V3;ut(o^-;<%XePUiGuZOK|y=nmRf-wgtMaTraQl=zpB{roa=%# zDNXa>xKQkobGz3H5nut8?-l~_C{N<4qv0~SYY>eIn6%ei<>m~`;aGh|gFz(;A`mC( zoGvZ({wsl8KobrGoJDwcActmdw$lA=tM!OOMN)k>sEl6HD6uHYVqF)_R-n%R9Vs3OwucP zeduwoo))87Hq*WM7f{~Bz8r$_wa08E4Y4#69(GV$$bVzLkCS+mT~p*-grv4?l=bAj z9=O_7M%RE407>=7!FHHLQ;{0`92`trEErXeyl(C}5NnOAiXSvo^nh@RROl*vr+7gb z`A>t*&RG`N!K|R$iN#}i@(T46w3HgvQ>Dvb!BA=muU9BzYp9uIEB`g%2%s#(T|z6P zVdY+)ms?}4AX=I7-YbgJkff9igqw%U(Zzt(!|}TU_Y&WxXK#%l5fAx@tb`$4=_@Vl z(PiK!RmWZDAiGz&sh3}Ul^XM+hr?dC$3HW$cma1w_UX^C)pjG!vmV>4wUMsx_tk<{ zW=@FX)~%?#nzt_b>A&BB&$F9h1sm&+6f)QVhSXmri(== z+=u;1eMTEpZpJoS3T~;td!Q$+u}!Pk>2w$1jLd1Bq>6JE~@c2M?VuO{2V*z6Se#5W%Y<50= z#H6f`H%yGF%#P?=w6}r75N~bP(Nj=58Gq3Y$fkE39>HgE9@Cx2y*7Pj*+h}T;9_-@ z!KlqQ6xBVNyS^!fP@S5h?rponwCy!xi(a-5kj7oYj6j5_&e+9lRUZR4rtzm_cNe@w zYE0%y<#N67>e`vNu2L|Sk=7hG4GM0)pLsoRP2$O0&Pno_js!-Fz04Qe74|lTVxE{e z`U^KjaAPamygbt(aQ?JB-#nBaj0G7BC2eCuU|N+0O--FS;hDaXpYWAm^0$Hig!+Ce zTiqQ`eMJd+e1}y2YyA*T-1RIa%;+L001FG8GQ%x1o9oEyrTpdm8Eei^J@K;-`S#g* zyL5rJX(2-^(+51o)rMD}^0&eMO!&NBw$noglbiYpv3$nO^r$WQ*@Jzrc-{H4hA->e zleaz1IUKwmnir`eyr$-*x5}`X>S2ss;wvtKX&Vy8HRS0CX~VBmOf3`bm&c0?p+L)I zEO0jj4jQz$zK&CV@#jWOAbmbNd@32)Fs{+3tPEn-9RxrREWI(rXdMuS`7wQ}!2!-g z?&srwVd)1@w@$8C7zhO!T9lz5R8m7R>>r&nbSkG6X4Ok{7Qrv|DI6JAga?jI&m@cE z6h}<($s&dMmD%>)c}bG(Cmqd3woDFAYW(dzaJN_|_x;4UaqSteJ-Fht87$s->y(kM zx-m^HO5hhqAtd6;H9IiSJA6V~WLf93xU^=A&BUg@IHzF$Cj=Vh_HE(E?tiZLA-h9; zUHQf8=6tR4@T_m|D91tsB)v7UUrR}}hMY}8&YrU&e64b?tqBS&u#%O2hk?H|JqL{S z)t-9A!y_6IL0q)so&?#NkqEN9J6EZGD^T%M`&1xBELrF{y~Q%5t^sory~QFDv9(KC zM7D6XbF>}uietxQyo(4B!rFB?qpDfQq{KjXQ%}-jnFJ|zwfa3fn*DGV?}?9y4TWNc zO`^u8H4r#Iwr6I+Hgr80I1r}NF#a?}`ik8hJHR5uTtYI(u_NpqBGKV5m9abFfU|5* zU4U+sD-_Wk+z#78h3VFe_rXduFQb*;Fv zyf3Zncz=xC$dFEEFsodGsz?wL*W@p786&2sm)I=~mH^Hs#eJMWVJFIeS^Dlm} zv5V%^iNuTJ+NO$}tJ1Bw7u{X74FY+#i|BuR>^8gXos%me9M3(9{oN)Hd<$}q*RGu# zGH;yPK5@Wt^(t!6z0*($X|)nN8Dxwp#$P3mJ0OnXr^2y&&XM|{ys_X+yZjFC>F%8z+DH>x|>E6^ntVR-4pic5sytGnffwe>^w zN6oCs;kmLb*W>CwiR4NsR#{5OBE=m<$uFpCFzbByJ0; zf*hc3Lui=$BSu;wayiC9mx32Dn@_@b@)7>iH!Yq-xH~163TTX-;@lr6)vd4x-Depg zZs=pMv@C6`0y;cdSa{zUatEH6>rBZno2X}%M>gJr#id%vb8&6ZhJQ)1zq)6J;z4@Y z2oF)rUaKUI^ogRS>l4tyW6%D%E%4E!r_Z7(^?C-Ir#}_*BcCjdSSA{%G&3LVtk^=F zxrJna+LdMPmVcny(&pTGL~n9#O&8U*95sV-&RfW-Z|~{cSly^lV9n{?gaFAk;gm6c zfsqg!`D*E*!^?hCXgSdTF7Xq&y!=Ri%64~kErISG1vpStn7=$g9xZi5W`-pS%nq&a5+t>m0^nmx+~RMc z-*wTe9#kRc|DxtjkXC)$H8&|zilu(6>ri~l#qVA(|0Fb3oABZmckq)TuiNPdLwi0> z7HeBr^&0b&!=lf+n?BYsvbw1Aa2|}~=6+q@+*z~0d6<|w$b)}1@TzQg>-sYEYIKk} z4PR{XXxXsF$-!ZBJIndx;VRT@ui5$n96KD`lJgLE!TRN0vLUpx-?`6nnB!$y#%6K< zV_a-=-Q5-yXu;J z{b|T_*`_CS1)Fq0P(EK7sV@8t&w&!%rOx9Ymv;7l_RoZT>a`=}`GuIUdl)mev!_=s z%3zqc^-(DR$HeL8F@n)8#Y%GFY!^MVOu;d^N|i1chYhEQSWx$$)ZKi0@?UA}6v97q zabd?g`Ey$tthLIqnm)YW&5qL!rY%4wmI)gLiA1_f$e=D~WnY)pCc;q51TIU`Pe3h{ zMTS!J7AmAEnHsK@dL-Y%Ra&JA(eb4_Bs>A&eJUL)j`kvg9b*txng{+}pcuv+*Pid` z3i0sa>2#0j9Pnk$RH81RzrE0-vFrEY#cgV4rBn%krNiP;MUm!;^5`UWDareI7J_TI zzG?3Ynhdso7#JqrZT`km8#D(eM3ln%;Mu4-Ra|2Rgz(f{Iw)gCPo9F6+3eohoTaUt@Ro9uTSHUr{W5ZcmL5OMB_J3_ zcJ?bpOG`7nDl_Pm1oqYL>*QVw(;GJwFXdI5i3_%52vC6#0(;f;*qDa-b{OA9gx4LwhldCVM9&1IBNA=`(dVQXAUvKiJ3&D|Wp6{LvF z%0ry~a?(kCuZlbbRCsgPsKAPsiW(=O)$&wS)$)5*@r!089N-4#+F;sB%Su#pEX(~V zXDaOxXrBGmT8djq^F*E6`H&}G>dhBuKtAir7FWf2pmA)@B->*{zANHi@epO%ImDB^ z=mlZ8AYHh9tK_X`-m$?B&&M+NxGe1QDd_fL_9hl0J>~=MR0Q+v9H0y;W#^nUq_!5m zOpl(rKQ7d@6XzD^%T;*6NgQuaSMBJu*bbdXN78}f4xIpF;zGFnJ~0s#^eTU6Y4cY3 z%C(oT`(}f1pX04#Rky+8C1g%BB8Ze;Srtv9vOPRRU z!~)5<>(3@0+t@dpc~-DC-^_(tbe6z&OHK3pH=fezFGVCbe_CU%k2=M<$>mKX<$wP< zxZP0FGKAgb=a_a@?;<+;xd&h$*PRy)ec^~##w~{QfwmdxQq-itggI_h0ICgK4d!nN zw^^#7JmY2-4#4G{w(u2}yq<&ka*er0>04|?pt^q4o7bQSpL2OXpC@?_2zKb`%gZb1 z=`)BMcicFVJuMBv{8a|*>EIN0f?JNUtyS39*QJwI=03S*BiW<5O>$$YKks)Fk`a=tpJ zQ~1987@JF`gXyE}O$8)%?dP+Cj!Q+lBx<{Zk$b`USZEgdb7W8Fj+>~LX~O+TwEbjV z)pO}jQ-m@L9Oc1K<<93r&vFkGa^lrk7Y8MhT63Tv=W(*Ggd)cH1gU>|wvO~C6>ukN z*rXDeodOh6n!ne(ITT1a+_81u=KIsU$l-T1s(l(kh!ej*sz@=~4JoC<6%5uz1xL;r z4TjRP4;{NK*;>pqzHl-R?|(yo3KyWsIdUf7xgQ=eNGAVl9GggL0+;3b)Lkh5IaIh7`L4DgJEax~AJ zGAaxQ&yd;w;$=^iOUQ5Vwk>kT%E_IuEe}68^IP15Q90a@af?xs0DVohX>KS;pOeTw z!o1%<1#PZ1!1Ueb2XeYSwfSUr?bi~*t!Uu7>&%&ABW=~CFJEx%fE2+ODS`-7@WWx{V#r!aQ_S7G=!28kwCby)UsuFa2Wfx~cM@iBRbsULl&p0m397kgJQ6+43ye=RP%8$xf8 z4>m8zz=#&zlh-~%&J6Fk18qafcY^2Q9nlJkjU0>Ms_xp(><~{!m=2vR#WC~7stF6F zqB8|S(%MDS&9?}GbVOj8nc9~FEw-+Yo)g6GbrSW4UMoDV{{jU^cfyj&Z;5v8n48d; zB??#VsOTvnsa&+C>T4QI-6JtltY>KlKsS71-hG8A%oI15*%3J$@ z2ev#|R;yL5OSS#-wvG~S%k33G3zW49xY0#nN(JTI8+IOXRdyl2#ps$hK{N)%*qxu> z4_&_(n9{aaERc!l&|{RbFzW1=gO*WUS3}m|EXr(an|yOQaU2A>S%qYVkxf;DMom*2 z=>J?%(GT3yG-6^sJQU=O)uU80OvmvQ5ir#_eVq$RzFy;9Cx6J_xi^8>rG&1Q+}RAd zo8#*g|1idT)at%{5qGIS$uWUpmm2S#4?Q$}EtfwQ>^Xw*+t4gJm>lxF@V2w$+N~1F3vrVe2h_2uBlb6nf1qe7M05Vb= zCg*W7zv-8snsoX{RocXTMNRuS|K+O>@MJ)IrP8AX&nKOBIB5Rs!+&1?SeN(X+;H+` zdaDV%l+h=Rm^sdeFNH9G4?8a1eC7yj_xL(CYwdriAp%_%IHMSLW{S~P&h0&3l`Q>* zs<75g7yxHyN)QcL3?|(jKeN`#>lEYvQQ6S=B~~oJ-6W3QUd4aS3WQT_PoTR%U#BkM>ewfmS*-? z#|)R@uVilQy!Y2&83lgXwVLBXPFXl*&k;%iQK?yZ@T~6s(^Gh(7cTI3zz6Glq|Tuz z*pZh_^69DX9pbb0RtlGQ#}9e!GOUAW{Jk}VXzDZw>Rf{IokTYlzX^XA61X5Nji%&- z!!cFA>18tx$+cYU9=_j`KU*rge(+X{*?( zq?0;p(yo%~U8|$B(D2%jH2|g*LIpLMLKXe}!$ZNxAi*#sV5Agc2|YQzYTE7avG@Ix zNST_3!`;)pIV6yoTJKAoTF*z}Nc2P@Z$qr!yZ&!)&|(l3f|N|{A;DB!W41|Sw)Vs$x~e<`2=cZ?yb{Pek8e6yQMI?`pY7k zDc$1~$B?H)oXoZms=doo{QfBW)$pB;Devq29SrB-m#$W`oZcZ5c#3+K2=sLwqnG}f zm-PV7g3uQQ)5YkmT@?|_BXfdzJ>GN3APxTBv-7SdOa$IT6II1i|G4bOjcAW+GCX~O zy-+b45BB2zD1AZ(%*ak=H7L0Hg+g zaw>&S8!=SyEo#Sb@(RZA&1g@WWA;8lG?gp0_$^Yr)@@9XI3g@k`_`R8a)8@v(54Zil+Qq(QeW!S*=)lRe%w?heAXNi*qOYJ>=SS5c$hQFvm0gm zD%&5X;!6EfaNN!@1(5G$rQMD&ZZM})jy6h8jzx97 zh1(E4hv~N(y>{dvb;cSH&2D{zIWITrmNsxUM6g1*OOa>g|7Oi6Gc?4i06?b6`gbe&8-T`UTlxytC)V9vZUyVWH4m!0i;i0k@r z!q{(JNj}u{KP=W$ufy2=Fo6lCc5}D91k+^Uf7A+4t9w>mtr*y77mV&`4HU1e&6!4P z4Ra@5d8r?@Jhd@k*v)gHZ)BXdS7kM4Uz6v**gj>nJ302`lYB^Zy> zDOU%e(Jk?7fclqS&`&$->q|Sf)9rbPo2juoz8Y1}68XK(tziUNkFc`aoLT65)qn4O zxV`OF&#%TN&sT-W|NZu)y~f-5(v|{$8auR-ye58sXbCokm;IYo4Fu(WH)i(m?NQXF9~%VDScK-`XgHWG54 zSedlwV=I)$}KCr6O#wqV-gAH-8-Ms8qUohpNUD;WLC}|Ub@m>UKs(zjF z=tA^+sV=jiYx$m~R?Cegn{-8%cyjl|Qu=F^kyChIOJlXB%czEt); zMmpIiK!YwRTRRHPn3eiMpM08`klq34(5yUg`7Whh1W6gF&Int|SKQI0H*1pD4_Tew z2u=bP@nd-b2K1d6o%i%DPA1n2TZuZpT3ld?u^7T{^U&{Vfh=e@%`N5MRj0R~(GYJ{ zd~OD=>8s?&PkEJPW%Buouf@J#v;$^OX88DdQ&Ty--|9V)zn$4@`Ha2>+TR;1d{C>O ziWE1?U{PD4OQhO$0fm#qQuN9>j~wC83K(KDK1)Vjl|xUjftJ-W8A0~4AW>*p?k|^b z%Eo^m{Lmfv7QptkJ&vg%&`di;vlY95I^<$A&8FD1WEJaksl$2(yu(IDHWGiy1OG;& znAxH8vGe=ceVqh;xqT7oW>6!PcdEVfF7t4m<=Ncg<60*Zh=6rYkeAI9Al$Vxtz9Eg zw@!dcW6AKUeS5dQSQY2hPMr7}PQLI-9gn|WT!Bhj zhyLaEGE=8{$4(p+`t4 z4t_`4K-+xj%kiBb46fJv7P|9g4;HT0m$h@Wk=$obR3c#@xXUD)*g;lg32&^QF?lp3 zTS@;SA%rPn6xJw@2l)w3{UI4En%a>^J+X#AX!B>*=j$NRqS^gHM!0;5=ej!9c~jCz ziRRz&=fWWM3`z=g4|pX_4RlwYh_>KUE#_J)iMWQEckKeHlIN(V6hXQP--}&Bd28+= zBP>?nzfO99bqC42F7ef^k6u(bZE<(Lx#E$_-_^%?fiI9O9fBk0C*pS-qSqk&Hj92m zlzLh`%}I?d>Uxz{nHj|Y>Kcs~r_WMgYj03W4K)95NWIAJ^NLB9PwAXaoFfKY4#t^{ zEf$XI9~A}1?Cv+C7i>|KbWyEGfN)gX$gTT?j+ZJCmsEXy?k`OrYc12)zH$}e>dldf^b-6NwneT+f_b8TP|qcIF|EJe+V~e&Caw+!*Eq% zOIu0PdCZYnRa=!l%kAWWNx|~qi0wDq$Do$}JA%9LchsHP`fVFFrXI4S;fV+vRnpKQ z)Wy=RP0xc3uO)uVWi^u_zmT~lb()<+mVLSeV-cg4tL0wWOoQIZp8jXMUa2+^<{#bViFqhPW!WQf zQ2kX@;_bX4TdAEgN1IT95z+Nt$D>!dNRft9A>9s3zveVk6hSHQPwz;re;$53PJrF~ zx19SWEox6giHufkB?xsxVzU)D>TZiZw2Zqz-JzA{M#%J%;x#H6en7CRVSql?)DBv$ z^^yci8&ohU#})Wcj>w`9X+030iyCzQx`{>m=Z^(hU4HJ(;=HDcFpZSX!R9Iu{htHD zOt@9ziebm;k%7Ltq^RXzfp=9Fl<$k^)v+Kp#l6jL`C|g~=tEaY%;md#Hp$wA-I&rR zj)nLcqnlC7EKkIO@6D}IPjUDw4{=uS+A;jPeWbBBH=SgSCPsfZC{6P0@l!$kFpzPX zGXBmS^-CiwUi!M7xAb-5{PoI^`9r;_4cuF2pKEGwV*%GFxC7Jwl>x$aIShSC5RliW zsJzDc2T4Ap1ty?Jh+YSl$13U;*S$lbmR?gl5NzlF3dJ-!%Y}s!@L-5+_hh-Vio0DM z`km(ytG`39yKrFWI{YxdhwAkZCGPWQ=w*Lk#h>RQ5gSciYzc}DLm4kZq5AOUn0rg& z0GK`V*7c=-bvpGdeE_CNXIwH}yY-BExc3~Ge*d=~1AHbouyrVHuSS>8`K-=)r%M!j+1~zs_+(WzC(p*i za0t~$bUKK(lKZfTyGq`NM=(!>Kmy}{;*MMV-&sI`Tcft1kpCXj&orDlL5GREXQZX>X^sQg_#{b!kr72+Iz# za@oO6+q^5LhvSYU{KiGndUuly+cs!Nr`s9bu0@4zg#9wHBh{h2VLM@d8$*kTgRHQ9?Rq#f z>(e?V-?RFmGhkL0ez3aXf;h+LQZcCoFsSB-Oo6`a8(W6&5UXWfoQY0;l>h zA5o8|!D+UH>Jmu_CDg)&qB@PU6r0;dBJkc#8-0-9(e}pEigC1Jd!xVa=#8{om$q#^ z)7mz5xwb#Yn+xb@<9EtMb!JB_5|qMIoUNMhtQ?>|ezE;#x4C9iz+3O){MwLM!pUpL zNqm{!#J6cOG;Y*ZYu_xh`xdX>GnC#~j|-`Jn)WyJfIBX?m!r;D9DE-B8hwiD&s2-| zS$%*XtOYC2s`x5Dtj4MQ6fILcS1bXelq$RUTl5-~)tKnxZJOh5vF$H@Tr|z&(X@_d z*EoJ@+k7kC8`Qi=MpM&j8g6gqxRt^SbuwiLWdE zw!l{47iOUI)j;!~x{nr35%bK`U=-iXg@6&#TxxMik$jX{-1&(kd`{*b}tV@C{h z!+2+^txR~~ZYTYbcwp=ZU&;^h^yhnL-bMyyhIUjo%{|bq!`kR>eHfbB0#kwJxRCN> zeFOo@lV|>=O4+7dvo@=8%{h}i+gI++kk{^a(2$?S{SIm=W((77*09UwS5Q-!#ZQ@N za5Af(YP0K|BDwU3eW^fSUg{5dS)OvzqSC}U7mSmcl0|K(X|Gf=_dTc3wV;u{g)EtD zu$Trgslf_BnL}YE(!|nidSxQ6@#^E>Yl|B*s{Q-aY99!T z4XYUDeRLbALs&JM7}?e@>gl=Hok}DuObck~x*YdS%*HrA=%%>vSgxFphpF;FO@;>n z^Z!h@a2rI%VYbi7^U*f$p15KYo}XKi^`I!HDEej64S#Gs?!EW2*@`{%OGF#5CNM*h zZE>oD=f}n-i9s}tDX)RY%sy_NF`e+Cv1@8F?7UKCBTtyBng9lIYej6aRlO+?9xDIfj>XW3kN@qeQtwIWoPxd~7Do z2$|sN6U%ekyU4o653iVr!)g~E2!Z2@UsBd^pi;dmT;;b?8!rGc3pdY1!z=EMc_QNL z3G z;qFnq8UNVWIcdgQrK*Hg049PQ9ociO!9ZiX$};KMtZFgM#amKOujGRhN{&6M?Px}X zZ0n^X4us-lbkYD<&8F2$OZ0-{m#N?P&ZvU@^Eb?r6~~L)Xuzlij3y;bXDGOZd77<+M=gwC5p!V&aeLY{TO+% zM;?vhA)^01T9dC_?}^89TX5ZYNxi)I@aYOBF;6 zng98h`GvQO3*7U!iyA^CR)vxVWm?ha=k&Z%n5b$8a{lt$M=7=f@_B6Y%imm6ne%gYE z-{EZ)$C3)GE2OH~Q+zoP2sz_eCTBorQqxy^N?=fxP`eOWqi23TQMR*RbFRZtVFPRC}OFj?+)#mU``Nr4Fk+}qXAVTxB z_Q)V^TAFp}iiqF$_TF46vDr8WM#?ZHGivY(c%@fMV*Wjp!aUO#={+^9mWu5Y{nG-F zNfo6a3pm-IpASd=e_=&5Os6JrVL`CIs{Ce17%lhEzSyOrB-Bc5b>rE>z zQ(0w!9WB~OGBiG~GF4>r#?6{+tjZPz;D$Ghg*M&^m(yLYUtsp4yFip*Xr23?G7STKiYg2@s#xhLvan}rU z$~@gejXz8YKw2ZHQzXQ}QnW|Vdik?^n5&c?qHEK#QSr3z_bS4lHJ&#kTEee7hJCMcT62aZaBS#2T zKpM2u4=g_lz4Fwev!n+HD!sv3D;xJm8!N2Chg5YaJXy#yr2)AWCDyKczQEe1K2Tm=$UiBro|55? z;&%(HU6=nWWz}_Fx25aiYAb;a8hdkL_Q94|H@cclkd*Xhul*GD)JRVv5@bz z6rD6s)A!yAz*%DHIJ;B6fsB^5eBjf1C>shJ} zuF$!5d~V9tI{gZV^5nvdKdXw|P(r?f1YXBLO-vl#se65tz?yBaI85Yq<~(ErOf=`_j(}oL zh{VjMbVbz2&5ePsTxD5Xk@&T^vHeC+g=>y@iY6k70@~{^nzy?A)gLA5DThJi@Rl?g zEFRu+9|01;1KeUarYa%}C7huXYD;W0hYX*A|0V7l|%3(FgI&>yzLl zk>sN(YCgTo2^AkCJy^ZRWuB(m6TY2Q@II9u?&E(Yi1ZN#qv>w207Rl3A<&|6DyUo& z>@9JYP>nsm2pUY*I6~kGBr*_{wnra82a;Limi(Nz4tAVW>6qbp{TE4!H{v?@-+z+b zf<8O$w`5`UBd`Bnw}J}2^t)>HvQ4X*$2UFm?OBLs z7bX)F)%$uPTNz@nSaCJgaT2t4GPRW#P=m%vr;7u;kA9149gmD!w1hXhWpcL;s zgZXBV2As)B2>Tt^rt&y$k9)mapwz`1BGT!TIrKuBV_}D7fNh;{}zZrH$8uHP_P^mieSO`K3VdrYL4&z~!Rrr7u zWH%7d$YgWmI+5p0G=M5j5JG4)?$h#gZ>ylPw)T%y%_!+~3GYdAuL#EyXFIKT>44}Y zsuy0cJ%c4SBQ8YiVib)DG2UH=R828;E6%PhFxe#9PB3#axd@V4qRQ5BTJzo2XehCmPhpkI7^r9)&FG8C4Nr35Osd zscpr6v>+VslN`*yDwFC@p0Mgd@;>Xd`RK9BZbJ@rRNz?tGYxe`rG;FF82a(lyYq#8 zEZ&TTy<$ZB%;Ol2)hBXnLsLn21u#zYy6gwlE`2D28Nj|fF!7}iJWAtJ;gP_s#n1kf zY*F_V|CEh2Dk@ZUFhR_Spr-#G*JE^{ruLCgo2Ypu!F@)+Rkln7O(G@PVK^N$Y)wCZ z>7VI1O^;!0(Ja9w3;Zq~95!EUzhUXJXmwOI;+&{5^9!d3VHYoSSn;l%!X-0! zDUlbf$6!+J33?niKmtOwgf>Ys?2ED{6LK<-%ro;OD^r@FQ#q@CuZ4GQQK3eqo(8q( z1MvWF(~&1wSSy`V5sf&3S%9fB9gK5&W0*yywV>VlMWW&U zs%9dnX@-qpU~3bLAJnXR4>UtkL19cKCq$w@K8*NKe);AN!-iV~#-cs@fm>q0an)*_ zz3=2|`7$L}>-`xabZ5Vg3R%wv*t;}YDALbLg}`+s`$SM<7{A=yB%*qN!RM+H6}!5G zYxV6M{o{B>js0QS1Pu41e>fVJU=)SwzNnd~@r$ptG@ zAvi7z;QKAAnpPE>XG3k+Fnp=QlP%#TkI7XF^>8p>lhN9=R+$d0s*Uup|w82tudd$*-}2kN9vi{y;#yFp$^yrb?%<+#JoqDwz|7A>2a^<`4R*2*e!@eW&zOe7{ zl+V}S#m6w8OXCC9gN7NJGHt~D-p3vfl$z&>-j-RuS$ z%+b%s9$6&vTe^_|%Gpv3Ru(hzjlzE&z_qF*n9T$u-(BR36Rh;D0-HVU9+C*U3$C%YZ$)q@`?UOdoM< z4xT-^HE=z0frhpZ0*a3mrg1pRqqPq@E90W^4fFo6=)#;G_?wExL`W)|=Jjr0t?W7V>E$gKb zhgD;PGMP5Ue`f7?+b!ik5gFdUjWX6yu>LS1UZ<5##)NeYb5F-s)}JOB#47kLx*?$c z%M)g+0EM6N0GX|F11)4IA<;GoCJuZRUIjL187db`=bhOF(O}r&h+_M|bf?ZqKCx;1 zr66pB`W7)w%*Vhjs(0$-uub$Yp4TNGUhxV>d=lY$4pKhCtAw`6uNSJeDd31H47An1 z6`KhnKpIUL2ksq3rXVZ;J0q_s^5||3HW3x)pk*ECT%(t$q|a0n_gACvQT&llBq|0_h+b8R*0(PIzs5T-s zq2t(O`8#=)VO54WZ$oEmLR}H#iLezI@38qY0A)I46G_T30ENJWKt}-xYVKTO2Tos6 z54?#9i_Cs6Ya<*XG{$KrK#({EcFA#nZAQC?CVxZ#6S7zw^Y{|J&bSdE@gPKHxO9}L z9t1=bQrymysOP8g63?N0M{mvgKZVdIJU4SE7MwA3@*DNe=7 zj>UGDvb?7gAA!>8rZo8M;&0d?A`(|~GjAvcsb}5``ayRL8iT%3G}(?23N$F@<0`_h zwVGSVC$%VB#83z97~4sZZQO#{)O4?ESEv`f@kLB;wpb(}q(=)zbOJ4;ZhT9u=t@9m zXmmpxb(9YBwRnDIfv;(P8-)X*{>-l~P+bJObnAQfwAeXd?Q>ax^eX8_eE;WsYbpXz z_4gUoS?4>kZ9-*gb3A}X7u+t-QHhqzhLzlo2WSZGBxha>hN+yNh}S7K=!nyD$_r5q z`x$s@xC=EZ-?d(2k?BrsybPEnqYT{Zj_5w&ZbBO%)_A6r0VutT6!hi(KBCU*y5TI? z9mSAaQ5(TAI)w1hR4VpSwHuItk&Ww!dtFTNxI28s<<4+~?wc<5bk>jjI?bh5ff3Aj z#CIm`o&OI20`I%L?6(2X75s|%{Czgu5GQtsaCvJXcr?K4k?M=!#&A4v)`h?^7#iZZ zH%R&bH+F%AMNZRiZv-9*BB#+&6>q881%pUw$f8)dT*jCU6{AEpP@Cbc*kSa=e335P zbc7W(ZPoOipnZcaMO&d7-K4TEy`;@30K{NJZxy5y#->g?)0VBP+pm%f62-w+S?$r~ zOBjpgJ--X|5J;TE860njH4is2FQ*LM3<1*^ zE|MIVgkdQik?vR{^U_wQb!8;=2Ae`QHAAn9baVr0hCoF&RUL8=SV0#P6P%ETsv<^F zD&u=&hb|-5Fbglg#Jk3Y!4_F!DuDAHo)0ld<3R;YOk4>xl?j20>?#}ciW_~tq`04W z6xbOp!Ob<9di;v$H`>M6=@9~meqco~RL+-(bfaplmENUoRk3C7;?dub;5#A zXul0R@5OPDrPUPX1-%ccxT*V@KnMXlFy66M@^R~$_r-G;NSUt-EG-VAx3X1l&Weph zVI#bA+@>*+rF~g2%~ubKg%-wwNTcejmRM!dvQ1Ojg-|%3h)?aGyw^Z@jP{?RW3>60 zmnh+eb2Uu1?MidX$L2Y(3pef?WR?%OY(Scse%4w9m+Ijxt9~x z*ldm0PcJ(jC=iN8#PPDWk()T6NO{_Q@1V=wz)E(zC5Z)J2_|vsD3m(nL=PUba#f_> zx-F(Lw?h?%7zH8i&++!h2t~-THz8~e*kb$iwT;{k9eivlyj>b9(e<{sSgxp4SI z#(MaXU~CG1E;BHW;1nVeMGG3u2=}-ms{*Dkjo%3am6NE%@`{T@@H-zOmPGS8mK;3T zajw1;OcwF%3@fOfoHh~bG1<&e%edSvP+n{#z~X)uBf&T#LNnMrS3;H*i4UGK7sOjw zW`m5-aR5#s-3&e}zA|QF6Vne5?L;y5fHKOhz(Hluz?>GC}|ox z#nv{*B#K|`AI8cauf|*3h@trW1g|*b?*7*Hi|x$@5-`@~nmO~*zs419A>K|NN&E4=aS`d%PJ3o)+1qTHX zWlY0@|DZ)~juph&t%9VDx!MB}k|KF^XBuq6uQ_7juq+%a z2S^7jV?9&A-~&Iqo|f&@j&ek_pnlL)!;fY6R(;3xm0wD5f1F%_Jeq$+K!N}RI2%=4 z1-d|+&YBb$F)o`S>Fd7T^l{1WPpP(m1uY#p9%4xW6c1mf)~KMQjA-$e(CdaXfnlk9 zmT;`BomUg4mxl&hhL6v=IT4nGK^O%SHx?>%^+kMW z6QAQ?dd4<^ol9#az5daBfZy2V4Q13> zJEH~BnlzIur*t?@)yyUbJTPn=TNxCoc>U}fGpGr8!V?8{a=+lLFp5eZ zP2Ju}9`Nit;=%|Ux0kj%<6hOULxm_{E;FWg&}of{!0Spk*r10nc-FKP8aRi&rts;s zw~?32yE*k@)zP%NNv9_mvEjh2$M4c~0N_KL%AQ0irWho{0Kw6`+g?RHBZ-^ANE>K~ zKH*8W>cS)@(ph)^YE9jY^;86%G7z56nOzbQk}&Vv`e_Du@uB8D*_nR-|KbGDGWwk_ZflB5GGSb*pZlC?8dILI!+4Ox+&lO46$%(yN1c zXNFnkAEh`vN>xR>WmiVtg!0J^p|9Sx(~zDc9ouvaUx`EYA)?ZYid8l{MWzf1mp7Ahkdc;(OrpaTXY|X;6xAk zT9}P=I%ZcKw->#i7$Hv94`5{!&VcBQIO(Qvo{VORkl;CdBBvH9iRAc5Glu&tJaa~y zkRZ-4d04`5gL_9tj;>*91Z#R0;2%@Ls;2{mo-!MAWWl;QV>sqOvOE<9Mx66ehx63&tnbmDf}Cn_@CGBC32S3^^m;_vx5vlkGF-K>!Qu;l0^^(=ZMi^LC$w zAi`MhL2{d1U163?wT4pVad4otDHS;hy(J3_fqVzTvw+`8{66cBnOPALDly82uqgmj z#2=sF(GIp;46O*j^-f5Cq5r@dopu*Lb$A^?F}`T!fQ2`>FIt$X`(=Hg6fs@CzS(lX z!-Ut0_Br^V6^xc*yeT? z1*hK^w~d|LX3JIf+z-~vz<|yW;_9Jg>_#eCM~?i#^BizVyWI$GaOon$QCBL0$)}Kw zr5)32NLzKveoEPhvsyw?+-+dA0(jpUNG@Df_Qe~8L^@-LPKB!f-@U3WtH7wsCtmmbMr)zz}uqPWKJHhaCcT?rgo+gJ1tR$xFsm>xcQcl zZ)HQ#2xC!j4-%Swx&#Th;0un!KyLfv_8S= z@<^HO%L$bUB+aB3iyx*>^p-e zF%}^%UvsFjU8>yBN7`_&6_F2rc0mRJ%^6=^7pN@9O6v_$X4HEfGL?k<1%GOI_P(yg zjc}`5!9+ic!(Hl8@dmV6MCW3x-p!q=sNC_zEAZl0ohYldPaCJf=ixJ-$e26M5O5hj zIERdBduWT?@bKng{0I<0s0PF$?dF#Ic=yF=rP5ui32|3{C#EA3 zD`uuKz0+-AP7+Tl7g&(u^v0bqNtdU{gITBs^0TR(H2P;MH7w{oxapa}xUEG7bbZ78 ziBwT`KD@;P%2aDn#KQW__sk!s^r-eBt$HY&W?vz*QLJeP2~omVx=>eL_-)%!jnz&q1X@ zbSGBgU~P1hTO23h=Q8NbhRTA-do1S=|Mf1R(`VOmPC_>iLV?}cV)#s|&|xQFd^Hjc zaplK&Om^vTB|{p_7S1~9<-nr_#Ik}@D5-ri!VOW`;ga49N= zLfiw|6z=|SL_)QXE)nJ;TGRe=-vJh?hTmJfQ)ce_J9wqv)S^cJ)<3A>kS(78jMHfY zsYYgIRSnS!cXWS?w+*m)iuZ(UX+crHp-W0ZWGfx`N)r~FP^PYBcC++a?Md~5`CQoS z$DEK0#vlC*NL!u60(F)Qwq_<-IOo?{r!~Qhc8ei8LZLEAK@KT+8>37ql$GJeWUL|z z!PLPHxT2#YXbi*S^kRI)>Ufh(bSHYS3id@Vv`m!~zy$na9e~~I9Thl=Hl#J8@F&{v zc(~ia6%!SRF553 z^j)VGl~lPJb6PsGe?8g3H%Zl8Frp};vM-{LdYN+X8L^fr%^CAl;fh5Ld>q)x;HFTo z{!YJ-bY>Y=46>AFGSAb!#O5?Ep%r>iE?) zk_{bKLexREd~S>)r0T@6dtQj=Qg=M6K2;s+>r5kcoF0`A=~;0KGDIBEqJ;um?McnY_a<5SQ~~RjmAiDO`aSlir=wbHpsXV6Ge8C66Kqmv z+Iy4TgK}BJ5Uc1b7nYAAGaO~4l<&Ez`YuHCS`!nl!SeCV{4>ahFc8^cM*|HIuMR45o!UivLm7rLutUCq z?aeK+m@3S#jR8B~a5x&1bvo?O_yp)!5jDYh(=)zQm@TbFPPPN0W?~HN1ZVHSeHAb1 zce12LE5Y9OY<|M)QxF7lL^6w303a)OI=rAE%Vh!)2DMkvhZ7(k8WbxcKYL}smK)_0 zGArT5<*c_V=M6Ti!|b|q(HU88n>CDA{f5c$gqkfx8V5Fefjw)$CRX*knODJr(3miI zZJBMO?I)_&SQO*7GxiM#wz=`U@i`VU(qr5Gs4$5I$-H_ISXr)#)d750sbc9}!nS*c zEa;*dNEeQf?tTeyp(b;R2uGf2AKr))hN7*xca+^o{Vqb>$@JvNUN2MTuNDU&tkYu+ zDK?TG4*^mNcuqeYRbGj$zJ!8Eg$BIGQwcB%zpCM>Qa=!Cwv)osZOaI3S}gb=VU@LN*|pv7BM1P1Wwl*cj?fkqCG9z zzI44@sdlUb*j87AIr4Tk3E++7*7u4jbA4hFfu5SJIpZLzt@)%2ki@L6_2|H+nkJ=}$Xgbsf9r8Jh*dH=k(WbUVOFP!7x|9vL)&PIXw}oIqQ~pB3!a4VI$%EE zmt&cVY9g;IMEQIiTjOp*aJMsTjeGe>oIj$$i=^uSdg@p2J8ELZA5rY{b2;t7sRdYB zf%lN#E_lh?f#R4^^PHkNMoTl+>zaSbvDaZKlWOQuaw$yTgel8PXT~FrYMcpU2o$_3 z<};!pIoHF+*)Itbx@yqa+w{coIMox$q07`~w8M zVU3(P-sP{w`I&;u*KX-p=7w<3^b&7c>oQfJ`U&BAvXg zgrvpX!etPCP`4sGESH{QXF$7l#6p=9DeZbzPNP~3ofWe zUjm~YZZcsz3aH5Zg3tnJ3I@-@vo^d>F;UiO!7E(~7TDmL#k|1~J$pO4*Q{6BjIAbg zDAmaD#)G1P!#**!5}kgQq_~L?$T7|%X@DKuZ})|4Ksb?V*niJ%-LQmg7vX*5GBW&Q z6;WJd?MdMaFY8nG%sboR8#7_l9%-1q@347o7+}=<^7Pa=#Ks{eZ-QBuu92!NZpeeJ?MkYCXS4@oE)BG1b z&N#7HPdF7$dQA|`VEQJDSZ6%A7lMC(RWsP5QGoQ02jlJ&yOWh41pu>a2@5pS$6rCp~bA9?yPwnGpdmas%L$+v2wsrQL znDtT)wJO(x<;~|-Uq-wmM!3^>8O#Bso!@qS0dMdsV_C*!?78G{NCLYMiPX)A;}8gQ zTK#r-o;v%+jao0W1iku1iA1iiw~8$y(GiJyty$Ngd;9V0#^GUO@AxN%XJ6Oi=grN= z$x$;te$}*I61I1<;D9P`Jl~=0jn}oP`DU|ua2&sW)!d8sQTyv{>JB1eQ2y<` z`1RrT@%G+Jt`EK#4!2*vI*woM?`$;>*J8c)NKN9~|!gxV;sQsnj^4 zUYFw6+sCi=Pmb+8U~G-OpQ0bO_qM8WbDJw_zBxE-9%1-2u^N^-*@3`@NduN-Pg!70O+sAv<1W#QRO{P7V+DkDB1^Ux5o->xkjTKkc7D zK0)K&*$O5F6V;5jnlGB0$J;;B>QYW>=ICU%8OeMf9rFb3?8JM`P3kX79W@Vs+}`AQ zIBXs?whv==lW};6TK4zks{E#g#iI?^{1IE=WN!zfJ#7BcZn_b~_0@tV6u z9ia({utZyp-Nwu2k+%uBY4s;kjgJnRo7;Gx_q6qBt#_z<(dIrKqQ9PC6)8b0i5s+> zr~&&>mMq2*#9rGodxYB7V`-Oj-nBis|KgqfBi?LVjpIhlJ*MyHP0Ae|Huq@0_&7B- zH%|`fXdwqmP;ZV-=&)_?$)aEb@L}FQ+_L8h^BlcsZ10>LnmuM`kXqiSDMXdL*W7{} z?Y}stbI@F<@*aq{UqnYIo3C{BP^rIguV^WrHz`|V>&I!v9JBqBwn{jThAR+eHb0lj=^kAo@&Lh~_R2tAhL~2<#lH&3+bYf}Dc%83c zX2&wAAP6;Xi2}=H!ovudq*XDl=_lg#t2#?sbdS@r1>^75+6U109PHg#8$6bQcw`{RxZ8<$aZuuJNNF zL9wOk3)+^KF<}{rD5#24CHC3yJ=Ya_WB(IWUB0IlOk8cjv%Z&h)%T&LK7&2CZY_<1 zttNPPT}_IuOWzrrL>w={15nYIw5ks&zcCMx*gG+~bw$#-f(d`2DezZ%G#AhTM05HSf<6L>Z2lye68vw^{qPpPCs3Sh~2i z4T*bf*8zrKDJwy#W`H>!=P!oYMTO3mQ=&iz;kpq({9Ql0$QP_O9yRe7j*xap6Poqn zS4r!gdT#ua=%v9BfOgmMEkUlV|9v%Hq04#L=^~H>B0uPhDnc6M9b@AEBW*Qs_L5P> zdiIuSVAjCgm+&$V_;~SOH)-@!ywpV?+0Dyt za)meB<=pL7SuUk?74&zH}a&zH}a&zH}a&zH}a&zH}a&zH}a&zH}a&zH}a&zH}a d&zH}a&zH}a&zH}a&;P5R{~sX(I*kCxUjQ00#lHXm diff --git a/src/tools/taglib/taglib-1.5/tmp/.keepme b/src/tools/taglib/taglib-1.5/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/tools/taglib/taglib-1.5/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/bin/autogen.sh b/src/tools/xmlrpc++/xmlrpc++-20040713/bin/autogen.sh deleted file mode 100755 index f064bcfde..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/bin/autogen.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author$ -# Version : $Revision$ -# Location : $URL$ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this to set up the build system: configure, makefiles, etc. -# (based on the version in enlightenment's cvs) -#------------------------------------------------------------------------------- - -package="xmlrpc++" - -# assume we're in $basedir/bin -reldir=`dirname $0`/.. -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. -usrdir=`cd $basedir/../../../../usr; pwd;` - -bindir=$basedir/bin -etcdir=$basedir/etc -tmpdir=$basedir/tmp - -cd "$tmpdir" -DIE=0 - -(autoheader --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -echo "Generating configuration files for $package, please wait...." - -configure_ac=${etcdir}/configure.ac -configure=${tmpdir}/configure -aclocal_m4=${tmpdir}/aclocal.m4 - -# copy over configure.ac and acinlclude.m4 from etc to tmp, -# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to -# look for configure.ac in the current directory, and include acinclude.m4 -# in aclocal.m4 it without a directory path in front -#ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" -#echo " aclocal $ACLOCAL_FLAGS" -#cp -f ${configure_ac} ${tmpdir} -#cp -f ${etcdir}/acinclude.m4 ${tmpdir} -#aclocal $ACLOCAL_FLAGS - -#echo " autoheader ${configure_ac}" -#autoheader ${configure_ac} - -echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" -autoconf -I ${tmpdir} -o ${configure} ${configure_ac} - diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/bin/prepare.sh b/src/tools/xmlrpc++/xmlrpc++-20040713/bin/prepare.sh deleted file mode 100755 index d7975bfa3..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/bin/prepare.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author$ -# Version : $Revision$ -# Location : $URL$ -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# Run this script to prepare xmlrpc++ to be configured and compiled. -# For more information on xmlrpc++, see http://xmlrpcpp.sourceforge.net/ -#------------------------------------------------------------------------------- -product=xmlrpc++-20040713 - -reldir=`dirname $0`/.. -basedir=`cd ${reldir}; pwd;` -bindir=${basedir}/bin -etcdir=${basedir}/etc -tmpdir=${basedir}/tmp - -tar=$basedir/src/$product.tar.gz - -mkdir -p ${tmpdir} - -cd ${tmpdir} -if [ ! -d xmlrpc++ ]; then - tar xfz ${tar} - cd xmlrpc++ - # see http://sourceforge.net/tracker/index.php?func=detail&aid=990356&group_id=70654&atid=528555 - patch -p1 < $etcdir/xmlrpc++-automake.patch - # see http://sourceforge.net/tracker/index.php?func=detail&aid=990676&group_id=70654&atid=528555 - patch -p1 < $etcdir/uninitialised_XmlRpcSource_ssl_ssl.patch - # see http://sourceforge.net/tracker/?group_id=70654&atid=528555&func=detail&aid=1085119 - patch -p1 < $etcdir/incorrect_XmlRpcValue_struct_tm_conversion.patch -fi - diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/configure b/src/tools/xmlrpc++/xmlrpc++-20040713/configure deleted file mode 100755 index 368737222..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/configure +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.campware.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Run this script to configure the environment. -# -# This script in effect calls the real automake / autoconf configure script -#------------------------------------------------------------------------------- - -# assume we're in $basedir -reldir=`dirname $0` -basedir=`cd $reldir; pwd;` -test -z "$basedir" && basedir=. - -bindir=$basedir/bin -tmpdir=$basedir/tmp - - -autogen=$bindir/autogen.sh -configure=$tmpdir/configure - -if [ ! -x $configure ]; then - (cd $basedir && $autogen $*) -fi - -(cd $tmpdir && $configure $*) - diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/Makefile.in b/src/tools/xmlrpc++/xmlrpc++-20040713/etc/Makefile.in deleted file mode 100644 index 778068d3c..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/Makefile.in +++ /dev/null @@ -1,78 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# To report bugs, send an e-mail to bugs@campware.org -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# Author : $Author$ -# Version : $Revision$ -# Location : $URL$ -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# General command definitions -#------------------------------------------------------------------------------- -MKDIR = mkdir -p -RM = rm -f -RMDIR = rm -rf -DOXYGEN = doxygen -DOXYTAG = doxytag -XSLTPROC = xsltproc -ECHO = @echo -FLAWFINDER = flawfinder - - -#------------------------------------------------------------------------------- -# Basic directory and file definitions -#------------------------------------------------------------------------------- -BASE_DIR = . -BIN_DIR = ${BASE_DIR}/bin -DOC_DIR = ${BASE_DIR}/doc -DOXYGEN_DIR = ${DOC_DIR}/doxygen -COVERAGE_DIR = ${DOC_DIR}/coverage -ETC_DIR = ${BASE_DIR}/etc -TMP_DIR = ${BASE_DIR}/tmp - -XMLRPCXX_VERSION = xmlrpc++-20040713 -XMLRPCXX_DIR = ${TMP_DIR}/xmlrpc++ - - -#------------------------------------------------------------------------------- -# Targets -#------------------------------------------------------------------------------- -all: ${TMP_DIR}/all.stamp -${TMP_DIR}/all.stamp: - ${MAKE} -C ${XMLRPCXX_DIR} - touch ${TMP_DIR}/all.stamp - -install: all ${TMP_DIR}/install.stamp -${TMP_DIR}/install.stamp: - ${MAKE} -C ${XMLRPCXX_DIR} install - touch ${TMP_DIR}/install.stamp - -clean: - ${MAKE} -C ${XMLRPCXX_DIR} clean - ${RM} ${TMP_DIR}/*.stamp - -distclean: - ${RMDIR} ${XMLRPCXX_DIR} - ${RMDIR} ${TMP_DIR}/auto* ${TMP_DIR}/config* ${TMP_DIR}/install-sh - ${RM} ${TMP_DIR}/depcomp ${TMP_DIR}/ltmain.sh ${TMP_DIR}/missing - ${RM} ${TMP_DIR}/*.stamp - diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/configure.ac b/src/tools/xmlrpc++/xmlrpc++-20040713/etc/configure.ac deleted file mode 100644 index 9bf367a8b..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/configure.ac +++ /dev/null @@ -1,55 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl To report bugs, send an e-mail to bugs@campware.org -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl -dnl Author : $Author$ -dnl Version : $Revision$ -dnl Location : $URL$ -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(xmlrpc++, 20040713, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../src/xmlrpc++-20040713.tar.gz) - - -dnl untar the sources before anything happens -../bin/prepare.sh - -dnl generate autoconf environment -cd ../tmp/xmlrpc++ -sh autogen.sh --prefix=$prefix -cd - - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() - diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/incorrect_XmlRpcValue_struct_tm_conversion.patch b/src/tools/xmlrpc++/xmlrpc++-20040713/etc/incorrect_XmlRpcValue_struct_tm_conversion.patch deleted file mode 100644 index f0fc4cbf1..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/incorrect_XmlRpcValue_struct_tm_conversion.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff -Nur xmlrpc++/src/XmlRpcValue.cpp x/src/XmlRpcValue.cpp ---- xmlrpc++/src/XmlRpcValue.cpp 2003-06-06 20:13:28.000000000 +0200 -+++ x/src/XmlRpcValue.cpp 2004-12-13 21:02:39.505001617 +0100 -@@ -390,6 +390,7 @@ - return false; - - t.tm_year -= 1900; -+ t.tm_mon -= 1; - t.tm_isdst = -1; - _type = TypeDateTime; - _value.asTime = new struct tm(t); -@@ -402,7 +403,7 @@ - struct tm* t = _value.asTime; - char buf[20]; - snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", -- 1900+t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); -+ 1900+t->tm_year,1+t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); - buf[sizeof(buf)-1] = 0; - - std::string xml = VALUE_TAG; -@@ -553,8 +554,8 @@ - { - struct tm* t = _value.asTime; - char buf[20]; -- snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d", -- t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); -+ snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", -+ 1900+t->tm_year,1+t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); - buf[sizeof(buf)-1] = 0; - os << buf; - break; diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/uninitialised_XmlRpcSource_ssl_ssl.patch b/src/tools/xmlrpc++/xmlrpc++-20040713/etc/uninitialised_XmlRpcSource_ssl_ssl.patch deleted file mode 100644 index 4c2faa6f6..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/uninitialised_XmlRpcSource_ssl_ssl.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Nur xmlrpc++/src/XmlRpcSource.cpp x/src/XmlRpcSource.cpp ---- xmlrpc++/src/XmlRpcSource.cpp 2004-04-13 22:21:59.000000000 +0700 -+++ x/src/XmlRpcSource.cpp 2004-07-14 12:26:28.227768848 +0700 -@@ -9,6 +9,7 @@ - XmlRpcSource::XmlRpcSource(int fd /*= -1*/, bool deleteOnClose /*= false*/) - : _fd(fd), _deleteOnClose(deleteOnClose), _keepOpen(false) - { -+ _ssl_ssl = NULL; - } - - XmlRpcSource::~XmlRpcSource() diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/xmlrpc++-automake.patch b/src/tools/xmlrpc++/xmlrpc++-20040713/etc/xmlrpc++-automake.patch deleted file mode 100644 index 14de32d39..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/etc/xmlrpc++-automake.patch +++ /dev/null @@ -1,252 +0,0 @@ -diff -Naur xmlrpc++/Makefile xmlrpc++-automake/Makefile ---- xmlrpc++/Makefile 2004-04-19 20:53:00.000000000 +0700 -+++ xmlrpc++-automake/Makefile 1970-01-01 07:00:00.000000000 +0700 -@@ -1,71 +0,0 @@ --# makefile written for gnu make --CXX = g++ --SRC = ./src --SHARED = -shared --CPPFLAGS = -I$(SRC) --DEBUG = -g --OPTIMIZE = -O2 --GCCWARN = -Wall -Wstrict-prototypes --CXXFLAGS = $(DEBUG) $(GCCWARN) $(OPTIMIZE) $(INCLUDES) --VERSION = 0.8 -- --DESTDIR = --prefix = /usr --MKDIR = mkdir -p --CP = cp --LN = ln -s -- --LIB = ./libXmlRpc.a --LIBALT = ./libxmlrpc++.a --SO = ./libxmlrpc++.so.$(VERSION) -- --# Add your system-dependent network libs here. These are --# only used to build the tests (your application will need them too). --# Linux: none --# Solaris: -lsocket -lnsl --#SYSTEMLIBS = -lsocket -lnsl --SYSTEMLIBS = --LDLIBS = $(LIB) $(SYSTEMLIBS) -- --OBJ = $(SRC)/XmlRpcClient.o $(SRC)/XmlRpcDispatch.o \ -- $(SRC)/XmlRpcServer.o $(SRC)/XmlRpcServerConnection.o \ -- $(SRC)/XmlRpcServerMethod.o $(SRC)/XmlRpcSocket.o $(SRC)/XmlRpcSource.o \ -- $(SRC)/XmlRpcUtil.o $(SRC)/XmlRpcValue.o -- --all: $(LIB) $(SO) tests -- --$(LIB): $(OBJ) -- $(AR) $(ARFLAGS) $(LIB) $(OBJ) -- cp $(LIB) $(LIBALT) -- --$(SO): $(OBJ) -- $(CXX) -o $(SO) $(SHARED) $(OBJ) -- -- --tests: $(LIB) -- cd test && $(MAKE) CXX=$(CXX) CXXFLAGS="$(CXXFLAGS)" SYSTEMLIBS="$(SYSTEMLIBS)" -- --doc doxygen: -- cd src && doxygen Doxyfile -- --distclean: clean -- --clean: -- rm -f $(SRC)/*.o -- rm -f $(SRC)/*~ -- rm -f $(LIB) $(LIBALT) $(SO) -- rm -f build -- cd test && $(MAKE) clean -- --install: -- $(MKDIR) $(DESTDIR)$(prefix)/lib -- $(CP) $(SO) $(LIB) $(DESTDIR)$(prefix)/lib -- $(MKDIR) $(DESTDIR)$(prefix)/include -- $(CP) src/*.h $(DESTDIR)$(prefix)/include -- ( cd $(DESTDIR)$(prefix)/lib; rm -f libxmlrpc++.so; $(LN) $(SO) libxmlrpc++.so ) -- # Does not install tests right now -- --# Debian package make target, in case you want to manually build a package --# from the distribution. --deb: -- dpkg-buildpackage -rfakeroot -diff -Naur xmlrpc++/Makefile.am xmlrpc++-automake/Makefile.am ---- xmlrpc++/Makefile.am 1970-01-01 07:00:00.000000000 +0700 -+++ xmlrpc++-automake/Makefile.am 2004-07-26 11:54:16.610066768 +0700 -@@ -0,0 +1,17 @@ -+SUBDIRS = src -+ -+EXTRA_DIST = README.html -+ -+DOC_DIR=@datadir@/doc/xmlrpc++ -+ -+doc: -+ cd src && doxygen Doxyfile -+ -+install-data-local: doc -+ $(mkinstalldirs) $(DOC_DIR); \ -+ for i in doc/html/*; do \ -+ if test -r "$$i"; then \ -+ fn=`basename $$i` \ -+ $(INSTALL_DATA) $$i $(DOC_DIR)/$$fn; \ -+ fi; \ -+ done -diff -Naur xmlrpc++/autogen.sh xmlrpc++-automake/autogen.sh ---- xmlrpc++/autogen.sh 1970-01-01 07:00:00.000000000 +0700 -+++ xmlrpc++-automake/autogen.sh 2004-07-26 11:54:11.578831632 +0700 -@@ -0,0 +1,69 @@ -+#!/bin/sh -+# Run this to set up the build system: configure, makefiles, etc. -+# (based on the version in enlightenment's cvs) -+ -+package="xmlrpc++" -+ -+srcdir=`dirname $0` -+test -z "$srcdir" && srcdir=. -+ -+cd "$srcdir" -+DIE=0 -+ -+(autoheader --version) < /dev/null > /dev/null 2>&1 || { -+ echo -+ echo "You must have autoconf installed to compile $package." -+ echo "Download the appropriate package for your distribution," -+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" -+ DIE=1 -+} -+ -+(autoconf --version) < /dev/null > /dev/null 2>&1 || { -+ echo -+ echo "You must have autoconf installed to compile $package." -+ echo "Download the appropriate package for your distribution," -+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" -+ DIE=1 -+} -+ -+(automake --version) < /dev/null > /dev/null 2>&1 || { -+ echo -+ echo "You must have automake installed to compile $package." -+ echo "Download the appropriate package for your system," -+ echo "or get the source from one of the GNU ftp sites" -+ echo "listed in http://www.gnu.org/order/ftp.html" -+ DIE=1 -+} -+ -+(libtool --help) < /dev/null > /dev/null 2>&1 || { -+ echo -+ echo "You must have libtool installed to compile $package." -+ echo "Download the appropriate package for your system," -+ echo "or get the source from one of the GNU ftp sites" -+ echo "listed in http://www.gnu.org/order/ftp.html" -+ DIE=1 -+} -+ -+if test "$DIE" -eq 1; then -+ exit 1 -+fi -+ -+if test -z "$*"; then -+ echo "I am going to run ./configure with no arguments - if you wish " -+ echo "to pass any to it, please specify them on the $0 command line." -+fi -+ -+echo "Generating configuration files for $package, please wait...." -+ -+echo " aclocal $ACLOCAL_FLAGS" -+aclocal $ACLOCAL_FLAGS -+echo " autoheader" -+autoheader -+echo " libtoolize --automake" -+libtoolize --automake -+echo " automake --add-missing --foreign $AUTOMAKE_FLAGS" -+automake --add-missing --foreign $AUTOMAKE_FLAGS -+echo " autoconf" -+autoconf -+ -+$srcdir/configure "$@" && echo -diff -Naur xmlrpc++/configure.in xmlrpc++-automake/configure.in ---- xmlrpc++/configure.in 1970-01-01 07:00:00.000000000 +0700 -+++ xmlrpc++-automake/configure.in 2004-07-26 11:54:11.578831632 +0700 -@@ -0,0 +1,40 @@ -+dnl Process this file with autoconf to produce a configure script. -+AC_INIT(src/XmlRpc.h) -+ -+XMLRPC_MAJOR_VERSION=0 -+XMLRPC_MINOR_VERSION=8 -+XMLRPC_MICRO_VERSION=0 -+ -+#shared library versioning -+XMLRPC_INTERFACE_AGE=0 # increment if interfaces have been added, -+ # zero if interfaces have changed or been removed -+XMLRPC_BINARY_AGE=0 # increment if binary-compatability is broken -+ -+XMLRPC_VERSION=$XMLRPC_MAJOR_VERSION.$XMLRPC_MINOR_VERSION.$XMLRPC_MICRO_VERSION -+ -+LT_RELEASE=$XMLRPC_MAJOR_VERSION.$XMLRPC_MINOR_VERSION -+LT_CURRENT=`expr $XMLRPC_MICRO_VERSION - $XMLRPC_INTERFACE_AGE` -+LT_REVISION=$XMLRPC_INTERFACE_AGE -+LT_AGE=`expr $XMLRPC_BINARY_AGE - $XMLRPC_INTERFACE_AGE` -+ -+AC_SUBST(LT_RELEASE) -+AC_SUBST(LT_CURRENT) -+AC_SUBST(LT_REVISION) -+AC_SUBST(LT_AGE) -+AC_SUBST(XMLRPC_VERSION) -+ -+AM_INIT_AUTOMAKE(libxmlrpc++,$XMLRPC_VERSION) -+ -+AM_CONFIG_HEADER(configure.h) -+ -+AC_PROG_CXX -+AC_PROG_INSTALL -+AC_PROG_LIBTOOL -+ -+dnl AC_STDC_HEADERS -+AC_CHECK_LIB( socket, socket) -+AC_CHECK_LIB( nsl, gethostbyname) -+AC_CHECK_LIB( ssl, SSL_connect) -+ -+AC_OUTPUT(Makefile src/Makefile) -+ -diff -Naur xmlrpc++/src/Makefile.am xmlrpc++-automake/src/Makefile.am ---- xmlrpc++/src/Makefile.am 1970-01-01 07:00:00.000000000 +0700 -+++ xmlrpc++-automake/src/Makefile.am 2004-07-26 11:54:11.578831632 +0700 -@@ -0,0 +1,35 @@ -+lib_LTLIBRARIES = libxmlrpc++.la -+ -+libxmlrpc___la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -+ -+library_includedir=$(includedir) -+library_include_HEADERS = XmlRpc.h \ -+ XmlRpcServer.h \ -+ XmlRpcSocket.h \ -+ XmlRpcValue.h \ -+ XmlRpcClient.h \ -+ XmlRpcServerConnection.h \ -+ XmlRpcSource.h \ -+ XmlRpcDispatch.h \ -+ XmlRpcServerMethod.h \ -+ XmlRpcUtil.h \ -+ XmlRpcThreadedServer.h \ -+ XmlRpcException.h \ -+ XmlRpcMutex.h \ -+ XmlRpcThread.h -+ -+libxmlrpc___la_SOURCES = $(library_include_HEADERS) \ -+ base64.h \ -+ XmlRpcClient.cpp \ -+ XmlRpcServerConnection.cpp \ -+ XmlRpcSource.cpp \ -+ XmlRpcDispatch.cpp \ -+ XmlRpcServerMethod.cpp \ -+ XmlRpcUtil.cpp \ -+ XmlRpcServer.cpp \ -+ XmlRpcSocket.cpp \ -+ XmlRpcValue.cpp \ -+ XmlRpcThreadedServer.cpp \ -+ XmlRpcMutex.cpp\ -+ XmlRpcThread.cpp -+ diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/src/xmlrpc++-20040713.tar.gz b/src/tools/xmlrpc++/xmlrpc++-20040713/src/xmlrpc++-20040713.tar.gz deleted file mode 100644 index 0ee92274a5c652743fe4292b31f349e37a894ad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73013 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 diff --git a/src/tools/xmlrpc++/xmlrpc++-20040713/tmp/.keepme b/src/tools/xmlrpc++/xmlrpc++-20040713/tmp/.keepme deleted file mode 100644 index e0808fa16..000000000 --- a/src/tools/xmlrpc++/xmlrpc++-20040713/tmp/.keepme +++ /dev/null @@ -1 +0,0 @@ -keep me

        >nENtc-+dNIEZyB~a9<03clGmrAbyJM5= z65JFhsOdn}2$~eQ5u~!KZ^8d!GAL3>sViT8Ng+{mf%U~?3DDV&iNaf-3ISYr~dl~TYrFr+)yVGZaT)S#fDnLvteMF#~7J;tVYdmQZm1WRn! z?|t#6l$s7^QCPksrmK6EIvzv_OepzK){f%~Q4pv;LXxX7m=ahbA#yH&g`B(NQH-`b z7z{W~H?1o=U~<~-JECRqLOX^H+=!0IKuQkJ{#JD)Z8lE>s_}Zq&k}lp(c(3US$4Oe z2Y`|qI}QxM6?Ad$C%yn}5q_{frNytSkYY#aX63iapi^OC;_!PK63u5&z8m<~J(O+7 zMCF^rj{}F(V|6`;S=3^^c$Nzqj@ZM{#gResO9t#i!g7&yG=KPgcn)vJO@TQ8iS9hC z=V6K6%Uj>AveqIaZgsgjIzVokO`Tz66WyqG_~$EdF_ia^C>=*id=E4 z^1DmDRVQ%}b*u&Ho_w{XXou9FcGCc&QOUvB{jzd&{`?-t%|KQ#_d{W>V0_eIKV(6} zh-~(Lel=%nXkAlA(>A~K`0J63=WEZ|*4Ozo8<$>)m5OY=Q)z?Vzxlk_t-mT=7dKe4 zZrk*GCZhNG>mq8Mr7-*jD*#h4SA6`|?&JQh2Tksknq0=s&zJjP=YUEKC`*gG-K7Iu zlbM1!c4Pfh3%MQnPP=(K6ww{gNuUgrc#>~b+7(mmeviNXg#Qio!1^5tGn2a==X4hC z{=8W83NK&R%J!I(Ivz96C&re76N2sU`AA{D37DT{>5k*sQlG>fD?c=yb>)74@Ps0S ztS9Yg9{cI#rA0Jp&hFzz)gU@3=}s<^^JQjJW|K*VP_xe$RpWcfxEyW%-> zU@!9bqXkYczZg1EvWi!Mv3E=)t?V-t_6R(AxP9nC&5(>D1)(Jz^+m+e)^SGId=z) z(1=Pq$cyHwTkW~tll$&DG7)lBd|*5%M!kwQJHni)7jw;MpZI0YW7>R^rdYVW+BYa+DV-Ce`^BN*|QR}Dg zQuBi{a^uG6pdpuu)G6Xe$+M?G5JBp1gAE@XNwk(5Co~8=k^xEI?MAsC4grRE$;j*< zK7a;apj05z&E4!-Ek<{}N@0UEs^``AiP{jd)D7WhmfOweM85Fg%gXH*;(>->H<-#5 z5T>xl(*V8u9vRMOocT?}mqsTg_0$tioGmrG8?*}XpR|h6ed6+o;j7a>JP>^5 z>F(O|qFBFEyiyBMQQ!nDk-`3Q#?Ix%EmEz(4o3I#aTmhCOw0M#w$$g0IVS^Uxw<8dT9f%lUFZ0wj!2PLIUk; z4uY8A4HXWxv}M&v10cK^^6dkqe7PvSdY)J?g2;Eil_~WOPl)%^YIw+k~=rIfxNB`*ZEDacmKjU@X zxug2gRLC103Dq)xym`cTzVLdzPBYcA=Im)18HE#={db+io6ph|>E&w+Xwr_b_w!er zpmi0_a8Csgi6B1z)gQBcLmv`323(ZpHs-%Tf5hoiMmDV}ozr52H ztDFn6yWPuA5g{lp4Zav3au!0F5X+Fsmx^2{$*q088aO6n(}nspH5}SeJ{*Jf%w*n) z{Cyw4YYG-E?=G#HsdDZG!6K?IvDBw3S4duXs}gbS9FG5K_ftM%9`O#w2-*!7J9XWq z`{D(UJScTH=Df-}l~i}*=}TvAS9(*t3<_>=)*1T&qRv{=s2~ibh57q_J2me}bI2Bx zwntUrDZy=Thcy7a8wHt-TVp{ILA5q}tZlrGlnT@uHDdMhJxwXwyz*JPmzAf-@%y2H z&%YhVhbKFa|DGR2JacfhpPgg*bUyy|2=}jb-}T<{Z@W;J3(FuG7s8=en5iRa`zxZ) z49Cr~G!EUc%LKhFP^5EcPtT^M{{6q@?Ue@>9FnallY@2w}oUbx|_eh z+tLI>1b@cyMjicrSG|r~;LYDpA4;9r{D-8EW>&3`=ol^tE{GkD7Pq|4pHlPr~tOuj9@ zHnX6W8ssRmwOP?C(eYXoJ~tni$&F0h+@ztd-$mcD-{oFzwPm3w2&LCcAjm%`pu@#@5l$?s+qci9WTsYOi!23NvcyF!nf@`+1DQL5%r>!MwnesDAI$T zwcAV@$aFGwS`HFma)+%&W80ncg0}OyO_ydIN9plHF)fjNJ{c&9hA4SHY1PYuo)d5? zu5~U32dvFVMi;i~+4V@>=oin> zR??s+ZhDlqe&6+=MeBkvBTJ+6J3-N&SM5cv6ZHg)`2F|cyb0eZrRr?3Wyr4lAXi>* zohBX`pjX>4V;^l7=X0oMo!u~p%Zs`q&3VyiPa+CCjn?naKXVXt%gqYg4(#LHRChns zKD+2(TF{(VBVAQ*9N*4Fp0kaEx|DIBw%+_)|Ev&G$z7`xNl2vUxo1k<8~C3;_oaq1 zF>MXdS8XV?eX28m`xu#F_kG;;7jEkXL9ay>U_PAq!l ztn?TnZ5uS;m;WkqY21#Bk6quSmXLPMm9$?qe%6Hp0cx=}+MnWtA+GN?^Lr`h_vFLm z0^^sh#)48W4`5_4!(I7Z^!59%OERw0;|s2zxHh9+9yxv~CzF5&Dz`U(HS;v=kUKsf z%u5=HNs)gts^ikziIDXsFTf!75Da9`!F!p9E-a z^E9mQP%0lvzkO6krNkoJgO|vb@oqIm>`WeSq+YnLtgvG=ICaJ{vC9PP!pE4 ztL1`!9?6kfJwF8Vx_lLWr zMi;y9zlmb@`p$nQIbfpR@)YsxQGSCH0KlQ`GK3Wc90$bhRVFlPZhP+^Mhoz7_Ly9n zVdC5f)A1V)r745@>U5f%HW+o&Q9B|b(6XTWQD7k`0W0$Bhnzltkai5_pcv;DgtgDi zE^U~*;!>#bIyDEkkE-FYHej^16Bo9a_O)n#yJn6##?tnSNoRLKf0kY})-i~Jzv}$g zo3zK9RtfV{$5urcEl3*EapRC|3S1|?G*6supzHcCaYkb~pQC+F?rhp}kR~0;8R@O* zN}C1yX)s6nUF+rdHhoa{?#U@z5j(-m?hJcHy{~n1MlumU0R}!89AGeMUNIXxK)U#!o>9mKwDH-Qq!% zi$d)j82D!1l6>5^C2HM>>31vV&7tsx`R(@(^|ktE`7A0?ih(|8h%D&|>e7pUc!B|} zDo2RJMnYyqM?d}1Xn1!#e(6m+su2*o4p!Tw=U#dm^y8DRrh7mDdfu6X&)zv-IOD<& zMO}t3J^1X>GwpNK&V)j9U2ov%uw$w1+1Us(;0S^R3Zk8d=4=dG)E#uF>FwE#r#64Q zly$l*{pw7g(Aj3g`ah65!4}V68ct|(_5^yP4uGf0DokbI*V@ZxHa;Vqhe^%@wN4{- zOHW#<_?(<~4h+Q%bGTRbg9olu{3xcWFM{1UFt*mi{FX=A1>^r{ z8qgZYfBTdAxLSb2u)Al2Zwt?&ZrNzn;Cyfk)Hf}6m9^lJ+7yts$}wq-;P^D`$LkLq z+oNe_DI1bqL`@#5G{*6tJ8xIMfjZVJShei>P`7|-(mun?24=nfcw=uMTt4JaG`02v zYZ!^QZn*!syulzlxi#2~bTs7eJM*8_yW$mepiYefGug(}>$!xo$Zt6EHto}yGnG^J z!*$;Uz1y!w(z@@d={(_{1s$M)3aBsYI)HNWtQQwLLw6h9j+RT8{mBJDGayKO@%`=u zHtTh41k^UrdLqWbSqB5H-2d(PIOe;1o0825h{*P$AzQ2r$bvv+t~mHcmraKk)mP_2 zIC}J4Z*95Kx4tDNW;lNw`Y|h`?uRP!@lAfG%2wa|?PAEWkmG(dbsZ-p5*b5Yn zsFkIlgynl~Z~@RK_oxC~-N=T&KJ0;|N50s4Pu9sykfv3!qvqAhji1YHR#V^w*4~jW zoSDALR%k?jkfXyo*t3sbE$f3#=2zLy6O7IP1p=jK1Y?Ae#|PZC6g)i(2C99AzL4$LeZPAu$snTnL1eY@i(|vCLfKO^kw|IBTF!5Jjl0+L%F>yr-Oegd z2B{yAg!?S{E5pH;g-C(+EI}7aNd|vs)}|ru0W5JTxS~bsP5?0ApWd04r~IgpyyHz< z3Us=EG1S1!FI?Al@BG)z6I*V(da6gfqrMxI;)yWdLKFg1J-!rmnFliu9iR!y=!pj>#<&g??e|o@Oh^< zzE-y?^~N-k6TkheqoU67{XM@u22W{VOrj+mSX!queQ%fPcey!%0Y}Hewkv>1SDghQ zzyhfhWE9`|?sL5!Y#5!&K^>4!R&RJ0dd1Kbf{G~vP`wS^3XdgP{>8WLKfInVB!yTV zjzTSs!YVq{n%MBH3I&oG=C@B(&<6SiI#Z7ZNdkxCHofufi+Y9C;}E`klsDhsPqAN! zXNi?}EVhOYPBAMi{-@qKY)h5E$W42<<^p}rei~SReo{+Iy7=@9cunQr>OpqJ1^~=vbnTp*EQxXoBX2 zgxbaP-Yu`#plKV~(`{IA&bakeY{=-6-(A1mFagT4?~eT)yX_;NBo%f^&qa6K(b$t^ zovCY})v}mtQkb^k=Rq?78d;(Phyrf&O58GB1Gdx>?Wr)e^^As@(9mEFQ>lw}?iMpr zbosjmyy@GP$ie!J&(yCZ6wZdAW2W%1fW8m*%kQbyBd4Fy_nGc_1J&FpfC@!M>oj31 zc6)c>!~Gvms&hfVP*!@vr6b+wGST0fY7NHrFztg_3jliZcYI%;(OjS7d~lB%cJ>6s z$J|9{K&VYyZ+abi4M<6o8#3u&n854n&n|xIyyllL>9*8)t+9bHN`bVYz7aYu2!%nb z6i=~yhkbw#Mwytw@2)ck`8}Y=DgaApao`I3-W=S6mQ6_M6z01i3hhIeGtAKaCiCw; z$^^@=oLs{FJ^Nk-9lISA%h9Swb1oKa!4HKO)<8DXeAx}87N+>nrY|2t9N#y4;D^RE zIK6vT%u5bMPq~18&O4v5J-bw!T%{60v10ju{y6^`At8#$lV+!D6hfExOaBwQ?5I*K zycA-oX+Z-E^m|y%1>?$sc{IdwCU?o-I@e0>D2GV1&@_LRI-_;QLNo;?L$lPrGIQ7j z85$4!05kCiDHK*cEDI=9{Jo|@l<2I{9p^P~?=Q^?EqtcPokybVy(%J-LrvZ{FR)A> zCdN86{5-ubX8nrZAax2t(Q1E-E%1SZT-&wk>QfMIvmY5)dQqYJZWD+gWUoIK^W~n- z!}cZ{=ek&>L|t`1D_Gk<%fZ4CC~*$%aW&XA6?6!OoR+6h(t6GFdx-k#8z(Qk59{f@ z^a@ectsoBkRtLkQ@ajx%->wyIQSHGle2~Bi=l7t&3$#eJ-XleN&$cYyS94B_1=Msh z6E6F0t*k4XTWBCl^(LK5#Z0Q|1XOtK!TY?`H$E>JYk7s0l67_KH+*PsPSYj-xK z!8z(@oxE)lajD~TayeTE;ivm7wwEGSwI?$v8XAOF-eFov0LS-eOv}b+bH)>xxXh}= zDPs82g<9k=qv$4F+=zzO>Wmn!MJU+Eq!1j8K`a#shIH9v!@JEg_fFcz=ZD0XWfY=R zrfcO;2n^GBF|P1f*`O{7-rnw4ebrYE=c}ZbS_p)~{_&KirqR}<^pk!W@bE%~ZEE=O z+H*BDQ4@vP)v6T`aP%U6UGf$+Dha6~=E-R9n=^9);iUbOqInN6!O%^` zrCjSo4X~dtq<1Y@A*%qk1ICm1=n=u!xnlu~7cO?q9lG7%H8Lu1y~stO&x{#quA!v& z?A-AB`pl&hn?J@+VRmtg@;I^+%h*B?hM&!zh=9oZu>J2eU&iynmKw@+pb|eOF_Uoq zBNNx#X!Tmi6=a-U8vsXt~{wt@Y;>+D6>BeOkA8-kI4oaiR0dcbtYyTckiI=#GvCsxWi{ zj6;3Daa;fnTeR^#X=SGVJC*f)-N7qX4!XH_c?9+PZxq`I*YQrcZ72gY^^ARS8+CEOx&}y9E<25d{^e~Oa?{&F) z&gmE*PxkM)crk7q>xZU4?}P6e08P@ZmN*Uv(?^x9&|-yR;aBMS2tMAl zsrSgearwQ{q!Se@MtZWCyqb50Y^*g+Mk(VR?rx?M{9`Rn$C2>}@nl+k{N@jr4iZTF zH-pgAn`9lAE>$?b51Qu+pd2>8*h*p)eZh=wG0w`AmSO7;)b}+vIrl2pmj@i^zGlby zEHo;$Fkzzb51X$SF`Z^px*b)s>LbJ(FZ83=4*ANV23ONW7jSWRu>HLkt>WAa7B4Qn zW^*?h58bv%JD}iX+qP~!eO)8bh5QTmy3hwu5P-h8bP;vPW|>tuy+7J}(ptbol|sAm zdgwXVNefevP@Z(VP}fGHflu#}`Ie`H1RD~Ub8pSh!7sZW#L#rfg)+)7SE{Tq3rQ94 zl_v$KW$M@JZNtLk+{uQwA?r<;vw~aBWG*p{dU8fEJ<>XbvjM??L%nRxZcCQuvVcku z)CUn1P4#|0^4cL(Cg7k+i`EtPtacZg{3~VEhV8%=rO3R#`@ox}Eb2^Hnp?3?I*gga z@&^ts%AVP5#BAnT-&SsIODdAkrw5H;d=knp8iFVVB7%*C*zzu5&BDtey`fuF_#$Qk zld5&ffs@h>#I=<+$|y+f>tszmGQz0^k%5dvg_WA+oqVq8BE%s~%7T>3Pw@%ZOkiuB z%ZY`$SiJJ+y;uX61&D`X?IJ(y96@u!FTz3+xwosaCOd9-TpW)9oZn-6FjMYX*<#2Z z2ALc_%R#-rbRG>|Z6d2j^X5y;v(cc`J5u^y-2SkOh}Wn-XOgveTP$y)K)begI&rxG zdsqS*9}n9>Q+-bj?=~BVA;1jiDuxb&9&=-ARiGl)~GyhB53uc`WN3m8C!?x2Dhqpb7$MfrL)3 z3VK7PW$>d!wb#-Uy*Xhg)!!@2{K~JqO%1X0fvx>ND6t^K_nr@Jhgb=cfQtrFK^G@| zF4w4c1n#&921le%p$xDp1oKHpQRwqL6Jn29x8GskpAP$^_-K12HnqlxxSWTp6J3q+ zk7SLGWwmDFh=$#}PG)xvc8z?IC!oOxUzUF=la65~RWZ$`HWOo#79NB~v~p6@Cg*P3j5%O*)9+?Y%(7?@0vgURWupUcF_WTf!~JRQ1N^DK{iG`|c^M@YBfKv*|%0nTUADN^g*o=_mrxPsvD@ zaP@0YU-Nkf4?Q~sF@XUwDx}oj_1hP-E}^}Iz>RFv%ui+_WMvX()8NE-Fsa5h{CQT2 z&zxj1OL%`bw^nlCV28w(Od+cL8)6}L&A)!R={Ko6J19~jY<+*?)cZ)NKPD%C{2kss zJy#s6iVGl_R-Ju26_oJmp4386brQFFv9lXD>y6PI{#5n8lcTXA4?LJ)_IhCUGK!7E z(}daR95oK5O@9^fd!%~Y0b<};tHO)M%O5_@%1&9jEOA+qxdzBfO8(rvC-VF{MZ&$L z%z`v9TGP85+8J1#hW6kpzt}S2^k?%iHhM22G4SrgCI3yoscBfG?@(1B0Z>wK>y83| zaKuA%e=mHPn}6YCCXOH5Y)wrpXHV8UJ-|XCUp!vQm2$EYDFiZ@r(pcSl&Hdwg=Vuv z=uqSl@ujOW0+~Y%*CeRUYcuOlQcj=IO7ztuqQPLOh13~ljuSbCC^aM<9r!VERbK)ypadJ7q18MA&->(w!|#w6Ly44;Kpkmdc`#MA1i-0> zjfS-l>SPi7pQja9TZTIxaTjucb2$++jnw0hfC_?HbLj5(|81t}8koMXKYn{mw|Fx7 zbHwlWYNG)#>f6P?&ZBygXv}JygO6F&iVD?Q8IcwZX8Af1%{YRTa|#e2U^G8xLe|jR z>R_hTilJ6yn>Z!j?PRj`xz6{O`MKQiFu8!#J`N<8ax=w~a5}{U$oG#&42=qcHcfH_ zuLHCZLPUbOSrrJAhiApsnBqNpd6;bqM8v7A2qTNNpZ7WH=~vuG8~^E&QLs7@6y}*LSC&4CtUJ zNt);9opG|sX#(QRTa@+4fiZ6y`UC9VHo^Dkw|tl5=J<80bd9?XDEPy4Te<#K84v6@ zAcmk|H-YYwFWxf6J%ZvAMD6ukV~d=Zw7`*7A3kHO^_}rbkZweUIMSX*P^x^xmQ0r&QF=ETSh1BWEgV7SR`gR^uk_nnbPVV{N-$U5W(?bCSPPOa z957KIvV>)X7>_6%6ENv%tK~_HvzaQd^4t;bY9y4T{!_9GYk&E2_t&J5*dlTJl^OzB z`cwq{g-Kc1QFH3deGU@3Y@w!X&^Hlv4>%YMGp^2pwle$fgwTTLM~REE3_x$SFr~6P zd^9K+NcfyMa+p2!`eE5Ny*{4B{X4W5B zw^zPZVy-^^ON*{l*AZ0S0Q8OYhI@FcWTUqMrq$t2T4le`6RZU!Lc%-l1oTOv)OtyZ zQH{*wW}_G zDM)v^^9IdYl9V?vpNElPCls1C=4kaA!GVyV2>*V~J8LhlKvI>lv=~&n^%1diMPaew zMlkl#&}SQqc540D@kdj~rj5P5r}NmpGILyrz#Je%n$HFTbIZcb*hrush*N`u)&{;E;RJ)H4;Fn#n=M^fk=ekQxa z8=5b7qPfO3u5mG+-$P1MnGizckJnw6SalBD#* zz^16de)0>~+#T|D25CaO)#7OJ8N=u*98sFD9e-ZO|J2D=&mGOyXtD*mlvWf(wpzKL zkTnGDxM&?WyVj7o^?ja9c4S?i@Nf%C2>HQaZ&*Vr4!Z@FR_neyt{XX+A@NxNN(JiM zk5EMnzt86LpY-s)ov3SUObVY@3zi88HV|fW%#aD)RifU<@6tlNnGoKI-NaDpqyv=+ zEN~KyV(9o^xjwEtJ`RmV-96cad<$b%S&7ElYU;agDg3j5%Dx4?es~S0cdAh!1PGaH znhvtbWLCy$r}hq~Uz%%9cV)fP+$SIO6R;GHptJypV)!K$A21P3RvaVg@tnskw90s9 zTBR0RK!09(52FE&f!N3rFac%c)V+CG;pG@GKrou*;w((wo9pos_FlLv!q4^y=631f z&fl$FTyaQ`>txo#-G?c0jaG|*&)!kkgJTf7U(${pJL7iJ-?CL<4ERdJi>yT7;?qvQ zOZLjC0G6)A}P>euDs&UF0ykP@19CdIr}gr3e_EddqW$&27nZ* zd~P{B-KkP3ZMEYQPgPLjoQ`;ZBD5hP+z83no;m6Y;|$pU>YnNHh#$oBtCxLGu2}7X z2u&W1&6}RfC8#kZpYb~$HsEnPi~@sr*m-x@;Fv>;wU&AG&c-2b#HFYtOx(2F#AQxo z0njcH(O)=JMAG3MeFA5}I9mL#cPo_UbPs)Xu=(4~or_G~pKwQSvJOzm25j51j(RpqK_1{-Oh$RXGu`waGBa^o z3%jDr#O)S(^5 zvA4%pqB&>AX6`ksY*>DH1Fs$AhND=ilP~pNY<=!)(c5HTp#f1k=n45Y3!slW7(~f* z2vS)-JJn*x&@v~J^ohm|Yc6a_uOco3w(WO2@gjarcy0}LuIC#ttZEa74!&-!aaG19 z|0)Qhdw_jDp$Q$2?hy15-qC3lqC_3d^^Ip50 z&jC`$fQPWBx#eG@TpDnF&YD(>fBcAn_?q^V!PtbKkpo5rcbR?&4Ly>=Pu2X?>lo)C@;u>yocr^ucb1GyCUV)x)S0 zi{efmSybY1601~01Z9b<;cx;9oPVFiV#1x)o~#=C@lv$tZlwQmuPA&$$LgrbuA5qA z{~Fg5{u5_G2v~MZQJFPa*1d4zK)$}}Ts=8=r*eHrVB!>aJP%d3W$?R1_97=isf13f zf7tl<*m%^CH4(dc*RnQo;Kg(^HG_;4X8JtRTkqY<%>h~{^U8L8{P2+9e^a(|C(F$q z*1GFm1)db3KamY4qfcf(?m2hK^MDH-ZFpB)nT9k;}|~NvS^dIg$-~RX9$Bq5IRCD1Q!l z^4z^Y=b=wEYUUDsoNQC9gY6cFhGsIuvk*>I?cx$nwzCt z(YJ3ijYjXy&=-|0;pGZ|i`)r1?bLxvhUDJeu%yE}X47D|2pE;2@>FHyrG&dg?YAG* zw6mj^@D6{QBye;$ANAD32hgP$qEyb?e~xt$m)^6p5%8XGmyHl_;r&Yn?fv{PbFvOMOLgf#a9_~HZarFkvBK~dVUnzgSuW>LpBLVaR zRS+=8=%$5*ikR-4*DPSc5XXMh4|4BH7$o@Yw&C4JTW?+~rsM~Q1nx~+6d{i5pb}K~ zHX7c2J~Q5!xO27etShK}Kbq??5Gnqbub%TraZq>t{av8XOhfJGJgsHMJqh7iX<>Bn zlDYDtE}$G&akKS=ZHIOD>~s7O05xSP&O!Gzh+z+HFXv`1nY`_E`3Mb6L?xE$BQ1JB z`B&HGhh>@q>~uFn!i{}7dTO<;{fOfK0dCD zY;Ciia!+kKK$Kchg=agFl%oJY8Q5Y{+LJU<>q<22{yH&*H0I$KgtrF?V-R#FZJEPl`wo}4UILu zPG;2N;Wm%$ji~SNy-p=pWWg|*n{m#wkG*&HaNs5pt#L(|ZkIV0DruMZ7iV{RY)>BZ zZOwF*5$D}Gr{xJ$^M7d=V*tpBpV}#BQ)ZoFOmZ&bt-XBq?6ZFS)J4By4b&cYe72=% zZl=@h$I>;E_NQn6;+%f;-u*Y+HKhlMm3;KEjh3;M zp(~TBuMRLCi9}B^mv9fyjstD!xArij5bcqq+6x!|WoM$qhc9~1uEC%bj-YTXvoO&f zN;KLScegpSJ9iiHqF`r-vqQqaZ|-mZyP$wo5u3}T;Lzb!q0aEGqyl{a3X6oQ`;HKc_bI=9w5ZTe zDxACQhO@!?4GF8CI*ymVt$fsVHzlgrJdG26`{CC-N8$qXaHx9c+6Itz;C%!~b{5SA zgX?DxK{;JFilFpli(}Jj?Ekss4FbTm~*=&Fk?f}cV531AzE#on~}I| zS%gjZllEp|STuSyfwtQDwHD~Y68JgP9%87u?eZ0D1w zJIh=ETl93ED4T2D`tih&`7Xg$PqOI9@`pcA=J0W3;ILo>2I=JNmBF5*2em$UfK3Ny z^(B*YF60I27Bgl=ZM+z>$a?=9uX1#YH1l<{DcgooI36BkiAty(HyfQkg1OAg(?Oe>4A1Yio+ni`yrDv83ZHZu5hP z2e=?#zg1)NAlx<>Pdn_Z*&oU;#ZLH#(6?Uh5bt%`*Q^Qf0J6Eir_+sZ6Xplkq}(+o zxuS>iNeDmi*%bFi@{nPcR;=U2Nwdqr)4YAnOGF^g0pH)7c7O^jmK2)hbNvp|V?@R5 z4#HyKwOrHI%N?lURmb&rb#8?1AkN;JE_>IYwcsX5&RuVtsThF3juq|q;UNayiLl*5 z(9TjD9CIM;=@W32_mPSXfBG_x=^3Z-GUpoiyuC9Xb$4<}Ct*>n?zZWSad~uCa0SaQ zrtqwTPjsg;zzuShAR3~7PlkV;6RAhkEM{h#@4y{EN6THeH~etPbr{Sawu*JvVK8du zc3*oyxFF^vHP4mPNM#a7ea8u7K{WJDVEU1+foo4|-|y)x&k*CM~K zBt4J_im!Hhkobmc;9m$VIp+Z(z(JN%osXX|lbV;7!|PO(=fU%HAAq{DLSF82!2DV7#r9e=IZ$~5bG6}@RH1XtwAPAk6Z>P5=U@H8mk zUbgCH8K{>@P&r|+>ze$y=xWQ|jQtB%-E$CYl&Z*{0%gZ9{CHZMXNMTXXga4=Y%Nsn zKwNdSMoJ3cER>P$iP;qAU&w#99?QxDAdKFL39G-V;+MBio|-#p*f{vGzVYyYYO)BI zd-7OUo*x9PVfXWt-valgQR7CeNeg?_ymN3I?bf6Hm!f48K>4<+U_6=SBiR1=&dQU^ zDnJe9e%Ul@uAL46X-=x&s26^R^-p0btuvh0`dWbp3LKm(SKX1%tp6bXJ>l&TD6Xie z$ths~SSPsvTr8E!nN*}M*L355bWLa3>(X`SU0QNt|D0K|W~UxGRz z%`EZ$#5DgL-;G*$`+5qOCLh=4shHNJnc}-zJX_vTY!hEdoYR^?jccrnyqmjRzwHq# zFL%%Ie@@apEkat`eZ7F7IcdG+>w7r1XqpDLJt7HsD)QITwcor=UkzX&uEv3Brcw^k z!leYulUVE>ocx&L@M~+jm5#qj#3ffe#0MVOm*;%vnibO*EFbz~BbWDk&wjzPjv;i1 zJl7ZYAv;6ac*|jj)fH4#f#pV-^ITJ#1wfz5*#r~3On2Vf9_=~LL4syh18{@j?cfJi zcn}@*LKP6Es`h0NDAL@iRzFavfE8`$H6<=CX(DEaIXrF|{reBTjdm^K18{*7ZQrE1 zl=}7Pb!N!Z^n>Z~g>R$zaMcH7aq}v^vsVYQ{P^QUCP_ zDVdD)44fDusR`cVNpQvr$51fr!3@tbi8-YB5?@NZ%fjatV{-)Ey%%2V#7_7^|LA@_ zay5AS#r-~W=5)6C>4$R9BwEnN-hgpZX-zSdlJBK=S&BRGH2U_?kOv}NEiN9b=p=KHe?G1{`MKddt>6u%2c%C$ zpby7`!8cB~S7>_($Y6a?7wUK7SU+}JtdQ&QcE+@lNTO@S&DG?J@aENT~xXjtIP9Zz>e8~MXoAAHPp2C{svTKjR6N^HbYNm0U zTHDWtdK7=V1_z;SY+52d|ASxpo$>dr`!qCK3e!x~&zE*L?~B~V7FXxmFaQde=hE6fSxP)Ages*fuIZ_ zq}pSZb!upeX_Ez(1J(BpA=1Ku4dI^XDdF43{mcLI-s{hz2n{IkY|YjU4!~s7_au;& z!C?8-zb%{xa}9E&XhHY7*%hbP;kNmKvnZE|-nYb0v%37iZ=S--fW;JbUbj(7RV%A> z^Hk2YPAQSUJ!BVfaCDnt?O0^tfjaKhof9nJZM%cYj$C$si;pW#gC{;9Ye!ZhTWezXk0Kt;K|D`W?)6~a$OCJm(y3WU1H`V*Iir+@gqDFsVh0W0H zDGUCH(ca%a#v~zXoHY&rkN;yUP{4)0w`WX;d`KQZvjYSWC?wbYPFko7YM+5?niV!> zz~y^76S0*{v%ODKCP|m~IpX&vV?L2YKCUgLf>_D|3mD+TFgWr(_gHRv#n&Lf?7d_X zvj4zfbb5aVf%4D5C&E6DpN=zPflA5c+%-}wwV2G&-q;F;LXe@B@bnaoZOLS75Mz^= z{w5E>_C^o{lvog`t2y;CGb@R+DVCi5(RAx2>qQjR3QykiHszeRL+w>yeK*5-gJoQq z`|r8|j`jOpsivcvjQ_d+TV#7BAsZ~``BZ7o_)vMh2 zDjWrNH7CWurO}v&-L?QG(K6?3E>8yp;z+yCjV~%9OF1~W2KMS{u-}%neQtpaf4$M0 zv#t=40x8m|b(GpGd4th*Z5bbxwWv?>4S{h=79@Vka&cSs!s^lkkHfQ3pr^BT5cJJ6 zGMH-*&%S{l%gcw4Y8n9_LKp?P@COV<&&P`!jsQdP4NU~4UpZf&Ymp8RLV_j~ij2_v)yd^QByVHci4*@qfnZa=-h8oTX+yy2JE-!CD#&W$$bo2ySe zIvMA>>ci2@9C;(sb_rL_r~K0>{nXR8C$8Jwoo)sPl|mO0nw-Vd$(6nPoWH_?|-aB+(I<0T@5@6_CA7q>D%g)HqT+n1#MdpE!6jjSVKxQDQ2W`nad(GP^IwMrI3#ffww6S9UrqP9p$gg-ePl+RXQ zUrv;!=7U67kr%7aA3 z!bD7OXy1eAPdVgRX5$9Qfpiig<;@7$;Lt%4o{LjWNXiqD$1ob(Iz%FY#K#z?>^D+p z1f`-Dxk=HVTptExFAin6%i}RV?0!V##=v-&A=xqd(L=Jh6avDf@ELqabPH^UQA#UW zg7gOw1ydRbMkEVVhH;q5BS>O)nJXRTTn0mP7FPgWu@`~=2fuj?+)hB*AyK6$i6Z>0 zs)dP|r*finVFUOjrIg?#@HmVHTgBdu2&5ek5b8hV*%+lVKrBk~EH63YPf{I>(i2O0 z6aRZ^SV_bhNCaKT@Ys|1FQp22I5Y~FA$Ji0Q;PsUOO%WDg8d;3Mo{WzU?0dJ%*Anx z0R)M4y+B`l5|C6m&1-*vng#`m6utD;qV^(w-7+Rs0>(qKVCNDQB`5=W3Y2EYQZ|=6 zz^@}gn&PaXEJ#!d1`(0n>3IIq7aDqWHY63T!&#R2lc?N|1Tp~yl^f`xu9t`+goJS1 z87RRwdS_f3Pm04-4w}l(;HG>a#d$F{E(CM{3Bny54LP@6Cz2RrgD4NP1l=Sgfny|s zbR*O$RBY$K)FKphbT~n<8Y+fdxFDJH6V>3GH7Eie{7cYKfHH%Nicko$aUxV*DC;^M zbD2T|TnF%KZkt%yvJ6f-rcB|3v7x{Yxc7i9&OLYh?! zFI3gV3Prw8jQ0es)@Vn|RJ=Q+^58FJ^S_~8z3RIIZ8P^ zh{%C4b|w^+N55!>m(6{okOa7RD2od;V1QEH0*nYu*J%onu98k7)5Q!j7X!J)x~K_I znsgi{UJ0(m^|_ggNfwtkh-nHkHDlKkfG#D)?`asvFnU`UJs?~fFMuqUX%s$v5EwGBHnt76N_>3D&h`ci^rBFat=|&gi0%*vz5A2kf~7 z29pYGCM2MqE2JW9>VP1NE5i*cx`_2Sm3jrD{z9|z0Wc$!KzZ<+y93p-%j46y6uSY` z?!bCB#&~`YaD^lZ8>KZyMh)>Lv)4)_D9$8k#N;YzBnU^eA?T>T@PQiuALKyBpuou( zqj(%7&+RQ9E}ZoSDGo9mJrEgVRgRz(nTR`&2I+@^sP<8uDL5JuS9_ zT-nIrlR=k-f-ZF67)+_6hF(@RNu1>~kwk|&qGDEqT+iIK01Oev6usjzvtbq$$ONK3 z(l7N%O-|KS!3xzX5Az%z#<7i&S7S`pRPbNR_N6Cnr_B138M~hOkY=imtygJzQfnM&}_w?wt>k=+by_0QBm?8IyjAJ0vz8 zWDbK^#99aGoa+kC++fWC#u^4HWe#J~xzmdnzyL9`=PJRhMg5=;dRO5Ca-FUC#U(I` zaDIgeHA%9dY=w6gFf;Igo%u2xfYj*1aP2wVXy}PV2GnrYnH68GzpE^dNMO3Knjzm4 z2$_(|yyJo3CY9nY=dm}B;>+WAJW5S|fmTKF3;1+7mr@MnDbZSZt8y6aYqu`+^ru6x4>VNvV#rG^mhscpk5? zyqgI5!HMvV9-^+oVH36Hg#nE=!)wfXC);-d0mcx!=xp8gi>RT7`@n095LKXmZu zh{P9_o5{dSyybbW4T;HqdC}X777jPkU zHrL+gY4{6E3J(xV|8%==kYR&M#T zeBu0prF?G?F;TUkgxK+t%I4GCTq+s5s@D^UVfB|t5yWSVIt(D)l3SEHnZblQEVy&>Sq9ncvt@Ei^F`P9^{apWVQHpQPZY|*kxMT z7}y-`ST0U>>+_>aUFGOnQz9`#*>e>My7O*AQsHVSK}#lg>i6c;U&{w%J`7no0%`Y; za8-BRfl|d~V0c%QwjEB|+)R{nWv9dE@pi!DF!3?+^x+!dg|~j%<6ZzmK)k=Co=%~@ z#8C&hm8cLR#|HrgX4RyDVTmW+4hNEK`AcQe3nz596pfA1Tyd7&4lt+>kP>WC0Q@@H z5!o2iX!1qBuI}3;akLNc2u_6zQaJ-B>(>To5p+$v$g*#Jn$GjwBYog4AHcY6AyfA8 zXtX^>0}cLFlgg`Fo#BFjb7q?79YZe3T(^ytA9h$dY*4Y|#X`u_EoK)pK#!|dv#7=B zX;2|)%Is66-C7>kBE6cgAkOW;XMmKBW%iYNU&g}Am z+oXXc;Mr^!)|{U_VMtwF_Me9w>r+iMwnH&e>%rwUN707s)kKX6M8g*o45ucHgmve)Sojg#@7 z2IlJ>^XTTS0iaZ2ugP&3c+kqgu3Q;?ry)|*r@d!de;+MM*;DkUu-Tz8($f~oS1 za*U^*@~LvT8#i$()MW>p8W4DWo(#y2%2RguJ&m(q$_yEnbUXdm!_$5s(mR!g?mBHv zxs^fiGe^NS%5)*JAu+aHJj%T1_K@LZf|w^=?{`wm*Cn+&DxdaKHr`m zS%6WDrnD4(f>{h;;d~;-m<^e@2SKj@v@T=yVK3~y+rif1ED$GFzOP=Wqa-H&&UA(J z+Q;K%pQug`l9#e~(=bBlx`N`+w)54vqRzCBgy19~I#a>2ck| zi}sjL4KPP<7OI~PxjB%AaLcrQ`sAanYqN;6Ji2^34Mbn>R5p+V$Trv>=BMpY+-zPI zlN=KM+k2PIn4$&mz+NfuqhwC@W_YV1V_W^?wX zt{l5mIlRD>Gv|2DH~MwpJ?`>>a@EN@rK}uAGKghJ<6e&X7R1zXNY#rBVwA1|tbx$s zovS&dqcABi@@RGfE3VeX&^@QxQA z2aCOPdI~e-$+&-*bV-*<+V7gebu-f^q($Nq`0I3(zKCjB;i-ka>jHuF!$ALE8Fdbyrp&U2Z^dQz zZCPy; zd-y?x8KgcF)-e%Vhh_`uwc)IR3ceE`-+l9xjVUAr_A~eJ{#==HztqK%h7bpz{{Y$U zpv7!mx4n$IkTc(;`W__pWk$dIE8>}dW?G#yG8k{x1-cz~IIPWNEij3G;eiz5{$apI zl?;Yb?;3Vm>&ciUiw3~Gb%7pL&}?=5r|o>it+Z!H0m`spS!dL#xBIjD5{&YzPGtKu z7n02J)mjd2&xZ`wQig2^87Ug0Z+Wt(4j&(yVCwcJi-EG1hq`Ld0V=;&TDj+$i3?=G z>M34mhP|>1K13^rM4rXsBB!;5pi)vs z%cE~vE#Dl__7c}J{6u6Mn>1{uK8J`%K1sgZYM~)+WdEZDh4VNJCp)`Jmp$fapc!o6 zy3}cy%3zxT7uAtgSUI(VV@#jsNb&@eZ~$klFh63Hdt z5R9_^v<2qQ)qD_xip9DO zi8oowOE(Un!3o5XN%u~~UR0ZeiMma{ z9^;10%!%?9S5E=fo|(Q}sXQH2g+=kNe^$IWW$$}1@U@Q7hvOK-Kl ze{Kd!i;c$Tn}?G>&jA{eYSeob6fUI{zT9IRLZ=~$oZU~qb7abB_Gb#U7e&7CUT^P>*1VEH)J5k|G|^*zR=Z>D#gU5rkqTa7Z))Tejky8K0{cflbx-Kkmy{3 z-x0Hfr1?Mm@U-bEBvkJ|S|fVJ*1{qhG$DHT4T#L2>fmb&2A>rF*sy0xDzXahiF)I< z^ywY<(w;9ybKnA9#ISEyOY_0oRJk4%2zr`wBu zt=zn#D9^(A()u`)ct#*S_Ch+|bL#VderEc8D-SH;6NC*if zT^}wl-*G(T#=`}y{>qF6W^=eZYPY7!vRCJV+G%jO61qEg8fqEw^cW*|(vwq%JAX>O z{vgIb6NhW0T7tlWF|i|}n_yaj2=)GC*w615XjEaNN=LPP9?cD`vs^wfYW>?2K2X)E zw=BD#_6c{Hqv7vXWx3OiezSpFo$D6JI0L{V^TmmdbN(azUMsEA#JHK z8w9O^B9uOW>Cydsl(`j>k@w|=MD(>0wV0r^ox4WiRTk$c9TH3c6% zt+9Y<65^axK-f}I5JWda(A{QHbi!hyR3o@xsrFeTxFjE-XBgo5I$H`ru<8|RqC8;; zf5!Yoz1EK*1|a&{-DxYr7cW2zmj8Fmw23C3_|!{UO=)Ow)?S)rnO|rdD9#Ue_ zL|OQ<=I1n|?#bzDFTUgM7lqv}kk^d4%jCnI#VZ?jIbSv;J`2puwnrn5ZB$)&%BwDS zqwQ}Q5PsJgY z@jW-x;_c_QC-GJ7;%9>YsypNl$$mA}6?Fgm+eKs8tB#-+^38znJ@r4|4jYTg^$iwe zS#4S4$R(XkB}L*|b?w3JNv^Yk-}`*Qxu(i-CR3e=@&-dXy7#vqkD0|TcVBc=GXgTDfgJ!Cf!Cd9 zGS}5!y5VL}2Pfxk`b_CgZ_-~7iO#jomfJ{+n$(JLy)d$Ve|~N*5RxXXqkl-)9A$0t zzqfipW@2p{JOVOo$oZDuSkYtx80s-_)A1lhF<#53vXKe~% zi_|H0^{H5inT%(3c~X6cmG*1wu59dc2av6j-1@A!F5ZHx)$$b4Cul_MnMIhe^UehG zX@J**f~t`?hkLmT453Gd9Eqtn$aYFtgR3LiW3yBQ{M_^1`DfMOPw$?YphHN>In7?F zh=EZ829d1f>}EvQd;G2zv+Uvb+WqW4JPbKK7_MXALB{PfPOH_g^Jh`KTp z72%+I*qz_JC;v@T1B@3mfRKZ;WcSq@b#27`PEc4mBiKxHpSNc|*tUBw8S8(@y z(oK9$%a^%DqzpD_nwOA*?NOu3xKGb5-`Ru9Oakg?yU@P+kl7F^jr+7-J@z^z2ZVg^ z`ngarX7uI{lb2Un(V5@a>XEv-phM^!fCOiOc@^oNn-^Pp$=(I)gMgK`WqBTeQzt$C z_J!2359622@&ba{-p3lg(6Q%O0~?cRQ#ke(W;qPO3(Ux$%&T85;ajnXGI?2^%P znd{#;&nvQhm||=5m)TsGgp=h4ChxVDPkSy5g%2QRfC{`zaj~#xG}wfRG@e~8eiZwC zj`8xD+-!RlK{4nr{zKgYqi&$#+_W z`Z~miG&c+~-2!LtbA@ciNKfM<)Gqd%yKlNy>C?JY6u8V?Q6cvp`{d$q-le_kdb+k> zxi_bM)b7tLwMF_K?K8~S(E3eVh-nB);YyU;*NnQ}mA1=tPN>5PkrEQ~LhjR?-o{`T zVPDg=5xWr2?0#vzt=mQe@I4l@^G%Kh$&q^R1mWoTAI(wljz%-*?)z`H)1c#ooUQ9^ z(yvC{GJh%r>z`lc`2Gdyp7(|gM%^YDSv39lCB>TUQLD~Tb)dcco4} zAUT(ckIW;SpZsaX#;x6V?|5}csux|prQY5-+Y{4h zz;~nv&Yk~AXCb{KMmNN9kaN0ps#P?;=BEfd7IMt5;tLLp$;4Q7?PNm>DCT*|I`=fcG#Z zEt6oKcjjPU5O5Zx5ewMpNQ%wvs`pt~KE2d%J~h%U&?L-uH6(OK)x@j;b9?G8id=76 zQ&@Z9%_av69cDF>=UJX;x@c_(MsJIWYz?svsk*1nhNHBsNL|k4qb~+%na6tjTh%lB zyXVnckd?{@Cj}WOt%j~{X>$H7O*kTTes}Nda_aSGVSO|!yI=3n&l#T{|KrAry0@+( z3s4hw82WJL_d8sSaV{m*|sp3?sN!t>1{bkqZus-yrc8Qu|f5w z1q7w1Zlr!m{2KMQuXZPV7$V8Ev&=LdhtN>|Y_yX?+sSkIW8$m5bAD^~(D-)mO=f#T zA0@jgY%xbJtQB|MCNk6N>cpj&t!S$I8bMLupl#WU-E!;QyM5FXrOUT41vv@hoQA15 z|5;qh*~Rnjz=1F?aQiS~a0rMiqMms*Q8k<4AVWGRQ-#$wS7yka%6segn-odf&ndfb znV)suXpE9^DAn&jcZ0$t51;|SfHn<_*|Pr3L3hl3IgpQ=h|+YgY~8%`dxJf+n$7r-ZeH0ZmTzTbc=7S8MY(l#zMT+LKC#xB;T(f*-@2hRDSdZji6 z6NS&w2D0L$wr3|N>NHg6V@B)pKn5%o8_YYjtLNE0t?(pj2g<0-ge1M>P9CJcPJLCn zA{Y&0D8nv@PpGp=>va4r3TW_6HZC^~{_*bZs=qB3PP;BD;bRoPuBu@96m@XOyN?w- z(%jSyhc->E>Xe>a&c4wTeV8`FJL~z=fTs5E=@~kQ%P&+uN>~jiiV{XwRJZgnS!AqB zEMP{eXiH^Jm1pM7RvfS*d;QjSq9J}N=uj*OE9hHUPPD%L0!r5?5S^Mfeh{8DbVCR{6JtCHJpE6)2q-c4c+dSZ&PPqm+QY|mz7o7YxFUaoOr7B z$-<-{bKg&?C{6KLW^mZFr=R^6AL z;($pO&x3^1=ofsW!%6rS0f3!-JKUEBMxAwhyR`~^eGFJs^!=vu<7<7CsTV$?aPGEA zY0%bKV=d%PT9{_wQ=R+k=`7RpiSp7S^a$z5jov?e*TBc?M79?*Uo={Y;f=mMBZf!2 zn`IQR>e$&a`ky-l21BbcC~7o}?9n*RKbUa`B_XEO^lg9i3c(|W?%`do68pBR7uF%^ zkQcU^n1}L2DkEckxy`m#zK%^{>s|V% z50`2>$M^*_9dI!2$F+s$7*#&t6&CtmZ_)Jg-_~;kuaAWgZdQyA6EGy|@dFn)fm@O;%GuIp6u%1iKU+n2UgOoSlw|M4$&VWZRA+^fpL(1Zlvk#}a zPUYPHqpxwpt0#?tTR-w^xtszLjafwuXLv&r#ui#@Qq~3slvWWDQ4;}3ELJFkNxA?u zTg1Jyu`-k*nc`wJoBfceR?KPpC4?N5?>=|Ukus`+Gpfx4mdMPufei z#!5HHGktpRXxl{8)mTL6_}-F0fx)(A9;Ag!dJ>*k|Fw&9rsb6^?i_qC6>!k&p8tNJ zPgK(H<*GAHQd<@ULQjA%CYYm;-2LUewQ+_y;@D8SJ)m}_?|r{{ZW$gG$6^=7X$)m* zi`>I(>=$XRu7b=F%9_W|4UfkbS6wvI_iijfpGKiycpN|@L0Y^-%A9^UgiI)SJNbQK z7fWmWfz0HAuC_S=olSm~wOGSid*3Hgc&x5ZW5|h;22E2B()g>wc}!JQvyk{Xu}qeBi#<}DSPq>jN7(+vdCLo_tztW=;h z-%umZ+Iw@-wmque_(5?Z+iK6-E5%m_2)pPdUIfRRxx_^Te)_#yS3_g6O!w_YreTc< zLfGg~DD7!%*xnVtVY{@u(Pj^7H|f|+wcp)lQ&M~Xfp-R$7!#e8Y1BRWoO=KX5%`@- z3caIxLVbRmQNU?eJS~^7WVtt@42ihk=f1b<)Wt_#-=2(P za!xAL;zCLxu|`yE_#Wj+EpPY9E()YI=1?!s6L;nuk)Vc$oX!-zXsd+8qpc2wg)$!_ z0i-Xd>60e61afEBv5;@s(wMlqPV>Bj8g^#?%%NwW-zIkh(WAmjxtWHfgi<%@dMC0> zJM~B!`sT4x)B8V9AJ9NB-^|!xm~uH25_H2MAg6vv%mmP@o@?XRux2pdE&8tZx|o$ifY zFO^v?kr#GdyqHGhgJ^n`pWY?9uVElBX?otHVpny&E#L5FBr1gK3JH~8AB;O3xY{UZ z^;a!y0(r{$;*e7A0oFLGc6xVn z4aETdXHNRYCXLcZ{-Zl4uNDW2waMor4l4u~A9mH)2ZiruT9}Ns;MG8c?K}CEJtq)> z)R%!99Di%wFV`SjV7)hn#H~K5Riog_DvoV0(+a>Z47ofZ=Hd|DlE${SBn@~&n44Zi z0yDew4$53hj6G_zL>yoQ*>#x|xW}Jf8kB(Gn1M~=-|^@$Dr=S$Tu8A>07^pbZwXLY zF=+#dn+v;K4Ud*$M2$4X?T63jF4rQt>9i&m>LUHzgf^91(4u$zmh7ZuZjo&Ajdw3nsP4F zYe(|ff>?X0)HXc)PL2J!QZC1@)R1)2XNy?jM)|W<-P|kg;(^q5s_PfDrkwFZCW6+jUa) zmLFQE%e>cVxl<3G*S1(wpKz^xQ5s%i0m0z6#Vej|EVUOd0ufrjRze|=>30Ech`=<@ z{wQ0aC4n@}d@%?o4C>Cq>O0Tzu@EH)+q;`FFJKG%03T8(&w8c+qDw{94<_9&ueEo@ z=#HZvoKt(7+z}iQ=T1Y0W?vAXVxE?ccu)K>x%|(BIKmMg2D;BhG|< zo-osDkM$-z-0eQg@63$pENw}T9o_(jsk%#6pBqz40$l(l!5f>F?0DCrxXF`|-P~(~ z`p`xJa}Q-6a^D1Fn=G_H@pg(r>)jh|ufm$^CcdXO)G+ z7dG_I8egew*cjFv0&pTlIlcABZWKKm2d36gk?!EYB+oP*^*-s-ix?k0+zZE)=^pyc zclPZVwAJ#rVeXoG#1QJcqWywviIBDwjv?8V@Zj;20~&>y{22BDB^WeI$mzDJpf2nP z!kEdC!V#pRfWKwiNAabWQ?FaARF6qY(U6PUP#eB0i7O7*E>46-K*36&z*k}T2~jS6 zj4WAsy>;1gDtoqVKLer!-lbI+dH1W<%0h}(BV>cF$~A3mn~Iyfal3U;YpC~NP+p1F zno;q^Bi%a}uZ_0Txe*q%<3Z3Nv2R8p`Z5JRAN((;k}h>FDv1Qn#4<6V(3z&H4*3R_MN+!;5|mmV3tK{YSKi8z8>;;Hjb2%h zuy^sPP9js^xpv!RTzz9bNs@i6u23es0%wg>bv2#&`Qm~#Fr<(0m+d}*vMDOK38c=ns<@Q}?9^A;{-o9}>cHLlgeBSZmO-HRDQ--uF@O*i$)?~7gjYLJX6-ho3^~+?+ zQAi8leXmR0nCC~-eo^}K(w}%1FcaxmS(ytTB6EGrZu=d7g;CS{$VZn}Tex&>HLmH5 zPG6oF8&2nY$EKreBv33QVchiTNy>A}4Q*yApQZhdZ+mOs>5`J@D#mTdb6xC&%{#qI z7VebBju?!+b8WxRoKBQe9?pYhui^)fYHc;3>Kiv)^A9G3pzAeaCZ&y+G5PqdJ^BQj zln(G2)#i6MaHU&6ZP?!JEH{x0&1rM&-QczI3Jt#J02_HnL`SW)Ai8^j)`)IbEvIecbRi5 z3fV(N1!*ciXe^zSaHoQ`VZ`MR0N>MGkw!UM3_!)hA+Ra$8Js}AIJ`@I2V-M~G~EfY z8)h~*low1iYpwmb8g?Z{a-$}TNHgu?-@Vof^+`iTykU%2Rb@4F@qs=9bJ*7OLH6tC ziN7(IpmCZ*1r2GsN1<{N;_d6#_U9c;4?1ktU4O*STrbl#2y)j-Wmw?&_EE@^eQx#E zZY#@n)s1*)lHhB^hogdyjGmzEnJ^sH!WR{Is#w(c(I%~6oe%J^%rqVA#G@CiSV3HR zyRlOjRBkkV?UeH}>-~k0G#6OXB&nFtkH9~?yKpE6tm~9?mZLQW^i~Ac+pURm7P=iM zF}(}-?~DH1?2aT4m6CLTSxSfAvz8>&`Wq)}n;(AdnU~IL?{FF~HS<3)H}%9^Z?jH6 zcCy^c*M1>X0n>E{Kvq-7Q15Ia0H`~645L>C^=7LUyuAd*1ml$>D0LrS==h|^v{>!V zVDivhC#nyS5foFtH?Q7L7bYLI@-?aiOO3cfJ4vAxx5QFpz>mh3|WiLiA^vb+c-pGB#X zQ9cUVR{!ie7gp)3X;|AKC@oC*1r{Rr$U{T_I9 z7zCdO=Z{C}met&kKKX~e8ImsFG_{%R2A!!UYuKG!zOp}0;GH4yfi&=q5s)+b0I@$d z;6Bl)qB!xui)obN8l^oRkoc%_Nh3ra6I0jo^vRiruRr>xrn>=ITRRIq_}f82s47I< zDC$>VVHWZjpYq);7bqjgTTvbaa^}sTpW8f5CRDG-P<09>q@_n>mL!ejRk-gx*XiCq z@xQ(Y&ub-5`D7!RgpE648trY2sGalCTrcfe?Yr;e=Je!wB-}WgiJ243k8yk&Iw9}q z6VibKsO?}~NR};qDnhx>+Xr$ke47^hm_JLR!`Bi(l5Mp9%!$7(UTj2yFCy!5UE)kM zgOUkYx!pm&%`#VIYEe@L=KC%x1ow4)@{^b z9Dp12gU?xG+>Myhv?r4|&M3dFOjjFn;38FdrmdU0^z@lk85`~d?oKQ=JAk0`js8Xc zSL+Hbp3)BuOBgG5nn`V0*{kTHPA^`K>yBl=M*N!YCpFKCZakb1?H;sb$=RZj6G2Nd z9%h&^+p?YVt9qH>U=@hplpWHhJ9Y*NO5@L4+=TU0UZ2pjR7RpLT` zSTC=ggnZsc;w8q>P90Wp=w(U}R~LLuNdwc&pGscp(7K_ZU_;{JRs)}bxW*Q)UrMpg z=5MX2J|^muAVIWRXgzfdvFTR-^{BUIhNCw4+Z^SY^vRe70|46XJS;u=OewIy4N1pQ zihIcL>_pKL)^uVlFQsqxSo#(PfFxYrm8YKwx5 zdJk=X_g!v5pqfsrsd5V0qVj)8KZR}`ueDTc?Pz_`{n=*|tG83KJJ%*Iw8da<;`idF zRv8msQn3wZzPoraBFohT@~O^VKEZsaQu{6o$0R|T*|-X?vk|SpV(^Ut#wJ8|YLz}| zw}0Ogl;ZlI52OzWwArULQ^<-Ri>?o}QVAv85j@V2UML<~_PgFyt!}@eG+&A<+K6F_ zO5M{bVURel z8fq6`1$iKPr*z5tjC}*gT2sx~X*$;ny{$ab^|hkac*&LZXNEm*pEL5^d!}f_1G};< zefobG042^vX*Wtn9jwB*YB-dg_;hl+)!Xr;-zPuYg)B5$s$M4P=XM;qJGwd}4b2XZ znqJ!cC|>a7Hh(?QCylVr%&t*~62MXq4`PbUqk&SEQ4NFaa|&RLXg4u;@W)EzfW^xBK1uVW-@#Te$TDLB?X*p|se?MBsPO}jB ze4#&kaX*cOYER)fUMdFLY9OOEnQl6mXtXtjCdXhg&{|7OB+c2@BS(X=(u!9oZA`9yPn5jJaS?i9qPbnwWT zkUyGN2nCZ_V|Br>U-tt1)?5Q1*IAo_k>xARZyw0=@e6JIZW37j+Cc28Y>YU_;+nic> z!|=*3#z?B@*$C5iSs~Lv`>B?|qyH6iTOn$bI&K7tDyUVthRJl#8uh)0r^LTC`rcVE-m9qrw4om&_qf$=bhw zH?w!%mY;8TN4leb>4Z4;8w;v3Gp_h+6r;mRxsbc|N%(KXP2Ykff?l+}=vPdHG;k$> zTmMKePAXbPCsU)<8CXr)$i>*g5m=l){H%t(d1K*z0BWoC4UxComR>5kJM!eoFXg$J zo6fC}Yihb7D5JLdtVd+IFUlUWcJUbB`fl!?)yv>DL#dU?v{o&s)gE&)eL&1M(^TJ` zu}I%p+4kONAC95}GDUevLi^tq<%q>?(HZMzYXJ9XFt3uX>Bo+LMy?$Og>cQ86Rt|o z1vZbJz6S!YK&lUS zy!$yVLw35LWaQGZr3bC+Su{hxKu--fBobO?(Ui@sScH7SqJFceoM-szv&7~Vp_>&~T5fAN*tIdS(=L)3X@Kt(mXJ=9xj_AhFj=B4l zXM(MOtg_06=3J=AW9i}{1GTTXwXT^Q22liq0N-%U^RcMzAD=H@x2=e3+XRdR8x^V% zCS1Mnd_xErGUQ{H943eAx)x`$4|j`yZ%BBNh?aklYCQv9ABKe7TG~6dlzmKUzX(br zTn|W+HwF@y-FWna&Kx4^slgnl#b?{(9QIZVHPk`%7nT`nulwCHB{g(q)7- zxEz2Je3b*Ele_MIex6u361~Ksyw21+2Pw2T{PAtLohI|bvi|f^QiymcW?iy8q7)md zQNDG^9?d$y!CSjApUrvlaNCk@_xP{e{ga-vlz37_4WuOgrgUb#~Vs89zlT<$paum3nO7*Rr2N&-8WX$AqzS+nz8$>g;I)lJQ`dwh6& zC}fvLQ$*<&W36SMqsD#?wkTxj2$henb%Z|rg(Q$;ZWYRHGL?`sJda?76w%Xp$G;2< zE&jI*^)JZo78ik4$MMp#bvxH4fD)gx#>U!2`*{Ic@B(kkxO&^;V8#$n3vK7NEM?E{ zL$7u;pDE&#QBfqQD1qQOe=pI_qKYT|Hk<|i;(KZXBmxEDfc$Tt11l*3%yr7-ce;1r zc2G8Ee}ol4BYms2srEZ9HjU>zQQ=Hlf?ArR{Y$(n`AZGDjA8b?k5A-;tIip~mvCgi zL+@LGr{uSsYWs25+qeq@=Gg-$2C;y`^qupS#2`b8`&JXYp9+v*F7ChMu}k=`tM;YA z>mNNkCu`C4%`DmZ;@Sq$>iVs8Y2Zoy~e0Sfjcf@Td zE=!v4~^y7pgdiZf3}ehmI0eN6bktEaYOZVxAZ z>ckDL<@7+`yCZp#Tz;?KwRjw9n2fM0>vCDNSwgd9mGi*QiH)i4&dWAzgcBZwu2V-| z1C&jXY7_&EJdI2at##EIx! zvTWDEYo`}nZ2qV`k;5tZ{)5f(*g)iVV49GCH%APnqPNYaAL$5+83-S%Q{Qj7d+&I` z{x*StV{EUgKM=&#m~DUc=%1h8ZQc4Ho}kNydg5me)aGgx2N@W%&sb^_^``YSVk*oj-=5kjJ=3sZ_40ijRoxJxy=ibx z=iC8r*!j7mr0fASk|IYI`;s-O;-x8n%Pzj|ti98jmWeDSr_++7#POEvmo*EW##pU!p>D3}er(&wK+wJOhrquLr| zv^`&&U1nLb<6jTW7zD)sb}JChdCcvCU?_3^$}x_M-W>~>D0lIjSuFU)a4Bf@toN(BESj2*9SIM zZY=$r6c5&-B}tasuoqIuO6Lt4=O=$W`4{bRbP2$oTHc^x7oNZXMRI4^NB7iXlm@>} zmi_LlvLQ4s4t8V-O!7puvw6w;ISHpSJJxteYofOuVdOv5U|s*FEOOYM_-%!mhM<2) z=Z`w`#m}SHlpew^caT}dN#WXQF^|{pU40?O9llS(VBO@M+vCkAU2AFv;+~hKq%?dD z4rr7<2+yVZSU$D+(fvpB<%ekmsYV9ykjTJ0Rh>KcQV6kAu8+u3C?UIQ;Gro=MXlSM zuhxG>&t;|iCpY!eeFhv%bL1mQqIIm!^v=ZcbS@Y!V=|dMC44N3ocBLrtFG^Eiab!{ zbT#2FC@&kEQhdZ|X`pA>*u(C!p9S+F_hulJpRpN%rP+HBn(0U#{fZSlUNy~`4;OFT zeEn{0$Es!D51@qG2BZqhAq^vg<%Ou$3kO_NS_Vl^(L36u3ZIxBZ5~fy?)d4k1K0aH zhzfI_7q~f(w|y=S#Sp>wOyz9j=1u?rosLWb_{v|M`e5svSLV953f-Gm+A4M)d~`(7 z`nmI}6zU<6y75R=BD9s|RMnME8Mob9C0Il>o_IfmX0&Fj zuSORD{S)8c(;i>tHgohGm)-+Bdr9>#oM$wT$q7ch@aV6KWGl5{s$M0CL3G3r@6Zl7jaoS z#dErsEXhdYA_nZXcq0r>hLPKTuDk2@rqyL!W6hgi(sfj?M6*2isz`*I2h=1>Cc%J5 z-d}t)uPbjBa8SFvnp0oVS93%*M(q0cooQqz#Qtgd!%|c~Z#%wj8*`2P=UoM8qsZ88 z?=(q)NNG2S%aOCNTCRFmiNqTy!mlb*{ZEU(10$p|dL5=TugTFo2ZeS;XNAjjxB)Y-O2w4er_^{!{Wt#w8{N-dyeZUU=m&btynI z-@I#l$Bmy2s;|$!bwqgB#b8^B8Py@k&`CPUlTzRs`7YU+m>z#AdW zGir^7)FJJ!_dJ^!Cheds#RbT%9E$bY2o&2{wKm$HyJV$TZB94Xlv(iAMlGvqYf5bQhSvJjL&qY5f^u0=jw%j=EZ?%}&cdd1E~obfe95AOrN)Ac zLjZGo=XWflO|lw0SJ2<(zPI{-rS`_sI9-C!1ayOj&gb*4{Vn0Hi+tk1GBeUTo6FK6 zfu$Yj!k)QK{Jh9*arUX_T2v3TgLQi|2whJkSc7L6 z2=KuN#-_lJ`On`<{&>IDbm1EfnnmnX+~s2uo9*Lzw@*&N)Y+84&#gO zEPe7?zQqh>Nd(ab>Q-o*8j2xK#-!w?7(UH<<_PB?01RfUX_owo>~h`@-49_ zlRrOpK+$fM-F7DK_N4icYM+(XwxEyP(_b5LFl2=sO$jPJ06>#odi;U0Nk1YT{yXGz z-kFJE7?3ftyhdii_v-40aSv8WG`} z!S@RC&G>12SM=f*AJkT`RLe#CMp?0Gcn%Ix$b_H-BO>UjLX~pR`l>{#A=OYx4UWL` z@z6+oPlPGO!wVrScq)LRK!1qvY8-@3AhH*U)F_aLT2utNr;8D88nOdtKo#=Ex{!et z_9Z83K;mdOoSI0Nqd+Nf)$}`$eCF(J14g3l>9)+BCd|iqje;jFw01 zqBPVPr!&6_7{GNArx=oOgDw;bBsU0X4Q+uET`Pp38+~+EqAnKr#YPbBTmuC0Ogo{P zs=gW`rRb}1G!UxT<_HBi0pDNoss<_0C@fBm$HMS&^@#As96;O0}$jd~qVF z83R2|4@?kXIt#w>4(yTFP&L?TK9G*tfx^X!ycx)tNVguRWGRX0i>6cr+K^pVNP=|0 zv(&y^iU6;i=AlH+2&xLb80_*5orm5nk5Y3(l3PVWQ5s(wABeI{BZZJQ8drk8(FEbD zF2NzQPg5Z16r?=Z5b{o;{M0~j9Epq`l~rO}MXe)&?SXIt2{xDWA&)R5v=()#Kss0# zOoICOMyTzc1%C_h#YzA}K)k<}yC|6fCjx#!=NFQw@TeV2vvSvHpp3t0D~W`!CiTfG zah-r~^n~P%uni=6Ml&9mHjrkW7Mt;nix!o0FpCR*a8+D}OCh$TJ}9R%*9@VmUhL+M zJ}88YDIUPSMY__{y?lm{OIh26U=IsXaS9`@06sNNMTA;(U;{8!5gFkUp`qkNRkoL! zDS^_3TF@VqG`Y-&&LMo;1FSYC#UYS#7g%nzG#-pKh{QDXvIu$@3pO~IlM#elye$ELK(%_bD2U?Ae(}A3rW%Od5xyC?&B*AVF%zS22IrQpp6R zj0XmCr(>k!hzfuzwqwXW%4ZO8A~G%O0iMr5H-lavs>qz4MB$Txk z)sqM>bU@jufyL2Yl_&wY!$65z`U92$o+^QapTYqaRSa+lT1fQhT>uq0j3ynlg8b(I zW$wrzSdNkq>?kUQ)y+bvB{*S$4}Fk?k*Z?^$B<~5x;`VC4g3a-WGoEUk~Sk_a-b1@ zsMLoff|3EXj>4Wml;ShSPMJ#qsvHII=i;ObaUzs0o$St#;2>Es zTP#P$QgyQgj|M^3az`L9Is6dd1Oub~f9(ASSW{Wt@QdygAV7dn4b@OYx}ge+8mfSx z0RaI)3B4*+!7>I2MY@0#K?NxSf&u~}jx+RbLzgYI@@vgOZaOVB)d%o|x z=e*B(&b{}|10f`PueJVl{nyUkzfEHx7*HJ@QZaETR}Z+BKF79IRHAkOhzb7lXSf@3 z$IBk}@10EH8XJYi(ru-2D=t=Cm3hIDm&1=^C+LBMN1{N`9t#Y?2DJ;YK-ZI5n_^JK zc6q*5EO~a}hKfA|BeO_55%#hwiaN_4wz}>tr4mg(% zk4+Z)O&}Npz8Dx@ji6R3LvT)-;GLvF#|HwUIB6Kr;s_p&ul%24pUuypsv@jnds-I= zwh=LJe8jzp;jy}Kuv@fYy}v5lrv-Cxdpsw>wpNM+fzZXa)I`XlVua_Dhw~?_K_VuB zrro8TWqT+!G8Q8vB(ii5C54|$Cr_cPaOu3>L(a1J4<)v|) zrU0Loa1`yOJ;PPC2wYY-hP7t5=%Hw9OwL`hZDUYa*jlmQqTd7v?1T_|Dn#0XFrbP_ zd-CE?Znh~W0Ybvr{B-{31Ag^pH|-&Q-M%LR&GP@)8bx~>0pq2+2ofN?dZcz>j5Xh~ zmemnP5@9XUfdPCd0eT4`i~vlTkT+dUc9P{sQwgM>LhO8jS@FM20tUYp{Ra$G8f9}6 zx>U$Tb=|pq!s6cSt7I{0@c{Hha)j>r@yVr+`e!E-yN^TMGh{yd=Py4QQ}M_Al0;x( z1GTfEf<5e=tf{C3kaI1mOiStoOX!PHHc= zZRpPAywrlpEF72^XeAY7FbWj^3}L;2QTLW774ooKs_NM&Bzn-elx0|=K<;$DEwzU@ zLW@_E)sf9RFVnk_K(8S8*t0=kU8M3`sFH`r%!I)Ia5MBttyD!Ml^?SP-r}~dSPFDF zc$1K<;gYos>1e$ji83mBHr7IU()eC~0*i(c^O7#y;G~YG^b!&jF*>kc07;yydZH?w z!<`=`mFt8q8i@zs{r$m|N(URGm~E6e4ToLa6%mr;m%`S{EdimvII8fj?OW!uH$9={ zs!YxqIjgS9ic;PL85MmruP+(pkNM>(1}f!UU1a}4tJ zY%mtII2E$}fZZTvlh{T^LZqQ~ehGsR-Y2tX7P?S0!B$pd%19t(bXO#_v_gfvWc9GG(S! znIWbox8zP|KA=7Qxjou??WNaGx)YEtYVHuNgr5ir+xnmTn zaK3Hv=dkD=3%w^_eR}9+C0)e%7CpQ@I>4K-^Px5eV2F@}F(Rk~Y!^XE_5^A&M7gNW zAK10!(TK{|C-2AHwb!jex+16-Ylcf$pdcXDX7!Hc)88-P0u}gsOZY*^1upvJnnu&3 zT{Eiqd`NT?Q_k?J(I}8Qd~(M;eV&XFz_i{n4AF9o@RHtqdNkyfnXzY$OG@l}oFALi zo*1izqJ#M(q-4bYmv+Tx@mP@zRIi^JzxkP*1A3guTdZcE{xG?$1e7W6_)6Yk@~+aq zIyc=?6NQfCIj2$rD(*JrQ5F3JJ(_;+-j6%}e!j)cpx239;LkRoaWt@F1*&wDN>>%S zh4-g12AdxS1<;AGhzZ!MWA^z#M8FUWPv3R7Oh1P?ccdW67OeYt{Zh)Lqx>J|uSH8@ ze@4I%=!=t@9|%$6m%^TmS(Jyp^WXBRd#ib^m{m(kehELq)QwtHWB?aY9kz$UZ73;= z??Am40*=Qdl@}6FU^NP2P8crX*MkQ(C-uZt3%dRF*NU*B0`T^#7Uf3J5$(Ngt|uSK zO4b)quavO}&?)7l?ofgVcIeSu;XzwumT`PI3u3_oZ`wnTrgIja@ZBlQSF;I^R^{s< zs&18?%=I6#$3m>+Dj7IIzJ7>5KQw+y(Bmg1@Bo30oAu_e6r`4F@*dtGrR&LdK_J!Ae)j4>`G50@P zrrDzae0%D>gwUPa*v}@6zILxYWtoOjml3*j3IY+*V-yH$hOBRR+npKDthKe1b8Gb{ zi&3sUL)!CW?t4VhG!?>doioeg7s2joKB{X2BWR~hC)j>xaN%+R6EtZ<=;_$9NIc-v za=}sR;_PBbZ{2S+ma6>3^uga0}7#F!7urk6S!FRY}hszXI_kcA}$S! ze#_>1p zSB`hG6-~?D+qaS97nkQN#nq@be-u_?=WCQ3<&|JMgmi0&hAtT{Q7pmezy1;TdKXfG zZmP&V76^*yE&+?3ITY-T9QG@7MT;ax8lTkIfT z8Y)zmbc@KPGq({_n9ZH1OU9ysek`%Myr6qwWo>C+{H*Mm$y(8r<>jI;<#ZY~savVM zhdTxYrB?q#{buWZnoZG<#0Nsnm!@Ij zc6kmQ88DQPwYqw+trFMbu#QjTT9`uOUNXIPY zr+0M%DDe8obr%SOg`8pN%gUwspB+RJ_Yu}a(`KUzEar%Z#u7v>-cHB4SYpBah@Kf7Tg^b_aa0AdJ*p?)|3 z3bd3m|Fc^^TRJEqXtIFh=OH?0jED;4c_k3~2ise9ttiIo_U;*rJsi}l7v)w62Mqpi zI1qp@IMGW0p0=nL1&sD&xy%1ibd|IUMUc-w&GSm-`D|ZB>q)9cW>=0vEwv-2I0?c% zX;yAuyOryCT{F%5?3G}ZKEgjngw$+R(1d+)`RmWf!ij*J966J(Hp5_xks%0thZVxs zbSjVWr#luh%`tt|get3;DFF*RgHb67Xa7{w;hN{BSQNa)yR}(f`*c`i9Y>V8Og7U z82(Jehk;0rmE9uY6a#MRnLAJAe8!&ub=IY#|15gQEcIczK)}0QWeaoHavtX)IK(`?c23LaJf%U9 zbi2aPoUL2iR4!n5S#-R`X9EQP0;h{T<>05gR)h!!{gPbGrc=a#t;NrnJhOz?i-UMH z2kV9C&F^nT9_{O4%6ll&GHYcNyQt2_RcZC2cm#srJwZk>=Y@F%qqsvjHRR%#XR6%V z`TA1!Q2gc!!BmsGi|n2g2PDVYlq?}nNK$5ydJAQzU%sVq(5AZdZ2N1|1s2^6Z%mmJ z3yaUlq!MXwGgQxtVFEB6gw>c5P36u)TF( zeE86F2EFD$oPAZVZ?>`NVp^{_VfL2;Y$m8>fN!HW(q;3DtlbjXu=1?|QcK$$sQW0e zqI}=|8AdPzeNWQ)^!uQhm`wTsmj$MoXa+01`-y%&O}Ue2%lklxzbBJ`A3eEc%shG1 zPNrVhH7i#)TA79&Z}x@|c^;55!8Bp9;@3LLd)xi_GKL|~8gULF-8vSt;qXaen{*0n zEe&W(l;Pm@)@^lay)_BRG)uNfkDSzftx*L}Z*t1b%F)f%P{${)AZ#VajtmGS_&q^u zpAZn*kp7%7+p%wKmt>`}J}v}BVRx04K%u>FPL%HP`ZAGTVF%_^-A|f_`x;SjH^Rp2 zD1?&xZ=-f#ETMw~FHUzp^8MMmTd$VON`{X*W!}aNh**XTY{OcRDA*=rM^K`-e_C%6 z!Zztu8Ma@X(cbbsGnGhfY1d#gMq$h#^wg5*?U^|CEP7*y=;FUJC09<%s%nhtA>)dB zpC3?-C$+&DyY>okemJlZ3hE~$Bj*iPW?=51FO=joDJifle}Wyty<415ivM8*YVk$y zMdi%2t;UlI3*3AI*J)5Oe(+EJ*pZv!*t=bF0h@g%CnlRuXT{1pQh`qkDC&*a1_2t}6bkBwOIt?yc8mP%-^~*uu>vRSJ z!U(ktBYocnjZ7hJGRa0Bq}`D6rCKwxjOfITvziJhI~?q;MS?i-voeYZJ#g{rlI}$m z3+~K3m6a<+tV`PRht{4;Z$VFrmJ@ULDs~;sG*_dDN#Iz0^|}J;7hE2vg>KBykfR_R zx{nLKcgu%Q9Ty+h3ZmbKAl_sdH;Qx9QZ0yS$p)Ee<0eQXR?KvR87Q*{m)zu|uJjJZ zmE`EzzhD{yGhl@Jw%lG3BEoQZke>6IDrVgPMs%m8a?huVEBY;28~y46ZxSyk+-Y(% z-0UjfoawJr6L8zqu%41IP@atIrnW|qbak>SRjf#C-SHOvi5@mmZhiYf+apj|HMz60 znCcjuj4iMfpE=zTlA9#uq^i9!>0(^p3XvI6*%nEh)fJY)IZI?Dy!m6C6n(o#kv35r zF)zAH{&w2#^${onf7nT`*7y;y9IJ2krq2rH8{(ItPfbiTzPP->nPAR%T)Y3?ZKK|C zl7WBck}>wZPkCaS!UyWE>XH!H6xCM_M1W1qTk4=9&e14iI@Hu-N+s+KRZ>7@Ef_FG z=<>&x8*WH|X>y|B-uxfzTC&)O4 z%DnoJJebSfncGsAR==Xw=((fkht&mO$V)bC&`7?(rP4_=&0c0#4k%;(2x+&zl5H0c zWnvI)Nl!OjyRD6IuAn~d!YTHpSEm69IJq|-o!uXp6MKg}fMJ{w$kcX66fLCFCeqR*BfQU3%G8&+9mbM z!!EF1bMvDqc}1iT@>{otg+0Hp`CMj&tGzv!tJ|H9BLCpGr-+TU+}qg6OP??(F4#&A zl|d0v%y{)#^QTM~f^@(-Sqn?uiF5)UR9_AMASA)qR_*wB=*TACWVbo@21!0Y2=3)l ze%Tb)h7Hz0EG$@5eC1-zpe)?o!T+9?Jlg`5fl1i{g*QXAj`YDnLAgYN;9k%NME})e zo^Ez04HCsy5o^6C9k-GgB+Y#fsaJv(XT%)+!Kk5*2~|<}O!C31QQoVngjqk#g2V%>{4$gK;?1o<~qUInJm&=F@%)u|9k9|qzL zspiBfXcP~W_^8^Wf^D)>5pu9Ny3p7{XaMow`1?LE+_!gD5L}keuEyR3RlyY9e<&QbsAmX4fPq z&#<%)r=UP{3+@X9CA3e#b2Zp9Z6QYv9cZ}p*-T2qseKQfm*|U;t|2ZswgK(VhV|Ij zRG6Pjc&@G3c=%5%ebx&Y8|(?)Y-1Ysj2QX=52*BNG|rBdS3&-HFuUs?ci_9z+aO&S z4D_w&^ai}P?1$Zd^8eyT3$H+jM7K6Y2Ms+~CRl3krNIS*S}Q&hi1%zaYV!|>@((p} zpTU1#GK1w(I7Ct_`>}u`C)rnC(RXG;-#E^h+%R|9Eh9VZ`jT$B+Ve#rcY|8*K93{` z0)kqD^NPIp*G(JipOETM2rtKnYiWr{`Ii`m(ceX8_n*y2Q*(B0%vC2h+-AtHdgZ^i ziBU}!OEzmPcDvw$-JJy9(ZX?EFx;P^W(~X_u^hENI=R}Jw7{I~JsekAic*z=IxX`3~1O|>|rSsY&~mOT8~Fdai*gt8k-EOlP!@y zXQvWZGPh(hVS0mkTA}=h3xB62;x4Fe2f|XaF=jQ?>~r~xl6(?91zwkIR`|Vaf%aF2 z`l+CpeOb6^YWK&E*OV&)KE=Hnn}oei8oOr*Gf6uST=yXxq_p|?cxVb6q;x(?eW0x& z7lhJ)*}5R*aSvn)=qL=r$y}o&PA-Q6r|pbEh~885?3m)CRG4RB80wvwX}TKbpfX%L z^&t){4dJ_#mcUOQt2?lpHfYRr4hs50_i>Jx^o8(H-?&*TE!0it(?d6*u>pCoiJ7{> zUv)2PKKe-BFW34}F^#u86<&Uy zSsQC(=-)B*IOgDqJB*QwtD5vX(uE`S4_(i;V0d?N$+?Ph9aG9HqFp?MiiBzUZSCH; zHb?UGA^U3&y*2kWG;}nh)c7tvZO-fL&PNR26(%$0MA?;lh+v+9Aln;{+}^SgPDFp( z=5jD!>plXpS2Rvhoj`Ckgpyy58y3bE;>jO8rE3YoUJak0swdFQx8&)|z zD4AD}+T$XOo+FgG(BAhbw1gM^x{RimqG(E^W`xSGo{Iuq+8`1sQ(Um2lJAsYbHs?N zdf34UNf8n@eDoR8DaG&3E|aIhACEuC)93g|D=Fcw`(*841sD$r;ywAom&%Sd2U8Ri zh>hfKnwciS#6G^Ca-&V^XnUBtjWn8{=qnUku9v`roXqC>N8X-_$gpvCTybyx$9uKM zUTo?2NC>gM5Y*%CZW@*VVi(03>tDNfTtnEdVwlDm6=tb#mC)UHU5%H-PxhFTZahce z5Um?NJbv3*Ro8}-cD?v>f()642<+UWOCo^DV0WaCNA=+Cw#^K6&zH0WCb@I>EfV;hY5BK2!m&r=as<7#yAGO`GZT1twu_F`X z9%|T1$z(M`tSt4h+gpUAe(jeY<8u+*#Dhkg+v={gsfB8IcLw8u&~IiaG8P%Q?GeXd z_s94)|Kz}T-b}MNuT?LBJnr4%PrdI{S?!>VUM)-`S;XyL9JzsA7X_Aa7xs_@RT(VO z%R}}anNJh{UbDLA2cs4eV^xQ!BZb>LT95bnEE);by-y4;U^%tNFi*{_A$w(doKWm` z%2tz!nKUyuPrA4P4y22UGIujsUT+;YJnG!c8@xuo`4{wZDVmzx<14dCKMy5D#<-6s z_^CtJD#mO1)A;VUbenmY%e3XyR10ytZ-N+P5@|frb5$80WxryW-?0j9^nN%Q3+)*l z5J%iZ9-K3t(mWzj6*mbSL#y|Y?AD{nBC{hXqJrIj`{MFS%BsD)FY8#r+WIQ~`L8RSW(5TYmjvlnIVOV*6 zXoi4k^NvSt3W{zurIjxaR(R&r*_c1*H|}^X#7e*s8LXgf7<(6C^mo#hEkyb{+rmwf zoy7PNHjO+pTOhz2R;bo>fvloJ?YWRmr~XmDy7gp&C5!2yqP0}?&8&w0Jj7Cnm%=VL ze&nBozrNv6Bd7+;=?xjGNHXCPO2Hcla}Rm#GdSLIyWBu6i#Gylos#G?vS+V^SWPU< z-faI^-^g#LR7Ft>#CF%z*(7si_WTTs5R+KCWGrklwlMfst)P zPX~m;T&k%s(c$>(D-jCc)pymK>}lK9M~qf)C@f3{9T!*=NV&|!YVuH16iAymF}tRM zVcXiH*W`s&%+2`=QJ}0{B{{$SHbj82*&+Ml{=6PBJ5Suberscwfm@Q}CC3C5fdj7s zD(AF#hwfz7w)lQqvqQxk0%?28!xpMO3P^&kuFW#mJxy3S(<jG<#t7hOim_ zRV&TKevb3B%20*@!&A2*Imc{Qn?-1EQ!4~ctZhtYRJ}KWrKN@N18Fnj=?Fyww%D?yd$?`;1O$3fb5x!8IQaOQCKJ zTA8zdXFj|}OeEs%!mhg9or$`PU0+921L0;V4D1S(Vy5Ujx26jBLm-Bq{my$d2LFd~ z$?XSsxq&Gw<-!6zC=`X!FsV(Dl|3zqPE_ao2R~d|GMR;#R25bi#>X*ZbxqYE$;!Ws zYzfjN9Dh`W)PW?J$#U-@c2f)2*n=IVGzBYS(dsk~6e4V0Pr=nm?M6I2{Rz_{*@Yl* zK;AuINGu5jvjD>InfYMe!A*MSvImv1V4bMDrm*+w`Sv^I20>XUd_A7(U!bSmYk%d4hVb;;7I<7>od6+~Fc zVXSE)Hx~s9U@y-xzeEbG)poZBtvFe5PoN!eL* zj3mZp_Ba=Ao=D%m;KUo1*p}f?63}>Oh1Ph^W5czow}c|BH?5y%S+g)FWCXkS_-!AB z^mVt32E;bs`vHSxaTb zI)gO+_|t(L^CX)rIk3br0v7eR{8ET31I%fa0XK}WjoKHekLCp1T z&c(0DOp@f=^U~nL70HfeCKwl?!)?xs7Zh7qTr@vo?~->kSh-&bcIlWjyw}BJQSIK? zJAsF^S+LXr6A)wKt?{yML8Ak1jquM?aC@4w>9WW9l0C2KTG|=+JYv+w1Z+Y;z8-zl zwpn2pS|gbEZ}p0t^X0+nRjfU#(bwvYFUY&v9$x9&ZXi=oS#w}FpHZ`Dpr5;7m2~*!;IB4Wvv?ulaiL85Y23%S4zeMLbLT=#hP7h z^)U8$Zl(hb&!oN*=*EkaU<+->itPcewj?k$INbCcW5 zEDO$QDh6Fny!Z<4(4adMFpXeRph$@PJd2Wu%Q+8U>@B+MhlkKUtvkBm+o%kbTaF65 z^L0#R^iwM*=rrJ65Xo@N*sKZ?7k|FV?%gsy2qSgjotQ8UN$+hziywqK^KtyNY@=6v z>p9(cbuMchjUYvcVhCY*j1v_LmK`rHclk0$623nyl}_xNz?{ zub7w&RwXISV=nxxBFN{d1!atCrAGH?9ifbI0YOEfYaAzH! z9&b9B*zuJ(cngHwD$9%EqcIwkp>&&qdmfQMjz;6!=OBx4mpSHd)AoK=J}GE%V45kU z;2hI+K~4p!ikrVsTG@#49N9Gcj#i6W2y~{Q>}DE-Hs?&29zkTiHN{QH9)j3>+fi`b zGSWYR?SCpv6V@IS4u8=BhD_laG7Tj~r{sdo$IIL3Y&GC%pw6{_^+73Bea02z-%%t~ zJ!kprP5z29*$@CddrIj3f#CCe*ZuPF%~{hKiJ++cv~;4r7_c| zJ%k9BE-+6-s6%Oh1rrgY9sJbc0*kJ78#b`{_ZP$WA{WDb-Sm-p6v zC6yj7IF7iFO|>TmMHQ{_D?6#ZscVG{4_v77D%c+ECv$gSn1>DvyA;#XuqLI~`662B zU@bx@3ZKqv3XxX(`QGx=q6LBk7d8Z4?I}h|=5{NEp}E~ak`U$**YP)RXr+uq1np*X zZ#Po7&^e%f;pK*G>L(46Dznf?Fj=?-Ooy`IK}XVyt+VYCg~3%`I=Q?_!%{Nby9r{j6uY>2ry91H$dP;hl;mo4d&)*&;wX?1Idam1ah&g$kpz_j6!8unL!sk>LpX-i zhUE~7o=2EY*CW(XSR!L$GUus5=TvzY5fAIW!d^d=!JULU+rK13J!Ku}0aBY4K6+UQ zf>j2J)~*{uN*z?neWpk%9ap5ss6LoiC3>%J_kAhlZ9?Ve%YIWD~$xh{NMq^9HtY6y|PwEXtHn|?5 z+Rse$IN=pxyeEq#H4taCE`HD3S{DA4?g zzaXf6_=TEII*uK$&Aa)MNo=z;mSc*rN{I(f&>gyMR<&5_c&OEz{qd4 zVE1rFL$cdl!odCsE4zX(-qg0y9_Q@OTdqUvBIUdK?O3H`=Q(#KhcB=%u^Q zjpyGVvBV1`wO6mb8vD#Ifi`Mz&sDVw>`-OkE+EG{2R>z3bFJZK4+Ux}ZeJru=ItyH zx%+yJ90Rh=VTC)c;3OI@N~)QincM?YQUPV}9@|R5QR)g(8|2RnYK5SeREg%5#qyS++&Y zKr3bh&y52kM1=B*^|ywz@GA~#rzU&;X^h$xz2wBjC!;@V);=pGVoIHacLdE_!m&yM%ox_&bv|2RHK8@+?ek9jYs!^=I92S=W`g*vehn zA{6}~ut_2qLU78-a8`7SHg_nLf)u959c9dVOviP92mRor!u3hc-FIf|!lf>QrBGUr zH(0siRalA8{t~_I$w|XtvV{FJm@?+UA?IxyN+9HlSglx4{UP$nzEX1F%xLmC-Ft=f zgkG?7m4RC!>cmvRgKh4w{I?-eHf$C9kV}jTeoNi3-F5~uQZ<-(@Zqgn)@a4roy%KZ zrC8u{h-3b?>yi-`KGere)jRJ1k8N#(cl6j+Vh%#aR$6C$(#{&YAPg&D{TZZXjheN=8RV6is60;tyUC9)u}5!fv`)U^#gX-bjYTufrW> z;`8F4u9gYIJIrVtU^mKde=1fJZn$+$O!dbV_}-blh1;$8AVI&sr}}iww$dTk5I#4z zTp}M`B@Q%sWjV}Af#SUzg869`1kbQU_3&+ZuuRFV!r5tVV2?GGu4s+H|1@#8iKQ@> z1cd{AQ|Atx+7}LE17?Q+zGR`%^>G6y{aMkoE!At|E{piF#QgkZbk-YjaRVUMBQEm? zgXy50a%znx>;^c=ZI8Oe=Pgw@u}%n=S0jTFQP2j(`E85m$A$C5L1^{YfTAyhtk~WE z1HFsFk_@qGX0+ZkELy9*8eAt97=qPiXU?C-wT zmhS_~=tY1+6&+xi1U{tKgv+W%l)Y|>xF!!ZE07Ped0n>9Z-0wz;_r@(%??%LLjz8dJG4?lF2uov$%~+< zZud{?X!>ftx)$EIgmmpeq^-_MzqAU`1J}B8xtKTK*>>!nEfja-uwL%LJm=ADFM)A3 zJ|p-ld3DXxMj^g@evr26iVbb5{d9rld&0mNc~Msn55^PverRx;Np5eu5FZ^@n!7)< z;(+z&Osdyx@S&$d8D%4~8>9`_{_31Ggk8cev34>~6}^npoS*OKn8D}c&*?KaAa@4x zVcDxnF?0|cz`^4&Q%3W(@W`%Iz6)>RpAMBPSoa(p2azxwR7c zw%&=QSw2zfsTRSi1Ziw^am^^+ib2_acXam#Hq`;xlZ>`fZF`Np`bqT$>!LLd-bgtd zNdh*l6=FT0!WCGkAr$9LM&CXb^{#b9q|yChgHK2Bj^S&zCFM%EN>!aK0`5v@%7H3f zB0wmy?S=PxOac^2F9~lGG4354Lwyw>E)8!C06vu9ySAr%+o$=9+Gh9*CuL2mcbD3b z<@5LIh$MkUFue1CDqRok$j1gIRCEA^ji7@!!&>})7`%VLJxgB1&!9(V-5&)YK(@I95f)AG zwht_ihlMOW22P>2ha0nTpzI8n6=q^~EsDaIu&&5vMuFXN#oIqNZYsUjMi}?L_p}Cd zMOmd!A)wbH12x2qg>Os9?Ly#+WG)5eUZ}-v|MkJ9gB_lj2XcqnQ~Fc+s*SnmcUxmK zqgg2`lDt6l6`~MZY$W^o&w@MKtUSm9KTIm4;$bI z(n$x-t?UbCp9LBZgR;r>r^|ey1ZlOKQl$1%8?PVPcqHgh{GE?HV~{w)Fqdw4#c>T_ z3yj=v$IBG1b*)!l`Uh1-3~jqer0|FK8fA%8QE$&{x?_TFq}4{lFb zL8u_diB}I{dKdlvbH1nfInv?y{xx$!Di1&QE2v(8J13}bZ(rju(O>iWV5^9~VE0J! z{$I(fwN3{mThZ?dZ0mxY>neUSTZ`-rG+Sdl15(7R`c-~{{8_{6iY`Y#9q)JA?S_Z; zl6HtfJzwJdXr6U(I1mEiN&)Y00P-xnbr3pMsk{EN!YdvI9(Ec<%g(|T95LZT&Brsb zu6Uu4uiDm0nJ1d(->>(Lx$@*m_~AcvKWvLl&jhX1``n$pl;F(3^ZFTdJEYLd4|5ww zR$Nhlr-GAoJ>Yhb7y%8`nS{Qe#8UZO-W3lhyu0Rz+r#bW*MCWCf5~8XH(VI+_5)jh zxTF9{5BT0aU<>l&p5VJJcfu}yZc8su@S31?5%&csDOd9E`=>u>j__3uKlnsUm8XeC zQS~z~K8^;p^28rpAJ&tJ6T9i0Yan%k>fh9o*{7Ct(%@9|1zH?dFwo_G)ymzNq5`f{! z@KzFJk78&ctr|3YG!^S?Lor(LJ|YEohaU#tjRG=DJ1i@SyRgIeK8dh-$FupwX`2=3 zm{iTEkv$VAt+e)$-&~f^+?pE(1cV7Y>f_D@*N3@RD5CRhdWxBsJ=Fid#Ek!NnB^9f z8+-^@)f-Ie;kM#H&8J^IU1o)^He;U}r@x@N2M1rRLK9+Si#C{p5mHa@AMcFhSnaPD zeKM*8(20wk{-UKSsoQK1t=eplpAytKN6+3b!{Nor_1Z;>>D8nA7YL4hJ=lkO8-_AA zT3=c7FXLekT7B|emT@_H{8@W-N|Bx;&&-3vYe;Kq(d2+*KYCJMbat)O_BjKN?S3?VAe9`-QTWuM9q%J7w8Z zVWVYf4!askOlVM1-pOhw1>A6npt&k>^c}=iu)L(UT}SY=>fsaIF#$2I+Uwum_gk10 z$ooAYFQ>;ye2Gd>PvCmTIS*s68iIg#+Jm1?^oCvh>aUvtvXozUoo9>hm32XVMj8oz z=Yq}gJ>x1ytwj;|A21IDS<|-jgU6jb;i06bv-n=88+XE`RYMkN>vG3w>-5s^wF~9< zJgKMP3`>c^@02jmXN6_X@NYUh&hzrcpCI#J>1ZYpo$l|$wGct!;=aHF@vHYy!YWb9F_g3>ZQ}*6PJ8HL0~3#qdoqM`h!+X)`*KYyq-r+d! zhf~0L!i&4O117CGWdFV8w1U#%6PcNIS6{q4$f^ub*TP{k@!OyO=wG5*XFSu+s*wgB z^5)%*GfMg`^T=<{i8_|nKX@EXP2Mi2Ew3pl!~GJKPCs!_)%(Xqie602lfH!P=yL+; z1SFBGLA6IG|^1#^D>&GAdsNn7MX!Axc`<>U93E+Nvi+d4>A6`}IN8eyn2+{YCw}!M#$y zmE4IAfItNvFubZ{=!bqp+fw(AT=so>AU3Sy{yBa!BXVE3zO)z!+1%>9`hD0R*MLP}q3=YgXyj1N$Vx>_L2q34I(1 zSQO4mQ{uJq-Z~I*O+aNVG2tS=7>2`Pr^n=7>S*w=%%{2=pPVze?)+@1v0S~R)W#CZ zY)q1yN0nIymW{_xBqzZkF$Qi9|9YXcTXmSDzP(dt8ZJLP-C-N#j|rG%GjZr%awRb9~J?gQk9v#ARk-JQY|dnEZf@S1xk)T!KW!kRr0=vS)esdbIvIu6jz<(%^DyE(Zs150Jo0t$y&(dslD7RUtke z(Ai2XVHzo}ee|S7C_fE$ZV7bpPEu~}C-Ho;y5aLq+pyE#S`^t_3W2Rv-PCbryj|4- zo5D$JPXB>&Q<01p2ZpnUf%ZfN`TjgLgceXO1y2j-ieB&wfb=o60&>-wHrjX~w$Vm9 zkBZc~wH;hDtF(H2-E#hG^T;dO9_Kt5DrvyN&c2n`k2xwTvfxc(p0qe9`rR)QwCDFQ z9@=JddQ8@)7K}3iq+axn3t$NsbuT69Uhf}I*TmR|X_E!Wk9<;s)%N>SC8&K4r<8ZK zc}o>?ti_9@@@^vs|LQMGgykJObCc@#ae2!DbX>Jf<6#2fCe_%wkrCM$zVn>upHK0r z&@l78T7)3chQ-xB%C|4G?27!gtU!$Svl z<%>5HM4MOg4$(^Qj<(KAscx0ar^&D<=i&>yi!G1$LhakEH+t~5%l(c3Q57r(%6+2l zwfIKOrGRp*mXmbY!IS?0s6p82!~Xo|hkv&A z94P8y$Ax|rC9q3}sPR=pl*J_}RYxT!FyW8fB|1pS3?a_;m@G_wzIb&J6cP}R&CsuGNNCM(Ll=LPfOJi}>*|I3vO@4n0* z9d5f@BdD6>!$;6VXi1I-B2PE~4`hmx{m%2UE@cicERrUWWRR?BmrUcX8I5-Pk2$-R(_`tXLYPG@*80G)8@vj{T!;sBUQ z(yo2OpSN{>NJD1|gc0;YWiN;pjRo4?c?K^AVUqIs{g=Sw$tt`Ws#h-f_C7U|7m$B~ zl8V;|P54!41r~*)Wf~|!hh(h=dp=5uUOA$E^{|d~n8nmri2Lw*Bt>WbW+>K-H3)j?BK^G?s zwNKAyuB^L@slr?F<2yn7loZ2DryTvr|I#BmiP);PBxTyMqF%JDD30P9eg5FF;aaNI zs=^Zq0@2}`RFz#G9L}|aIRW)}WmTCAYOpY1!hMEW%dSV#bySY)-Al;)*P4R#p{LjX zWAV>1?y5hQ;~!$K$$=G$*7-UAQ(d*7KI@h!jOhE;E|-!)9YT@mEe`oqCjZ)lJHn3N zyc)XugkpEknajuA<;qYXuw}(q7{eUvq+Ch5cE+3_4Yod?x#!p9gr*=7NSzr^T-0I+RMSfgoOQ2$1S`ZI%j@1ah(y3P_9%`K4YFg zb9Z6RDsRO{3R8-7M*A4a-A^Zdw_aP{O;$q?^+d-;o#+h-#+ zSAF}3*yO5rPuiu+>g3bXc>YyoB36_mC7!SI?p3vIZ?NMHxZHh1W0=F#!r5uvR-e5{ z;1~Y~l;-Af+2-7KY3?=Jl*zbGIbjXN+vI1@8jFPd>)i=`J;NY3U^_HX_q<8*FSRmK z16rrkcCsQ~LN{dF#RaW9zi>m?4@pnjExF-f$bO%dB>=LmcN9bRnr{<%DkwL^5Iy+C zN?1u>k~cK`gm#{7ru}A>YpNl7xj5(?`2^{I$$?_j9COa!T`0#xIQLV!t>n(4wy4Xg z-9MaHJ+)|b0i~UTWKnTsXHMN=;EBf*l-^AKsnwKQo}7O)fgt^l;Vn0v(Me5`SoxQk z^6}hnv}b7Hdb!-}3B{F_8*(P^+h%;aeJ=QuK%ti4Dc%ow%(cqJwtwUi z_AB>^n5%(M>x0iy*6UNSq_?K*)y6jR54?c92thaLTOilfW$=4`ds-Z!%py4ek=AJ8h zj)%|#q?L9OovyZtl6b^ojcn z|Dd0MEpZ5*#DL!d@Q@H9HcUJTk)R<=27*I9p8{F}8$b*+6TC%1m~6N;1N)|%NmE2y zVlW^g8omPWqhDJx%pejb5gjNGj*E(BSD*PA%8o&!|*ogw*m#BvBV#7!vVyCCn zA`(orZvlu$E@$^}@Q8$)D55H%R?NU5;F*Xqp}oaY5c(=-G9*5um}mhB0lKXjdh;6r z0SO66_f5ppu=WwoDeSu>&{{bY>DR!i+M8EEyfge&lR&uN->4>>W1^U7Z!zq@G&@IJ zIx22HO#mstb*VtsCisaql%7z@M+&+%5bEx8_*z13I^RGbfP!Hka9P#GL0?fQY>w@gI_YzOx2muU09;{Rq#HuQ$8LK)gq4jk*{}2bn}bslVPm zj1WOGiv(f`+pB-)DMAbV|D4rbt(03)7kRi*~o0MM;_jOJO zGT38xL&-;27&01znuAfB;c!&!EmedC+S*m=A%yb=pVY|g%!1=5u!ijM!^jWT`q(6! zUh%J@TaAEnnEfzru{}G)9?cBidI?DH6Fm}v*&Koe8W_S5H-r(+%8a0<3EfPMfQOqf zcNZh#XAnqAhJ%4Ta)eSYgT}hMBjQg0<0rCdNh`aAu~MatO)f4h=aL~U8RXG)m!uFhy%lp5YjGBB31k#l z&gIY2`SW|Bx2jfn(2xRMG}7$x(QS$){Nf0^grf+2QH5M21bLD+{i>;{y}3|k&@alC z1p(tnBZJR?oy`!?9+?GJ)v!S|0>c#>OtD`IN0Hp+eAu|;YFNi??yLrxr6b$Z%gWQU zx#z425y}i{(2*jc3n}0qL3k0>x-1ZnAxU(Efcc843E51D!CP=cMW3sz5rJ~5H&A_k zfde~)!i%4z_NZ7ChuEVZsj^7DaL||@F|={T_l9l;Khyrs4fhHVL&J` zFM2;BI+8z{Lid+s`s(4NyAb-c?wVOVlE3@}hA$)pdtWr#aTD@=!I*3)zsnj0O8u|n_@iaok zDwpvLCt08%^%0uAAsYM^DfE0nWx)$mSe=0wyu}SKSv`r4 zQQ!;Ac;liVAsR^`iNF0PUB)HM&c*V~ze%Qchc zlw7z0nU;wtmD&O-6=o`=Jad5_eG}$NFl?Yx9Q9&Y^i5N_m`qNB9*WNX5rha;&og{+ z3{D^90y8Qc5X{*Nwy1>==OjAnukbaKm*q`@ylgtLjSMXWVgh~!f4fj}Gr|<=AtRHt zF?1g~r*5}Ht&uoTguPxqSzUQoSY8RRo*x^i0-!t%ScocdfpOeKA`rBHZF)xJ>}QzzqF^tiWyA{9{M%qfow<<0e-X6|?dtpNWBNC_nVxQH;?HYa9dmEDzVE3T&_$cbd0naNR-jn)>5UuJz zHVk6h8*jms72aV8(atLGi77i}Rk+wxv`Hog!Bx`~^Tvbrg~e6ra;pB$zC)ndQPrz6 zLklH@omWcy&frq?ck;sVvz&~+`iqoF8{0$fFvR_KQ3AG~;YS$ZiaW1tz4CtSnVd9X z*mQKwsU5uCDtf$P?k5l~|2m%3Tf$FISQsM~gYYojQB04p&hmo_dKYnTxdeWIwn=6! zKH=*DpZyi}Y^GxuI9=W8-NVvro z-j}49DVr({_G?SMWYjrn?LEOBv(Gjn>6d`_OCW?@MZZXQ?X3`Ly=Yw8)#8lVfkm1QQCdK^pUBokfs&(N} zO|Qs|aJg28ywp*JO~wp83_(1+0<*=&h50s+BEK>`>QnQTCr^d)0PkfXE70_sierGy;{%)8hVt;e2pRKQNVj@mdLjB4_ zzr=5`b4?`;_;D^72j9S9K6Ik{EBkBJYveoGv>HYKJ)!OoIX8pH2jh&Rbigo#+ zo`MKB$tDn$-NSL*nBTD8RCB%Q2DYkb7pJ6*32cET5s4(fl;vF0XoVi&CL{BY7U*2Q zGsvuZEY)X<7VpO5DXMGDiUWbU-N%ZFW84!N+5GxP;_7+yZn08CM554}l&X$_kP-_p z?>7!q&`HWj?X~yrfoh#7^s@=)Vxxi7X0jZRFkB0%`Z%>DGPDR=Z+J(hX_Fi=>?<}leAgUepTUI9mk5F= z8tW8+L}R}4SrvU^vEP~Z@i!rC)}Nw)Z;NbO=-pvR(|=-mJL%5w4!Kj>hoW>Lpk#RL z!!U+bM*JtTY|ki;Etl|}m|gtKeXv;rTjvgYH>LTF4ZqJ6J>hUsRg{IY3MeOY|U4Q6O&kDAIU zqB-zv6|ux&TOxzkzWCXZGy3`5*S(cbRliFlLf#6aO1X3gZvD+Ve?%$f^D{K;Xn;IEMvA(6BNzQnHZ4upE1(t`R|*}KfX^_E~h}IFExp`KR1aF zk9c>q2Y$9+?J`&!E|oXH2#(T3VVr)D)o5t#GU2a(b_3qrZ_!V8{?6K1@fXFTp`-EG z#qtPaDG%NQA%OJ$4j-I!95#RLwcsQA_LaN$d0U|vWAC2cU0(tZug|_29WKB%Bg%f#5=M5eMS1p5K&oGO>GP1^8(GKhvOA)0xttuIXXbc8tQ_5 zwSD2%i+i;_Y&J!yUI~wVMtW~*I8dL~U@K4n!Q7@CR97Ii4xv2hoAzwIJX4WpD(S^0 zmv#q4fYobc8`)nmUKL4?G*pd8r|Py7z3B8;d@20XrH}cm$v#XLXT?+nC-lkDXvG0r zL$SCRR2%5Q{`P^*&Y~*<6i>_@QFzG)@!|5)c&VqrHaTIS9HKcB>m8MezRL^gD15V) zY{4$U(73S4otOz}`S5SSiFJn`^+Jvsk_W<$&N_1|u7A7&k|cc%HL?%fXqt*cfr$uF z!eaj`M?>DJghV9{(1$e%@wP?*;;4Dhh^-BK_9V4J-nXIRK#JyRme<=EH}A&5-cv?P zi6RNAHBMxZP$W@y7u&DT+XV}ww4GO$x+O1w_+XmdFgXr&8m$}UwmWLs5?Ww~d?n(0 zyD<5xW2k8ekFIxr%z;L#o9>uom9BtAb%i9vdOVpw-rqHNb09QptM)0|WEh}|_10Ff zBZl6i)h7;@Zu+M9AU> zcGf^bHV#L8y4TY5`WdO>(GbM(dXFadJ0^kFX#_+~*<_1| zZv&5`A*9ekEgiCO+3XRlDk-dM+x>*ZZZQe`sdaz?VT+kFGXg;z)XPOAD$fko?v~m{ zV7YISJR3K~{qn-O*yOCCfarTvL(uatr+Y7&CdoOAP8|3~O|le43S4eZ2b7sIc<&9T zo~aP%Evq9sJNTF`#ZAaquyt$c<`pF5?O33Mb!Jpvi8zisXXKB)uk+R7@p;}u8eQZQ zbtlWnMctma1j7#uD1KiS#nozgrra5Rh^|LMw)K?7 z@M_8{leGVniT(NCTUPCPsVjhZlQra=EE{!!#U+{x_iX5ar#TAL59pecD)yODa0vqS z*8Sb_Q@T@-zDhCgGmXvXU2VWCDXhjxt{_a46p15CgDrQY2F8`)CiE27wDAPQzS!gz zjZabvG^;*vY~Vv}D3O!aDBEsPU~K?{iQOEhy4uT^q-Z%7jaMvrW{DCIP~B<3XMI@h zXnZg_n*)i%bnDERR1Go-qf{g6owszaXKWKygtR(pgMg}j^cko$popKGE*!w?tK6zQ z7Q;bC%X=WDwCCMlou&70^h@3AxHyP@3(~HsMi1df!P52R*4jaGodet{pxoLe%U2u6 zux^o1rltV1`jK_r6dBbI7vIZ>tN=9N(CS0vLV18}p*WD!aJ}60{n^J5B&%pSAyY}w zy+s<@7yq|3))~l&k>se`UH-x{GkSFq6}o**`mU0q<@=KVK)=WeSxVosW3{hjwwmR{ z>&$v0nS>e-*uk0kp-r~ktw5NBWQtaX6u-};fMEOt_R8)2EA!Cg$pEK?KDe}-5M8_5 z!BqEI2{CmYSETp;?MuEg2+Hr3hq9Hr!$9O}s8i+^QC2H}o-4Zle1N%Qa}krw=Z zI-R9~@)@0*LK;M~%#uWiD$2rJD2U;`N6kN3T208@0d3F_lH$2DqAjZG&(;c0K>st3 z)4Qd}C$yQu>=xHI88S_kGx)?9pd<<6tD3&n#Su|0qwz=xmzoYeq^ihC>&$X*d>O}d z$^BuxJkg{KRF-_6$8n8#%;E2PIRkrfKLt6lgM`?~>vrT-zdZ0sU!i%5iq}e#sv%!^ zmQzQ*82AIzt5w3AW7i#N%yCA{(`tb&?zvC&=t?DaN{)-_`FBo5+92$imW1igHu9~@ zxrv=t5soM`wN6=BPSGvJID!L#Nq22Rwfacz0sDxX-n$p;E%f+$hLUmE{8S+CDG43( z{G0J)42UYPJJ8nj8aleuR=EyygpuU|rJ{sf_Wf491*A%N<_GOgzps2M23=3mBm#4H zOX7i#@U2t#X*}V^UqOAFUWq-OAkmg&YFCh7o7##3Uz(Om{*2t8?S156UgBNh-Y{iuCo z1ZonR^y7JW0Xbx{y1^-X80^z{&3pq5QOv9jHEr4#=&LQah+&@DewhS}-Va-*fIkKs z;g(J@Z`}qf4d5_FRS=oDEIzawgu$aZB~z(8(IaZk?U^|H%I(-fjvCTrU(M)elD2w& zPT0H5POsSa>UJ^??@ji{90h`kckwWILcLx_dP*vz0-_I_fw-2?4HgC26ilvsf_G+r z0zuCjsJ)3CIiFT&rm4huAfT9%U5}j6y>U@f*d=p-DJY_TV=7tK93p+?G?kp$H_X2` zoG+P@5!o$@C$aiG2GJzN>`tG1)0IpxCnX)wTEW=49SIw|3%OZ26pW?**ri>~tmBkrOO^jOG17Opl1 z2$%GfJM?@*p2f-Rgth?+MO*fh$Ce&sfH`{8hr0!IE--4gjMfbW+>F+87mmk3;mX0c zZ!erqspf#FL)=n4K5AVI|LC?i7!*2H)Yb@??UR)yB*8poktRcR5xY^Pxp|;1n*yoP z)aln`d!>uirVzSNTST$NNd*E>5Chm7CA|hny%8KIU3Y4OIi-gh zE6;bo69*yoc$xEWAbbD_^r#DG#dBk7G=Q-8t?pDPxfY}*#nP-x({G#8@wH0`%iW7o zVL-pDJaN$`2I)z2(WO9pz_amCm7{LL&>QHsLK)eVwk5a0TrMviCjE1+SvfDeJO-P? zq%K{0OTp3nF2^0^UIS`IZPu{vt6u#n8AF<|#XODwP@B$$o-Z&J*Eks2rU<4E42WDj z={Q*NGS!aJcCX_#-SzOm6xK(dldiBFrNLLOSZ}f=&<(?**EYMkIAL))QR^}oDfHtj z0H>`-CZ;=33+DQRhRvNb-ClxxXrXOd#q~5tf`#NuYDJnkQ|Spd2Z7zZVML?bkdx^?K#?zH_!?w-X+iG9JN2U6Bv9);S!r$Q`I4G!c2LtU z)dclUkYp}C7QOUA_o7{iTldOM4}jh>?FiBBhWPJOXU+L1!SI|aaP2Ysy}F`IgS#s+AZtiSoQ?9MLNebgLpK)*WGU zdDprA8n{DY2l@6u%qr0!`*SjZL#t}t?f5y@+VdqTp;-61OU3f00L?3qX(Xsd~c^~zb@TA(JbY0Q8dlUSLd@`_XtNi?zE_FlI`$Zcbw zNE*n8GO8fC7D%cSernv}gkzW6Tz)Al`?hDR+X!5CC|2G3&_kuHcpID^K`!|j^_;xw zSGu)UxtVdxhbCUitRAOM%P4ASPIlSpPxh$q)P`_BXbm=cdN9Z~o3b^5eF=E5ytUY( z@N$(f%}uMpaI?%;8AfrBwk0%-*zx>>7TJMwdW>ib)k#Q5AuVbta?<#P9@5eaLZ31{diB`A> zLy*FLkH@~(tw~h3>r;;@IHa&b3dMUdE2lu?9szGO`q<}qttFS()}EoKUTA!+U1OL6 zuTIP4_ASv2EF;3ueFWkv6YRWLzUxTlbag`zbzI3IuDrrk$(b?H4oSZ7Luw#hsh(idwQfr9M2s38lYn!xTh!Y+r% zAVAF3z&})cCTngX?gihqYblhwPuBD@FG|ofDyOIEU{$LI)n*39B@zUjuZA_p(%Qrz z^{0i(4oTQ5Gzoz`lqphB?YFWX1r$vc) zQ1Jk9Wh}J0JXO_GNk1+e`R~Vn#Uq9l7#8fKt*c|WF2+APCVHJ8D~7c$E_h#{PI!d= ze@!2B@GvqkfPZz@8`A&%7d-Uf528z7Z=h?azh2Ks521q>`i2ON{$JDm|NIdf9m9&E z(U550{V_5BlkNUjpZ|a93kZ)yJ0LW2TT&VJsMMY*-=i1T~bqzr`&_o!`; zpXG19k^Rftu85^r-G0l%SF|gq|Zo?VL4Q&Q%>qubY$k*zpAl zB%8AwiZh265<#f&)Ir?OSVx;M&G9i$DqJXV_7nbI;jv?4;gC@7&cgPht>I&va;-Hs zNvS941s1inY^xnB&LXysF1ZV7`mPRMU+FWc5b^CiC0?>`-|sz8AX?6{A5a|VN5~r! z=oJsjprs?|NlzkAUHbR5DjHpH)jRZ2yroqtHj#51-g$|-U0pxBJ@U27VAyiW zRZ$rc+|6sgA)%aB^`OHu{=Pw1p8t}pF%~M#c7_6}0nKqc>cTq8#azLdO=E+3Q1-C% z2InWPvG)(sKMXpCUENmv!LH7rI?MRp+Vn|b_nb-2Fhpt{)1tS!6j3^aEU5*qcOy z{gm;b2WAb~s6YxrB{OZ~eYKDD%e-?p77kuI(6w=VYg z@oKs7z}V-)qN_e|ZWf%9H&?qyJ@Gc?_P&Dl1t^e}2n<$sIS{D)e+X6}P^QgRji%pg znb{wfD#w0Z^2u5s7gtq167?l3TrRnOl||7#hct&j{}w-4^QjoKmf`#rR~W6%=S&&ayYK5KKN@m_Sbmyzsl`4N!4uHsL>w*0p6`FXbsx(Bt3E ztj>;dzg?fDYn3edH0S4QQrCaaa;tWFocV!V*l`@^rCY6_>1NT{< zNIZRRtaQsnXQjB$Yo{m4p1-(;w(;?b?9bB}cM(=|eYAMimKfZeeYgb*oAwos`oC7x>KBcyAKR5 z<3e?$tF3MPUaB*(wdoNVnhitWEZ#IqHrJBV&KE#|d{Ey;lLCVZ3sYPSS94gF+hFNg z$1^vx$xX)nc^zs#ywKf9d}lj<)Z z>$p+3%KA@5Z5O8d{>%1Ipun8v7@#;a3L-pDrE!xF>Isko^=^U2s>5?< zPZ&?{nf;P;L#^t4epL8uk7~xAW`a$=+nZNTAFLaQZMoa#&Aus3wDvYhKbKd!6>{z` zx3qIX!?(zZ($#@lC>G3jm}?6&s5C?g z#43RZ6{n2}bfnJgMC=%{Wg>iCz-?CH zPTODYCP$yh)_qWUUAJv#o2l5DyB$wYrp~-GhXNfD0lwXXCIuRn|3W=&U0)yLR#{=fgqniLBoLu z9uItHp4~JV#Au9sm5vduODt4;1JGHi5%_ zx`2g1@@c|iXcHTC?NPdQ&gm@`!*Ts7pZ5@0yEF~Wb$m;0;wyi4O{;!ZuWtU3GhS!l zB2@nF-dwc%AwI>&IT<;Nxn3VaScg+yUYxq@EoT$~1u7C*-h)*NWN)r-W3FI=2^7(| zjal=wF6^Me95MLz!-1hqg95uFUF>u<6fQ&^*n9F~wdb^JZgNP0)v8&YXG*VUnwnna zrgUa&rlqF}hK--N*}cyj3Uub5iIqWuC(+_&2t*u6K41ce(?ilgr*f#Mg5#ygr!ETB z>c;LbPd%2cx!vh_)%N4l+xW!MlzlEuK|Im(%S;E**@Z5 zMNbOVZJTP;-!9Uimnx{+xt})o{HC^$a{Bcfhj&7OT1A!vK+y)HL4WAKo!tcE$a>_??3X+jYxU4MgH@6B!dKljA%|&g%Cfb&`Kg zhXQrwEPG-zxDXAqPzRPyH)5`E)xo?hqC|uF^YDeKbdlig?dv~lBux12u{?5tpY?b3 z>+!Q{);|Tw?LPMRmqU)LFWJ<8NJ`@CmhO|h(P$I=XMKD!B}EAeG?=p-4FvK=ODxp2 zpJ1-N9%j=t#OlzO1K-;;&h9*XY0uDZpZH(TjJpUmr-us4Sgb7>f33aSwaUiTamN-H z^W%<=yDG+xI|!<+4=}qJ;nUwT{zUg+K^e_G4+?Z6XE~S~tO%yLRsy&5@rEvUm7cFq zamwI6-aO^Gfrv|Cl&`;3Cu)*< zPCkwU1)39Cj#?22^X&$##)2*fEEII1@v2&_%fPADQmv>qp;@a@>7`q@Z#%Cq+IwuS z>8QPWdxK($VvBA1FHbg}7hC-PefgDbZ@|IQ$xRX6dtUDpy7b%L&rqNRkma!XPK2wt zc^+&Y!m91?)4ObI_6eRj-XNY8iBq`KNE6-^c;{tN{9R2+abddaSp8c2F)1+<0kx?% zo9I9Hd!&YjhFuOi(=A2MNj&#PL~F!(^D`*WbCKl~tWppwr&2&VHT%TPa+rlK6uOUP zH_m;X^UMzjk5^eM{H9-$`bRpWch`iCk9DmNPjPF8YnRxC_=SXXvzgM7r@H-lZ2MP*355ea(K!IL}ELQ;g%p-Vlgo+S-5py+6psfg)hca=8*3KHIC51@ftr=Q3 z1Uya(yQ{uYHD49wnq6sIJNlIJI&G zrBy5D^N`x2WSA#=DSy4#Ad(g1% zyO`4|>_>A;l8h64tSJ(V?>pTF^#-Hbzl~lvSbz1WxV!PaP@rcy%UM`D6)nfA;3h07 zSRkl{4u*-xo!USMp0@w_cl9$D8^7-zk^6YHT-HzR_FRCx@6(-fw%dZoXBARTt3E4` zS=eOu`-ADr;gi3AcKTkIw)cpd{~xl~pg_-amdkJqpg6o(7kWI^+>{58Ph*g_pcX=6 zjyUaXtl5Gh~5(MYu6@9iia!q6C z{i$&Dh-S5Zp}&iQM<#B~?D=bT z`|C@8c%;2?zmc%rnqR==rfJvWenpwQbAG%tN87G1HBRz4d-@BDYn!)1ffjR?j{||a zsfZ|C;3*+^B8XMsav+s6K)<4qW|E2@r`Vl5pV(hAKdP+~DXhMEH1Bo%513a%YYVUvF{Cjro?}q6@Q+u9K%%;^F;sSIo=R}CUdoFjfvtS?Y zPdoWjp#>V!Zbuq3V?$3%6gCx8f{tEPO&CE1LJyL_eke4wmcui7@C1%GP#i2yaa#&L zAN&6L(wj43hMOv_^M?M+lK&`Q_eIV`f1P(Nb@^OOgYB8%;t#5+2J<&k%kHuqXQEa& zjP6~%_xr-(l56`j z{B_*-jR^hn?Qip%>PM35H(mX%eyVlVbJ7`(e>~c;=k4!uZnyu`{`y<=%l=ij{+^-) z-o7*Pt7H2^G%4gPpXDY6Z*<*dHUnan4Ogsatj>qN{(1g>)K_b#?VnpW9yk`u`@$yM z|GDuai}Tt>8h<2Qvb}OTEG^E)RI{vN`FdF7pZWGpN1nG75F<>AWTLKZo0_3^R6v11 z_Bo4VAU#yP7;gPCQCS5y1Y7|)g%ulhh3DPpHfGiy{qWFUc$sOPaU(TP=$$V+M=Vn^ zSH!-}*W+W0^@V2Fnw=X;mRvtSEbSE#I0^p>n@!lQ}ZST@zc=XiZ%j=uYH`o`>QTJY%CHW%Su2fg;DXt9!e&Xx4{k%Ho>OVvWb z^fJ1pYMpP4pT+f71CF2j$JQXnF{Q$@ITAE9Rz;SxKtIs6=dlnX6IP}N1WXU#hpqiT zNLI{VJ1aZ(>z^N8TtpIRM>u@D6+URmuuAK?dU~D0Lslz=-Rl3vbK=@o=Q=Y#Jh(x!{}JantLIN6WLX&*JW>e+UUrH%b=1`_b}A z*}G0z$<<;0H`UByHdON;%xG8NX~mNsW8i7>hhfm+OtN@wG)wu4nA zhaZ0Z*?QBu%cX*)t3+PElzcgUY}3So+^~a1=acVqTnlAlMX)Gb-zlr$X$1U=;(*24 zK1vPxf7p6GMYVL@yYnF`{1=K%Xn+4RLhM!H*#0#W#|_wqCGwIp6FEeVfl(( z($!nvEmE2*l5$q9|M=}-*v8g4?*nUf-2PNb@UIKZR4`7}o#rN=9O&B=m`y1}C1czW z52Pm`mTV{xa#1IxdcW$)oqofO)x{quN+QWgBbr%WO6;{4rz>8>rv>p7baZq+_l4mp zlgz5&+mCqFEpj(sF>~wf-x*S16H}4lHiS;#BFjZU9FTm(&4v&#ubQi@2!xhc-Q7is zB-YK&J??xXtJjD%U6_==)n<{e)>ghdKh}Kx)ldtchhA18>K?N30>PbTs)UM7;u`Zs zWrN=}j|D3CmI zZsxaRbL`6x|J%bG#`p*K2h>i6%ZUuFAGx z1*}o6@Vx6FG+t6u_314)ZRc|<5_qQ+P;IMVSH*H(Z z8AA>{RTnP_{wrfw$h79ZSMjg^?1=p%^px)JRdwG(j~UC4ZsgMny>Q^#rK6`CwwUY< z;|i3+Efm<8CvaWP3OzzgT8iSE-@GI2yVop;m7lJCtU4~Fu^JR5huq8(r`vSO?GmgS zg(cq>7M!;?51B|0*RtO%c=r3&*2BM696I6f=cN9mXyf{S)r<`E>l9RT5x^CQ-XsSw zKTtApO8XyQDn5R2sKn^^vFOT2)3b-)3(0wGA<4jM#_+#?FR`YD|8eA_ zL-@jK$MwHDDLmh3hSz@h)GE}HQhC;D_L`(&<>zO+-^65x9Nc;K@9zoMgDiZqZJWQO z{xWUMlW=3Nc|SKPaI>5Un+i2&4klLU3a|*KWFpa;8`UL;zdzLvyxVB``pD{toOkoPgc=R+Tt3@LoK4!-(phh6Q5pQ8lN230pkW>X_QC<*m0TnnXP z{ZP8F37m=6j3hfYTFQCGXkYvI;LG8*-}dh_>p%5rw}(jGt3wByPL0pL_A39PzVp4k z(l{NzcSC&E7N@C!s)+0R*BrwY{&H{s!-KzkdKveZ)05-D+_asJmOhBcJmv~&&_WDU zbMO$x=!-J58>yy~Uk}j$zqU3_)Ya+>(IJcW5@nnefxU@*ZFw-(_T0 zy8T?WNLOs;i3cxazuga5RrG83K=?5=A^hE_H&;?lYrnn`muBd3eJr+*cfwt{CXKyM zvS;M_Shf#?n-pO7fyd>zr4O9J(IOaKrX=MrBqaIeP>^b$5zEKJ+H!13;l%VKQ7S5K zoO5ClcFYgjNki^K`4qi2j>1Ee#?4P`8=TksEXrk#g%0J&4XE2~h~>Im0_NHj>{vZs zg=b}A1&YIknDwr!)!FMYPM>#kFY-KJXQ!YrV3^)NuHhTXpA~uYWK-yR{iBy0T)sB{ zCjPqU+i#tNwW}S+ae2%90z6{v9c}^>PWD zPKPR93H<0evCdB`;B!i#$O(e3$wVXBw9STZLQ64TvGe-V%+bnI#?gU$+(Py?b1jsKWjP8|oH9J131Ss4 z_0eKm`9!dIj~?5#HKtH6KWE!)a*arnJ1bhntgkuLMDAnV>`1wK;JOR+Kkxkg=HP>^ zdmk9ykI7(t9u$;(#5oUsa2^=R70bG*?R93+Jb7saPK zn~It9fAwo&d$P}l9k(5@j3{-O9+UFIRpLu z@5ldNJ^u6afBeHEV&Zl72L}F^^zlDG|3{auZ}|Uq{*RF^{lCxu`M=|_BQS91$~|Zi zq6D4*bH_y*px0o#JzhMfo7fkXF1{=FysF71=4`qxuWmVY-xIQx*=VkZU9@t@n9RTF}HBV!I@blnyO)49WBM7 z$e1&wAIq8F41FbSZZDcBr)R%=bWL=wVpX|$+HSRk+qo_f)`z5;#Yu3|%}9!zHJjY> zlGbhluhLAwd%^HMiuuZul}Qlz)Qlw0c}zDZCp|U(BnRGeqk#9G(>NmL9jB5SOu%+3 zhBnM3UX$l?oE|N;^u#`ThZKissFs=dgg!KpBxs&?D#_OHlME-&EKUmRL&eM{H;LD5 zh{~}x10&!y>5$-zn$^m1G)zdVIWz-5NhBAZjH;G?PECL!(;@&b-lH%aB?cqqhEK>1 zH_HiGVGKijvt>JK=NujV8a9JuY__K4sTzB41|H7N1v|e%0hzS@g}} z#WLNS;MKV@ck(H)-Lta3a(4mj)!OFx+ov?(tH_%#yvsxfz$?|p_}o)jZQvD8V{rDV zZO!17&DD6P(rs;Mdn->%{V(Lo#Nn&j>sJd)Z})>&I|g1nETi1~58I(i2J$i}DOs%h z>ZI{!K{RVo9~r$DW`91X^UEZanJ?XW9#mDZfwbmiq?6rROyPKhK~hYXaI#r>@<~%n zp+=3UpD$0e)2ORGm#H_Zb$JYZ+VHC3vhYT-ZXd-$v$4-5){c;_#M%B-kMG0usV(O$p(|}lfCwE6w{-2+>a<@d+IEsNE z?Ynx0cXwL3#QIMc#=2iQx_c(s>(8SPz|W^xmRq5}`+xYsM90IkyD8?FAnF6u=rNP$ zDg~4kG2yw>5fWQbf3s~-**30nV_a*;dxIU~n;a#q?i#qViY+5(NCRQ;LT5>Tq?Y~I zI8VhkZ%uGsV0>Y1$*C75XEf^3O%Mv)1U}Mh;?nEl(re?gpQq&ol@!+2ozfhsdDVIG z<^SqO5Or`BFrTSxjZ)d_q+;a+UZC1#lc9FydUaK-qO?ZG4KNw+h;IT4-4&DYZv!9* zdALbp^p2c^*qTWvZI_+elTKEXJ6--)4~M%34&p$u{75bi$))Vn)*d*;pP}M29&(}F zm+bVay4gk}us;19im{9{bU z>Hau`{n)q=ej)If)W&06!IN0s3g zq>$&fDZ2&-qyZbN!Ht{DcKSrJLE^_FjtIir->l^zZk1ORd}?jFitSy~9TLH(p2eRD z?s;zt#Xc8wielwx;80u>T(3cQZ~^lZ6IFXsP2VFVIi-P!nBx(-bRYLqi}7dHrq|S+ z!dkJqW8kpU#Wt@d{tPIVf=|`dw`e)MH-%G_vx`eI_wD-nCD0MNwaaAe0&D^FSijVX zc6!&@!6nv#ojMc;*j%iaJ1-nz{mT(Oh6`xP zYgZu-?((v;h0JuB2A>!DBk(`1QJ{5UIWUoCmgi?`WHjC32#PQ&6gBZ|HF(ubjl|9o zx~gIoMP@*SBVn$(rh43|o>t}Lq%O&Ew$oTsS>P0+?m}@=uPYER*I0AX2|;EO2;euF z88l>v&_ob6-5O5X+m)&$d~cep6?ID2eO8ulr@IKs8(Vd0Fq=QCDnP3pCp-9_iF!3! z_Y^qUf%mrCsjuPOG+SF;Fb>`mM-XRJ+m%C$L}fEn-A*`!ob3zM4K!7#f?7-MRE?@F zW`O$P6@8w3#?`ULv?Qnt99&$yTC`AIE_KqO+JIUxrFH6r?S@+Omu_za76Cf*oR0Os zSD2u6?c%H176e%)@*(ATS=X(`>N0{_27YVce953D<$`M5pJFbc$SH6l@&6CrXaih6 zvv~>@R8x#V@C075$IyTOd2;%X|Nd`1X@lYntn!$+T5(o$$!el~N9KsB4=ExzJ4Y4b{+YrTS*} zllJwcWY@+dW6yks1J5$RJWhX(B1rL)=5iu$`e5jCJ_+J#4P;=mD7^h zysMy^fZk{n;3U9jfE!dfWtsr55H=@OID_}lSBeFh(0kCOkCWX1_f@Xb689CwPW?2x z9jF@BtCP6zsa01=a92!qRR!q2=0I9tD0I6uRiMI!?~y7vP>IQ4yXt~Gs7^6E{xuvi zCw28|2|LialO1@^*^a-0BL3RqSFYna?~1y1VP zR*6d0)GF#WYsqM)M|y1(+37}|(@ol1Z&AXWY`!EHYp>3$eUfTEK&_gI z+Ex(_@7-&Lu-RaxMIiF%BVF^zLNp}?PuwbtuxXY7X_md_5phg@is()p!za;P2XS`u ztn%_?6ybE9Ke|XzBr1~3w1msqM7gqvUh(~LJwn@Wt82v4(4;AZEQ0}hBBG*q##nwq zVG%KLN7$US%v|hpR%zr2m?qXREG-S9snRmCa`FnRX^Kk9DjunkvAri5Q3jR+d zq6=zb*C8yQ!v!^b6>#b3?h4%h(;tX{@c*+P|5xY8|6hIl=g0r(bVCDOU7cXR|B@>J z|EI_QbanOVbiM!a_@6HQzpwxMzvW?T2{EV$UNdf&#SU2EMj}X1OiaXvb?XiuJgCD8 zXC2zVPsewE_&WbMf8TZceS-b=N3S#6X}f)$Id=J`fh%)e^!|XDi2cF)V*I1D_2^st z{10fyY_il{Z)3Q_*2&4y(9OkSjh>M&D?DP89$n86ybcTA7rNJXzn}l6xNtqtGwd2d zh5YvgB4$im3oz#|fq#R;S%LoRLLveY0`h(4`#eIiv$nNH?_z<2SLA=6Lo5&;0!X9; z9`MA&!^6u*Ch>uXh@c=pSyV(!OjJZvR9s4KmAHhAq^KxWkt!oEzk2m*@l{GHN(w4+ z3ab@hBRH@tA1|LUi6pEbAu6Hp|MBB{7a~f+Y2ma8I3)xxiX({PzV{)k;qgpvisU|U zcrY9B@{#xj1i=Pv6ac6@8zmM1BFORbX0Kqq#a7nb~~M2Tz9#-d-(eK2LuKM zheXH39yk~me<+EQoRXS$JUuVJ;ACM@amlH3l~vU>=WFZgTQ0Y@wO{GD+S$|F*FP{g zG(0kXcVcpCdgk8j!lTDeo-RIn{$lCvyZ3*5`1t3izdl2`a0ua_N%QKXT0?WC9Ktk06R{K|afwu=4La{`S81(Q38N&Xw}XM@9o{*LrN{KmT|W z5834R4^=awCvQ30SnE2y{{1f}%BEmXzr#mUA6x&%I$LdE-r5+v%$m;l8^smFt9STprIK3uD ziR`e`Au8(6o^FjgbjYWQM)q@xF8gD(9g^WaJb1~Du`y7oW>)0LDW=IAvwphby#d=B zveuh_f3ef|-G{2#j)9F%(o)@dkqKt@gm;&o?hIe6oKD}mNqvU&QJ5n#QZ(xM9r;kt zEN5G*lLnF1%hleBx;bysgK{?2A5q}+5y3b`I11;jcQhJ=C zU0F;FlZ)pwM7Z}?!w0E78(v(yCv6w9@$|v`b%fz#-45&W*M5Bm z{>GinG}K;i`Ih|I>r!&-!ED^>8*0ajTP{39*t*y5e@8TizayM;Ge%oE2K(Y31xIHe zes=$FpKGoT>+6daz9U4>XSV~?*GJ2h9cu~Bk~rHho3poII^j}=_MM-0@CREMzlb%m zj{k6rW%G+(TGTHxty!Hp>zuCc>3hOTZCv-ttj}|Ge1F=lZ{(tfzy9v@9q9=cjQYIhuISy(O4qk+Z+!jr#dpNl`S))}7sd_` zObr}p=i8ZXq)@v3&>xpb3Wjakg?Dr=Pl!H}y>;o&>)#Q_tzT6SxM>{Ov~k_Wgz1af zaer=k_P+9q%=u$4e;4+BXj=0fIb(lp-XPvdeBb<; zdoLZ1Nd-OA{Emt=l+gU3O?uOgy+u4xeq2`^_#Lsj z^X)jgd&cRHn_dnVweJ7W&#S)Gt@tN-&F-9xuN!ZD-Th5E^~=z)k45JVQv1)yYEZu# z-@cr;Ve6nV5O<5mmgc~(zomYqEEf4baJPI{O~n$O&oxHjX6(e^D1UeDwC~o%Pxzubp z-#f5*HDSy0#TbWQ5|p0(`t|Ks4Xd{`>8n;RU;M*fJWqG^`EQYxU&M~x_;jpWy!7>_ zGtbAjW|mM8lTl&y#!a1NhJB1PS0n%4vUlX?jem=0Nm}#uev{4oj@;4(Mz_CytlH$r z!75E21!SBe#`pEI^s`^zT(AARuju_xtCy{A>HK#5b>qR1q{VCPj?*R1$Mz0XhHu?2 z^ghIu_T_&0?>QcClRqU?BgY}jyZqcm(^t_5S!@NHTbs5Bj4Ny&cX=u`E8o{tsi#t}5+=Ri@D2DtA`ReKA)!_I8Q&_8_N8~l=G_@#ersrHQ~2=|;I zI)sFi*Ma3{r4hi;Z%Gf^>uVj@@qdMi{{YB((2R9m-kJ2H{u2KH3*-T=S!A8K%V*Q3 zGhDBS{9)pae$M9aOYrriwwCx0Jesjc%aA@rWbS>tFSmf}wb2eyoo z^IPhxI^($lFwAf{I0pl*N3g*uxH_uqrPco8y`-&s9dr1z!y$JKUK9T8ayRl?(bMm2 zwJTwFr(MB!Zp48k5^r3Cf-*b%SDonp01@T6zPFE1u}gbfhgg#8-t5e%>_A=Ms^Li> zZW+dX^IXTqh)utW;g;6w?!oS@7HfsJk)skxz1MpHMq6sA$>-%2y2~Lo?o0I&udltg zk?H<9Iq){DJ#DeU{{U%g1I2$3^t~rny3?YxxxTxGW{mA+NWX-hbf* z)rK>hZKPw>lz&?Bza2{~K0fgTuv}b3=JIiyd08EmijuhTrLe~7rnGfM z=c#Obqw9+4=9;{!ka zYV=PP_CTj@Jvnz>iz#WASDKaCwA1WvZzomDM{g03uN_+h zkH-}*ucT`lI1j4n8ikBRh4U^UDw)UtZW&&_{-0Xv509?&D~a^K30P@%x<#zd941&^ zX)gAirdc0)l30R9ImRoz@OO`Ne-xn6bt_b~zqnG3Yd7y8xftX|#C+Tg?O+&o&syQF zkHykTtEcXMA5!n3(KcOK`N(8e zg`XiD6Y~Ws$Z~lAXRQ``mb=y)QkA9f?SJ7~IE5l~i5r5%b0!xD$`OKPn1!uqv zSLMz#oPUvCHSr5i((FDWUg?$=g3ix%qL`sORC$V<%H!_v-MV9eTzG8a73AZ|vTyDw zrk1BTu1@cmgUICj3S_Jo8{B1%04I`iIu88*06O#^iFUTq_{I+fcxOe^t??Q}=?$bo z=9W-M17VKtnmZ`zh7XyfgdjfpBh+Ed4%?acW5!b#!J6j|x<+=%p@M1yN{ak@bW&K+Ei zSScWb+z?6NnyPt>qd#Yehb!N`#j(kSAa_+wgS2dJ=+4mtF!`|CT)36dQ`%Id~eP5zpRjrE}<8Jws!bHm^Sut>u*kP51<=Jd`7 zzCX#WB+zxsh|5Ev>dX)EE}t4;x1gDSu{Aj?zR*|B2$8sbpyThWbgTDX zHu06x1%DIjDV_(EV~FP&9HN8Q-n~ka#q)cLHuG=%g=SG65b<2WyuSkt7ZrG^jTq7(GL(^~MOV4d+$k zQqoGv+3pEDT^~5d9Fof%5k%5UB#9hogDmXLwNwoCB!Trc(SO1L<5wVm!Zm!`c>~OZ z9CPa@xvp~F=1Aj-t8dH0#B(g7zt;oWR>c1M@ejzdL?y$MUY*;XacU>uRwZm(z92Ynbk>?ybtRc@Gee%OH=QJ@Lp& zupF|HgMv9nu+?#fH#x4s-51a&=HU;s_`C!H-ijU>Ed#A zdzj_5hA3@BL&{SZaG)g-+irZIfv%dyr3GyOCb!<9iGqIdh*=ll*r43R;ex4xgmMC+^np zO&ZGTpe%*lZ_Y3<2_=0nI#%b$M*jecs?UM{03IWu{{W`a);6heJ;o%vx44QFZOWf# zeW3K*%v5CHu;c(a>UphijngFlC9s+)R#@cI)sfJGtPHZ?f;b|+y93S3?`rPP3aqcG z>RvYg0FgIP8;a#4T!W6Xpsy71xj*opYi-CUP>_yKA27#X{{UB~741GXUEUGAUAwm! z2T%HM9eAINL2n!DWk?76PGT|s{{Z>zS>(UNm#^rJ>U@7Az1Cfm_HVG{uxon-+s^>p z$H(L=%bNt`h9^IlHR(F@u>G9$lw)~hA{9N+ht zOLgdvSN)%^r8DbVd!5$%E$%Un1Ct^)eyWTA0DKxxf%-_Z*SuA3fcctn8g;vO1I?Im z{{ViY{D;=B{07oyw$X2OiPy`IQD~M9e)KVJ!}|ix*ge3{rgFXv_<{?c9r%w9pleR| zmf7QW$)q3;Q?g)vaHrFc8xc1;mEAqG{Qm&q%1dL)tVjA3AdDX@D`(UUAM^hJ>Z=ig zW)6=eY_GW_PnFSu1Ta0A5s*i5T{p!I4ETS>S0Q36W2s2@R*XLG^USgP5cyy|7TZ!$b zhV8cF=3Rw|1Eekaz|O!Jimt<+$*2cS*C6m;H8a%tDP zO23Od6W|;P(?zy7x{(~IbG69Fp(~H1qPcI1+LLO35j8m)Lh;zLSi%n&3Co|w*}niQ zz`@7sE)*ZauP>GKE6nRY0N%(hwT&)mrI}thuGGlo&f?6Da!yG&Ps+Lf0F8xhJ|Nv( z;0)>Z_ZjKRZy!VV1!sIW))z+crk8gsD#1DX9OU2tlHdc+KqOen_6O3sPmcOs_3w(b z!D(wGvR~LeoH$>-FnsOfrw$H%0X+f3t4&bM9rRL9@+tf}o8BI?TaS8TdJ*czWw<>KcvG%QSm{EBnJdr~U)-Aw4o{yEJLkqXoY=;nXd-{{V~E zYpi%L!dl7&BIaK)uzu-#a!AjnLFd}MuJ|X|Za00=1Lp_+nV;!h{nNgo@EQy$Cq&hP z$&=DD?X>*@&ZFqH$Z0kWtLpYzQjE3j%y2h3!m$C*;G5X=;1f$NlBI>I7xr5Rx$0jO z@1nNWJOgp4Gb+JwZmtR`a;m1>vB2l9dJ4SJ-}NfLfv)4>$o~L@bKy14x*-!u zBv%@cLU!&|QX|RqDH5Ff*O5|-p@pYaNvTWnW3q2k%=}#~+}jNv}lsS*PnhAA9W!Q-DovHZQDo3tyhz zWg!%)JynhsfIUGt$Qe6hb7}nlb&jrBU3;zJX zkg)#%fRB3Td@ye=Y%S!nOQ_olx|SSuI8Iu1YpgV#05imC0eP^o)0 zroSclqpvQ4c!;K(OZ>Dqp}K$VbhevNhVC}=96Clp4uFP1$zJE7<7os|KZ7mrC(&ZG zwvbxK5RlCxxDo=)*idjlI0{MX1~JyIMR#oW*BVB#cc;M6#>;6sT*vZ;jgz3;hEU(# z0OW8h4(2HI`?s*YdmG{yFh-nXc~D)7VBnLUTNqF|>z_J}E^2b8_OyFxrS)4aneO5% z%AA!%uC-g)>un$1^E!LfT|Y{^l3zCA9XzIjaxmoZ0~}-ydBMgGahz2px4pZVt;O}t z-Pe^I4|Ov$Izj+Da0knkYy}5#+*q89oQFxCGBn*P>@*G@M2V52IgNt2K*x4-kV5hS z`c=6#Nz5;ArNZ`6#Kl}mDHjew$;iP}bI;7%iO4?mEHu(eEk8Xp_0|6X!RxX!o;r$3 zt$6a=O;h>X`p~~FrEzI@t}HjA9X?=@UO_ZzBr^dR3>Y7qAP~7$Q=atbuXT|&m#Ie4 zMXA^_mY!n8?v+N>^FZJ~mP!%}ZVWdZqOj&>D6Jv2y_Q=jWl62$-?&ebk_f;VCCAQ5 zJqTR&u9`U#NYZE>Ol3m`2k!&ie?RhTO4xW)iuYE!ZRD1{?zg@Abw|%)({-gOEn9E# zEO_Hz*7c-I%cElwSuX2)Xv4H>PYod_1h&#Z-~bC_B-TZ?rErE%wZO(G+@zAmoWw!r zdIH1_oPu~D^yZVqmyz39c`{_Y#49Kqlm{>RWDj;7>CJy&_p3IaeG#2Vg{|h8!6Stv zU}pn($pG>>!5rp_R8=Z5j4AuN{+)VjeP3P9ybcp1h+y!7y$87PHmH1l1pn< zh)Hv4AQC_kl(doV9QMfib?aJR9&aX}#kO*}NSN3zRY%MIwqBmq?B(?1A9;1}=%4C& zRpHAwP4sp>XT~5O3*3UBk22UFLO#KUwbY1UTXW+l?1kj{qzRI@2&Il>-#j@bsIDV3>9 z*YrnBD9W`?SledxcH39@8`1cW;k3UGZ9E^Sc#c^ij@BreSZt>ZBti&u%x45T2J=50sBTGS|VEuP6z7ykfwl}*DZrvUUh@7DO6UGPVT^#P{pJ|DB5>_i?^ zwbNmdVqP|SX#$r8p$M=7BCE{-Om}u0v@$g^7uk6 zDay}%zsQG5s-~*So8|AVzVipi9~BO-qsyb{I&`{x7ZG_gT--7V1ZNaC$#MIF1wlET_t zerPgo*?<8DJ6oac&MKktSHi-0(JhGYyGLJtYU-hep+cLd2x#~7G>#t;QNCJj+f5TX zZ9m4I2Jw!M{hhCyD@hmwEsmn$R51Q1+>jf-3XsFNUX;r=_+Q|+ZBE+rO-rqev6Q?w zQ{eSj*K-k`oB{4Yu59?5;aM9_i)>UMyZw#G@BP}0c#Gjm?h)wrqdXnDM<@RP9sdA0 z`d6Crh^EwL)L&2Q{EPaoD))3{_doJ3d>Yi@)_iT^EpGNmqtq{BR=0uNZdik+;q-<$ z_xrz%177$|5CL?HL<60pNpaYb{3G7GaQIb25bDPEYSy=>Uy#11ih6q~eb4-lHhdKF z+i(mql{h%T=j;7z=r4!9GqKk^Jqf?mtzgw5K^5#$N~l?f9$*I_D{#Xeq;{?rO?%-n z2O4#$1B{I-U;Zcj{{Sf4SolLB!|7Ipagub&2^vCw*+u-3W76^qt?9x!+#NcJFnS&i&~Q3Pr8*# zTw7h7!7ohhb{j}Nm9Tw}TH}{m_&yhE>DK&lh0~@TzLbAzd?IBd`#vs5In(Fo>&0VN zETdA4DZAb~F#5J7f6J+T%sI- z;(2v6^HRzYo7u7>~`8rmXR)rO2k@?pZV&4-gHFmlE&l)nKCOsL_;UN1#HY%GoUq{I zJpTZn^V+*Fh8{P64cxAms?1wKl<@t2#KfF3{{Yi7{6n|i7~~r(d+> zl-+zG;Fzv+k4x@y z!Dp9v03aNksbP`WlhU<35vk~scuPsQvDGY{A+m-xLvVqRh}1A;Cn|H0b6#B-_%9sG zBzChS=Y|P<2*S-CmzUFg& zHMzFF@s_=NZ77-vwFyjay(CZ-NgaqgP6+K(bn6SvOHhkV)2-g>_Th+%B^`OmB%T6+ z$tQtbn#=HjU5*Klvs+Iji!QANszMBD7u!)MlLPq5kRu&1i-XfUc@^m% zHSqi|d#CDtA-}wvNwBuLpHaB;wh0bm2?EBXZC3fd=p^h4Nh}R>e-7uey0`Hc#0^VJ zgu`Hl+fA}a)FrfPrTnPZpkux|MY3y4c;4F19L}t(^MK^+QdyYp!*WULYJVKVFNgFSJx5ZzxoNJhmOWMMBzT$B zLn}vb2~rw3gn?8A!8ywlxrxiM*Sv3eq-Y6esM{o$du*-5u?K7BOKBcUhkmLVqxnjY zy1|Ze1yp5=#bH%!BaC9XuHL&^?cI54rR}booS3Xs@e=2kO_yT>UGT)ZPO%-dmN!-g zONr9XqcRI42^#I*PnpWS!)#s$G39_uk!g?t0l(YE@`DRbR>WwvXiWzfCq0 zFAUgU={kP3cjDWB4Z$F2Ep6`^C6sJ(t}u%lfE+L*2Y?A6@F%(O#;c-RS7ZD-h%~_X!fsd5oeU#-8#u5$mN>>Rh0%?0e)-_rzF;u=Zu5BJ568VYAIV? znzOpwR`0!!0-Db8K0VdDt4o)) z?BAZ97w6cQ>brFOj>6O7%<$`0+Jx8E(c8x9B#>FyG+t>#y>pi#eqcHdha6T9 z#^}%dB^G>a&4Q9JM?P$xhO*wu%#5|9C)l7ptDo^iMjOZy4e_Uw!iT^gGjtj0^sh$^ ziG-x0m56oKSzYdZAL8u)0KzpcI6i%+AZH)xQFgC9iL9(XB@5uXi9yBPaLrgD3Isv7cLe@=#5-xzAs$tZ@~RS?dJ z)U1Vob?KG_^f(Nx<2>YJl&{@O*ZhvzE6UyMzaQ)RXFB%R`pv}pnUV{MCw7{5`$8th zKQRrwjevCdusGn6Q>L^u-w$8tx^>J`PpLAk<;-kMaKfV=QWL{7Zf(rDTpR+~$jZL3 zXpv`;BAN!`JA@mfZ(!Kqj^N>ka1RvQ0J7gf8#1!AtGP+)0o;0h4SG_SEL^O8#wL|F zf#;oNI&{_J6s>laidy~aPrS1Yo$;}rCA25aXupgv%DageCppPn4`Wa+k9^WDVZiB< z%Ypv@k5^GC+)ELjc_-^kO~OIAl6W0^=Dd&X3bwtM_47VThZN)J%5sBOle^I84vThj zSydHOmL@@g$Fcg<8g`#1p&QE!BC4Da?m;-L5~+y=<{n9Tz^gJC_q?lfz24w6lzo*>zI#@-cNwMzAQ7NU}SrI6{6<4_-&t zk7|{4o92xqNYT}~7-51sj{cPI5vgrs4T8Q}ul4@5v!X~_O|>P6A}|g|OjfnA6)Dk# z)votDv046Qguzh6dqpQxn)gei^09?wWcM>k7Ufn>31UZbIKbzSYTD>?k_VdxbIx4n z{{TU$G!6d%XuTY6%8kG9CmpJNOH`81Wr8SUe4t>=_{YqBI`pjS)voJ0bj~?v`Nk_3 z>~Pc7?2?abz0pd266QEef=FcB$y9bH800_luLX1p$X~mmR)`{{YuhPZv|!&C7Lf#B?~bF^(FqGrX0o z?6mK;jErb^0FT~8anNsUkNkF#v`eH=Lqzx-s=uN412uD3ZBZpgvy%|*!;OHP=dU9; z#yV7bcCR0nBEMpjh9J2ZMmhHAeL=-2*2Fk-#i!)AF^>@EE|<2ARVCFW7T2n^((^Jc zEhW5X5Pjvt5Lje_PdGnHhVs^1NfH~4%Feri;DR|GzM%e9siMfA@Q_|AwpI6$k4^dh zzsi%umeS99h6v<*!l0E>c?`$5)K^lj)prNAk7F<5OjNT7QLj}-n^)CETJgQFZsjW* z8E;~Cfp-OMq%d5AjDwty&)Cvk*-dQA9Oadm5&*{|*Mt6lI@IvgQbKMFsOV12Ga(uK z-9P%(Tg4$w%y}!HBZH25k~;qYKWdm_B`iaxtzu!sSn1{y!os3)T-J776Kl($<*yFJt-M=d7m6YN_$3CEaKgPM=4>P8sS0H94 z$UO9A{{ZXOG_g~uPI7j-vBQVrOwPU@wN7-L5_>ML-Mq^qMYuePBhGROB=h-F4HD!G zD?%IBet-5_*OF-Ah`jQwOOeYQ43pA}dy9LJe3_$^0s+~Bk4onH<$H5Y5F!s9pqkQZ^r27e#v*1ac1@rJph!)XPTo&A>0Cy-s%~r~{v#r(I0TWofBN;UyZ}KU4xgrLEW$9w(}%Q*Yh6DBmov?= z7}ZX7CDG|+qrJ4#t&wxan$L)QROp(W^buM@+vBshMp(fg#Ke+ay$R{g0LiBKf5fr) zbHf+94aJm~Of?vFFWs<6nVDUBaGN*%Y-ISL_yVCvkJwrz`{7131)%;5$ zJ+-~di1eFy%0OfsZjh2%L$vhZa(Lu}Ru36zns%Xkt3ev-+R&DJEk4{hTYDRL*e>!w z;K;x?0Fs~qg09G4xOmW5SgS*_(Oa|i-S@C#?T4>Yn&{eJCP;>9UTce)#Md)Q z^UWfr-SROk#16xr2c{{rKqTBlGDx}EEN5%SoMeJIAJ@G<7=Ce(2R-^zi+sle)b{%S z0H4CS)3drfl-idv+=klP-r6OK+8E(g0Ya$i2N?IM8Aj5iZc~6p2O}qnQbFXA_~VKQ z$t0X-k52SmwnG^LtZB9+Sl6&c0C&#h zm6VU9JYAFF=G&d$X|u=v1;bu;EN*p({vhdAL_OQ;amy5J*xj~AJ969tb{uCM_pe0p za+BfK9AMqqj+y@em#BMJjcYo#wc+0#>o=Axu*ogN+vA=h@yi=XSxFpm(5VO4)QZ|9u){{FJ3P&0T2*4ah6fwhOG0z8%4QzNzM%Fx2;%k2pYS$mT`%20u zY)8M!JA`nqdJF(a-~vu}8qM)Gr){i!Lc6`Qb&}j4A~_eNf;je<9>jx#>5ppft^7H9 z8)K?epSJeAvzIN~NqesAX1DD3{0Rxeee5Va^y86Oo*ucomhBRIi6uvbw$=;51$_tm zU(4{_88T-)XO2C``TQ%I@WI9WS#GxH2OWOr=hOMun?fnjo3Z5JsX}->MB2MbHuAiU z?NsMVx*&plhx&cis=gT@L3E_!_t@Zn(>1F)j$2K-8Ry7hjDNCwRZk3tFkJK2Vfp!M z{{YshkNdQ}f5?h${{Uyy{{S3+DH+}&Ryxk$Fg7P3@&0fJ`Qo*7L5(KZ1E1Z4z{hIK z*FgT)$Y3)Xay>uEHLs&*`zq4}pWTiyeFbld{{VM~%kn);*}v?Z67rwsP|(TyZTKVQ z-`sG1cju3-Q}GKo_NXNP0LwKQ2cE2dsQrGGZ$SS5kE@}$=L3_@erEit4SW7V#{>_N zI*fO2zpZUef3?rk{EogI_j9=VKm8=x(02_g*C#n#;~j}V{c6L~#r%^?Et7!C2H;3L zl;@6m<7quX`sTNEFh8>Gc;m}XG5&wg>6hW#h;8SZDW+K2)pqV98B*E$bsT#d=cd|? zR+aT%nc`uajT+KQ_O_l^>-~BYe{7g!5nowN41jV`cMja+?|z1^T|sH6TdRy=l76^(cR0)Nl={c9OP=_*iZ{suGq z6)^CWWVg28_U~2mY|GH1Xf>yWk1HF4kGq}2r{(@lYToK_SxB+W&KZX8BhMK>)E~;S z?5^#Ow>8v~q$vBy-ZqRgE)Kc{DbX50DkH}PwoyYpYZX< zqJWZf8+}`${*{g%HlsWr<4!C6j$hYQbo|1d_jsc0WqfVaeP`z~?_o z!lM1vKcD7!6<_Y@zbE;#p4IMd(@~x{?yiw{VO1p{C^$Vo&-JP^&2=yfJ@(Bx{d!ekaBvg@oafsl{{UL{sYNI&BlYZ$F2cMO3eKA5 zvUjq*`<;%FxOh)V$RqwH7hQV)0IGm~eQI?CfWG-Z=klg$fDZ=f#N(U$%;WvYDahF) zZzmqTE6K*M-k+A|F8KQ2;+N*d!3QUj&uJ2)}+Az^cduvant_* z)m%*;SO8d_Nc894mx4gfJA>)X2XO0-IU_WrgU6x#>4}IK<$3hU&otA*a!x+I4k^PN z0K8|Aezb>;ry!h;huWGE6oe7&fC zL8EB%y^<(5SGL}Jg31_$9)lyUdCwK--Yp??6$kjQ>_Gnjz_@G6^-{L}FY#xHmLVf) zA~9?ZG4`nfM;j1$!u-wO1TUptRKIlnf5`ewH?mb+sz;j3Mcv-Z^D_KNt!frFb7}Wi zvd^ww#IfGE!iyVXpo>%hZANT@;XuH`@{j4^+EKkr}gJfG)&&biNZo$Fku zz=OykulXEbf%!@?Vq#i$PTYPxD_Jl0b<`D3yfb}UlFgS@pIMGDr**jH<>Ebbk#T3l zC(-a%pQn1+Yd)*cNG;IU1o`WnTVGo%B$`xivi*W- z5L7GlTD|FIv%MN~5Zf{f{W%KEN9@B~D-0lSz}AZ21qc`W|`ziOwfvYj@TA}9V#40{;L$%}m7miq{JcXDzfw>s{5itX0r zsNYsBDV9F%sb@d{H+JgevAtEiR@J>b12U?ad!=(FDLaBL0uy)3bi-o}AL+FJYP z%D|PKz=muDZKNB_lE!3KXQW-gtzySV)vPI5|39BvDjhOM66?zc=;Mk|S#{ocO`USJ z`Q9aFH5RG_@IQd1=lCB7&lh4zotQCVI9Gs%s`IjI^p`hnWtxT zo{$l^yq9tJz<}Alfmvr=7qj%JSFKxep5fqa?|c+#yZ!}Ki0d0K_L+b$-pgY%Wn z+hD)Hm+vbVoyU6%%UXsSU-oGAuw2`~!-5D5eU&Yl#)^>-d+8k*yy`<&m)73oRJnlF z7U~+(R`qA~D@{WtXje-*q_4u)ZD8L^gerSc)zV*Wznl-izEj9h90N7Rrg)%-lQLFs z;=h+Lo{^nS$>Yw;Oq`_{X;ZEzgY1Od8Zn7Vhcei8Svp8*@Q~FO3j1u+Q=|eud2p;J0^%W`&u|LP?PWr05TH1zAE=4cZ zww;91dLC$vOHvyP#RgRR=WL&h)b=ftk}EdFIhw8dkzVooSOf6x4L zmqfJ}E0_BUV5a%RXkNvC0G-qkBf>6x>{MQM??Rja&KTGe(ZJ=OkhwNTdxTGSB|W_20$p&&bx1RT4WJ z$DTR4?ij8^FGc>zXo>~D_`fHu6}ZgvKwYYUP(L^fbR}}gv;t*Q<#DG|>}c#o{z`q6 zK7$ufaQX<)XEH@v4?ZOXsxWYS=oS^BEmXfVt168%Nr|l+|5f)=#A7m2f7-*NFNO(qBGg*5;jPB+%POeW$C-Sil z#W@rX^U%fF$(wxdF5RiVOzFj`#BYuQk6zTTQ_*xQ?yTIZhwReMxJ5 zz)uBUx066gF;VvwA+-yK%u2q};@xl&Hw_DSw8Z^A?|7)dc@yqFx3)Ny$!0irv&>S43%+u2) z{biIA0HYxX%hOKQwfJueU8>a2nKYr0`1jB zC2Vw)x%kaQo9ZhCnm`KTU#(G8I?uCks@FA2f`X^^$v(IN-x%d=)CKrH=Lqfi$j=EI z&iBW5a<(kCjXltwfhL3CLf=C*MY}Z_mA#DO8<7($OBo@n?NdQGl%`<1C z-Z(oWYpQIJPO17WJtA^4uFdlyOG~Nr(9)8_F%2I5`7rAxEXKjb)@DvT>N1A9ql!S7 zrEL7xRN-ozCpakeAAtL#oPC&;^g4k)scKhcQOw2tAAp@kIAF9FI1O1hI?yBH&M{A7&R2IQv zJMClrj<+cW0f{zfc>2_FX=ePOIp((pz!k;I9lwBr+yL-5yDB2Za#`<-mk$F0wkd?5 zV~fhF5O;@H^b*gjzjo$kpWkZ^TWy^U_I(4e|BFAEkug){gWm2p%ZzT|z;j=*m=_yI+C)L6wJ z^zxPDq3t-VL`nzG-Qia$1D#{mlWC)a!HsV`UvD>(XAHbeu5bsPJ1u~pOLX$o_Og8j`&hnY3ZdY@a`BQX-pIOO z&IKIA>Ex4N%nwno1D08+{Qn~4akE}2XX4$PyfI}=)hiDz-*7ag-RgRy*JxpzyW@FC zyOHUa5m0CH<@DJz5*jb*m6@0l#9T=k)0v!|X3F#LI?Wef22mkDU_td{*oym?yUzhSeO^{Gn=+Un84rZ5ujlshYBHo0A>8pX&Nl#ULs5BXs%r z5)3yl+YoK8Wbj#HSU(>MGGf;J^E6hXgv-k{pmC>Qjtd@CyTJ(zQPYrloY$x1)FYI+e6Xhz|!^_Za;qC#U7c zBCiZ(-&$WPo$=m&>9X{jw(9;rzze4DA`EC2DuVCU2lieEG-Lbqf%P$P>b$U=V!pF>rvn5iQo>dWyWyfAis#aTXo0@zjcJF9wq8~?O)q!#sE>X90- zlM^asKJ+(REt36#ytPoQkpAMr(ly)Tn?d#~w{C*@uQT)(#Se5zmBD47Azo^F&V#JB zjc8=$yMB9M=Mf-)@vLl6|6J-6oQspXw>7;to5uOGU7)<>8s9{n7~k<&pVBH63_Lw6 zGZ&=E{pg{ysjG|oFk>|D5Z=f|p*a74$kcqY>uHgjD)-<^u9E(DxQABp;0?_Qg6gy< z)Arz=kkIt5g2x^1YwTvD`#pLl2zTTuzg@zGI^tAf21%O+@b0KI=vM1C{JJ%|(sR+V zs0xfduj0KsH?s@292*uz+>Yq&12y!mUDC-0-WR9I-bjodKv=}}9wkvb30q(7lmqEW zaZGD3yL=WYhZ34R*J`~KnWtULIMTll8J@qYU-&X~TNVmKz@d$?!-%kdQP;?JKPJP{ju zO4{$`C7X>}KRcwj>Q(0A9TYp5_8C=Wx2`&=3W}G|xyzr6+g3_1XT76eS4~X!v1Roq z+B~OxyAMcheWG64WQ#!q1~8Yjr*rYIlt@0wpUC{po-?V^IdY=i5-ro}l4N;U6PbiB z1>XwL?>4H<(wq6qU0-X(CGxw>K_QTWD;f~&i=^-UTE;L?7h>{wP~s0SgIluh>5Y!s zgO*#0?}N{A#9a=Nc%I_DOwYy$O~*~Y=cjNu@guVkYzV$1moeI3b*Akj7<*?LI1v9q zN^C-vFjn11aVsfZNoo_x_DR`ZVHU^msk15|y;&DrTsNcW-rz7e2LI5(p-3UWy(M+* z`)HVDQE?}$$Q%Y9G&|kG?pk90lem9R)Hda^DF{hSp1p$gx656!mYQdsK+ei;YNWgX zK{+(5S6JyfpAxaxS zx<$)Yh@Y3m^Th#f4S!KA?nrKCj5dJR+LBRF&`@Y-vbFq?!M`BEpSsuB~3xSXTKfKJVgDbD`4JD zV4A^`1l#AwYiJtQTV_RYkbFnw^uW}B8@qg|b?FM*uwM_@GhBgboF8vJ@@4M!0-x}1F`R2xZ_cO8jBhQeS*gmE8$cX{SE@Hwx8744_$n0e%$;`_w%k$YZ47eo{Op>7Hb`7C%nvp zwk1h!Nn8OJy0~{1aoRI5QbO2T;DmOJ>4WUPbz85TE3Trds|)-^3yXTPmr`GcH2VP< zKKpA}ynATt3NFxFlSfrq73Nrkc7<1DYF|ALF@x`4HnY?#!v7cta(C0J0< z8ES5PBHKv1@S^%!Q8QzG$9~?~ySOnkP6M}ssa~D`!A5d4l<-~R;4i>|-9N$YF-%y| z-d!uq*IFx)ojf4y@v?g6)#*OdZGzo&?)U6Ss0x1vktd^vCu|SSFSc)jv$(a6QwV`S z&aj7KXZZVjP-J zb%uD2fnoyrh`PCfsBS|1C0K)9`IJ+6)LTV4-B1tSwQY76Xk-;yL5cm1ExA=T0f&+CK@p79wWL98>4Degg7@eShDI zFlg;9&Pnx~%ZCFh%T|kaehF#d`bDaML*bBXI1|0l%B6Cew4W+Ti3eTfcJm4hO}iD_coSU=3xTde1*kQ(wm<*C|ifxmt7|T9GGt% z3{fS0N`XZ(;6lBe?$Q~mjtY~jlcAlgRNJKY)zREcF46kl(}hwG;2V9Ro&y-{L7W-G z;czwZy1d6%-mc!NJ24FX13d#Y?7}}eT-zQV0aF*=hR{)!LD(;1F8wIr1+JI+d*G;7 zrLjyCYL4N&Im7-BFfli@v!%duZ$u#d!6N9e&LN(KWq{WR4YwYLdS>K;C6ykkxLpy*P?+k`%SR9eD5L4m&560~ZVZ*?E=P zrA;zoql`O=Rm&!vc}kiKp3CA#oZ01NoYWC2+0_54@025o8MjchkCq7^^@kAsV+7&R zL@+Na&~jw)B~sm6^bX9-?gMh`Z#HtvdaCla4+r@orA!~?Xdo#*u>8i>N3S{G0vhBA zTOpQg*eX7H9!AHJMj2QEJ5}zuyTILt{DFfAE(m%JGnYAa>=1!!o~sS`3Ekpt@bt9z z`y+gpMx8Yf!FJQi&)MZ9i1mTqlUwTQRb6Cyv%rk)NRW#bmc4n2ggYPMyY|$hzE`I` z7D?VQ-153}!8k^2EK>uWp6Tp)l{q~eZ2>t{1sH6Mec@?nlG;61zWwRjVH!{ZUq3+L z$c-gC?+Y?vJVNM>V}aD#1y-OJ@uCmpY-s|oJ7CCqt86T1>%H^1>9n=Zx+Zg>EQK4y zT^dD0mgBYLb~JqtUT%VsZWXV*HB|p$Q}F~DEi)#6ymnM&%MY!%kPmTnn$qw{&Ci*# zoY-a)8|OV*Z5Pb)T775G$W6MHCU#*F`~Xo+X3TsjpUr~8{#|YTySe&#u__AmHUfCo zDxwu$C_0Yy(EYIyGd>s5ud=O&Z!($IgNy!IVXr-^^uMW2C$7Sj$Zs{V&YU~iksbf^ zjDkTyY!76`)DSm$uPjzrpPP(EbQubiH|FNZuqB1mlf_j#J*vOQ?YQQTUX)vZh_jja zQpA+#nYI{a=P5|XkV#jhZ&4kR?*3EXA3s4qGCXG@I0q1Hr(EIj}tHG_naQ zMqMEB1f%YSo(G?Q7iBQW*)6{8P*CE9Bqd$VsopeHihe}7Upp4I3=e)Q^(u8y_TG^0 z%Hc~b8SheEDXb`{2wM|u`!JkwFN!xIEZZ3P)nD4s^a&%B3UwKa`5cay}@b@kdi_C z4lFdi!#_-1RF6$&hiVcxk6%w7aL{>1P!14$Yz{eK==!NRfBGonE(Z>8Xb!Q}k&hy+ zA<6bB;J8H|uzrkh*PV`v;)d4lC;dc9iVl{>$^EaPj>Ia2bc#!gbozHJ_26yw;?mcJE9!KrPY$hb zKcezQ#%*Ok*l;paBRzONZOi^t6bPJbsxYEGw;Z>PL^V4sk^id5rQMM0v2LkohN*Sv zgI~IgcWSF-f>*7RF!r_d4A0wAIS7Zga8Bc-R}Nw1w5)1?u$ti#wdvnEE#WT_+6ZZd z6AGQk>Gw%}TPBnZKe$t%Kt#P&E8i>A)NYjLA3C;3X?ZMOSk6N`l=Aw+Lp9JJmt%0Q zL+>Je*QJ!!jAVbGdeMuQ>m1L15Nxuq6Ers2gj<9=2TY&6n%Rp+a@o*;qQlyVEFsTd)5!Cu$q*IvP39haUmU%9rTjezp^J+}P7 zznX{5)vNf2K=+ASkS4v+`jeHkP)^|S$fy})zh=+nKSHO_Lstl>yF zU@xwF*1clCAG*8yY(9dXWaU2w1qusxgR8lhpgW9|{V30VVl?}egGQc?8FjYQLCqdS zFR&UmeZo>yk|0_=rjlDxF3i4ymj(t?H6=fq+iF{DhsqFMegn*0bN~)EDci^~UANG% zCvkqDVhefwpTD^Bglw-ot=|2-)O_7Ol|TMhd>}VkH|yZ>3B!D%l7%nXtstLu50{E* zxAGR!_2930@^kl1U(wC$7`8wI-mFvMduU{CRY+^EvJUS_`>Y*FTeCa)xA9*_iHQaJ zG5Ne-WwhrdAtr=UsQLg$3Sv-pb|fm{AN-gg^1}UCHi6o!3CgAh#21 zwlH8Tc3^-tkeeW}SkJ)W_EuQ8-FmEk!`d<;kHNrLQIpkNKkKVNPvUR|)kLhow&iaj z*1PM344n6#HUD0ncG2!dn$A+@q7&x|#KDE0f;}3{go}HA=Sv};%7%nU;0(3}UDlP+ z_6XQNLS-f2L`wly+G^L77YkYv##=vz45$VH!u#3NZY>*P6~T$`~_ z9lThEhG7_PTsSBC6aUynks+`pY33|gW|>ync%sSyj!K02AxYWqaXjyBg2)NEc|feMo{U| zJ7XVD^@mOaTsj^6bk9R~mSx6pZ+sut%?R$_B1u;7V7XBIW@|)L>Ti;mMGWbzZ1N8Z0(WQcr z{aDdS86@Bt3Z~4Hf8gn6mg{JmW~}dJ7|lg-A~Czvo4<2Zlho_2;k<;JQ|tL)W&0FZvAr0UmE(vyckZEBym#PffPaSp{Xo*3fuD>R&LEa2V_A z!|;&nk9IWRkaj}T(G!DYu~FT^(7nk)aO9~X@^b;bil@8rKY%j9R^%HW`91_7^A8}8 z#BbKf%fJu5G<4o_ zQ;=J($+dh!b_tg)ivui=XimX$#pn&mlNDIXa13)zD)r5=;4T>4<$rpb78EMyJZ zt1}bKkGyEFUwZ$=?ny;a%4*VcNM*pnz9QJsSNb_J z8dT-=CyD+L+xb*f1%RhfkTq26H5Y5Nh~}mXy&B^W1?56kPzIt@#a8;I#BE6*Jl#jcWDWKHTEXp zuR>(9MvtC;Tl%dp1xfZE?C+p~eXj%~jq{3j+E|{b+dDli@FQqx4J1Egmr)?>EM-I7 z7%-;RG%dF7d6#~heY>lhwvVFKS`zQv9VDR`w+lW&#BGHHmJMyTKfY5NnD?i)<^xoE z$aY9S9~L-7_e9KR`3|KwWPNHJxfq%B12wye3Y)tfLyZ=ktZw& z0>-r17YEk+nP{BeQ;%aLxr*VYN-&6Ast5>Z;m*I>^fM@9_7a<#+(33DeXV-ioq{uJ zRwq@zMK_vsCt^Dn+o02FL)5+`F3E@9fm2PrAE{B*L@k?g!%7ZLN&d zPVj2=K7LkD(pFt~tP@kE`^Q+D&vB;~4)IKDeX^-P&3A#v&uU)0e~^83>TrAPH{=uc z>Cel?%`&2Yld~o(wZ^WA@b`6hk(|6SV=@@6ywCRUnu=REU6Qdv3vJ)`i>}|;?Hi5e z_c%WJmr!s6u2VmClCeb=snF?lFBT~K27@g}wchYZx0%@H{hH*ct}|VK9d-Nnu)2F| zvhI4&)cL`CR__z|R%cZPXp`b=MP;gid4s|Ic|-QZ8zl-EY?aXwJg(NIg8y3AXr{dP z_omdn`=@Wh-z9SNnbzGozgQ2|?42rjgsRvH5F090Kg__yX;9IV#87y;1;c>wD~Z#X z-g{9E$Ar3mub&6w;0~Q-hjxvNSP8ibA+^RC_wq^(=;XuaqQ&z)w9T#R%&`de0~+t% zkO}b=E2{x{sFjmN|6y>lm+73<-5UOZQCj69R9MnRo3$*x%ciqqvc`>6^L2UKadE{~ z_@l$b@P2Se zyE+F)XLxpU4S;XRh(H{%XBzgOG21if+iO#Ci;B`)ys6dh*`%AlP0B--1G1zf#1+A}P44E9U1<2cp?Xb@s6Ya9JBm;6M&WryKC04W z1PpJ*c3i8C)gQqp%S}x|sw_c>FXneXF;}eTbg0ExWZw`a1l6A=e{;v8kH(^04NC`j zs*OIpeJNDjPospm2=cEWo=oj@p{vG*)#gH$NDaa#U3%;<3-XXnvQM}HkTk_&mY+wd zK4@$O!U@jJ9bTgayHrd|Qv=ZV0-P{I=_5_=|d3m2c9ghdt1| zqV)T#0cR_Jii$4^FMrN2j{=8rMG%!kE4`3wzKXnx0^vVxfxvTEmxga*^EkmAd); z?70$ED?Idiy>v5YLoZy25HQ?#y1TJE4O2N=OF({i7415;j!~|QO6%$joA46Wh09Ur zS|+Uirz?Zy!pvX3&Ha6>ll2I5dnt{-K1xsGr}Di-1tv-BGGbj*Qz2zIRjdADeOe&d zp35Q2y&cQ=>kMb~q#Dw__I z{9O~1AXsc+0N3l!gU7>GyDApB3;#L#!#n^F1__bx1vMc-#I`oGJB_0U#?PyznKG~l z+%8}4bt2Wsd&Iz6CZ7T)RUb94TS-r;Ymb^M*_h1ERZYS=5vaqY@HEy)k$XocTi@NR zYnG1pu4fcsGm6#gLNrzZVk$Alj%Nodav;!~R->y-W1?GGJ0eZtig6w4EChL5yB6`d zPxL2fL}hkW7{Q#e1^~l4X4(5J?Q1LC*18uzF1d@|`N{yNWMq2Nn=i(=UmA^CLp7Z-MijGI@akiY|~OHhMQg<4X-L!9shv z$ANVQSRL~-Yl-K0p|datkuuC!(Mkhww||AXm|c>>-4hDN;oUE_L@}d9DQMfsow7{0 z^(XsD!AF&wadx`zfw%?sc;yX)91$o5ZuN%Z-guC414Oebayt#PbR^lgEySMQJ7ZEp zo)S8fQ-yB)x=AEgoeNLYPRIdB`Fhq+rSiS&4}UUp6Xi6D$Tm`Mf`Gk~8uhy(GJive(3ow#6i(1}8bq|;5# zYf70AQAkQ1PJ5wB!oO`7ldYw%=_0w4-M67+%=%>~kYb#@t2V^nl_rU0KRkDt3av()+uY)ehTPW$5`JB(T&_LXDn!lKNRKQl+^GENc68IbaZ*{Ck zsIt%?Sf%^EFS4AMP|sm6*{bf_Pvpg8@0GRJyi8u^Y>MSEw5iO>VqDKo7Mp$m4;q_2i#6Uf{w)4klJ))}7u3`? zqFvWH_gQiIBG}`1>9M0&F!NY@0oGoSD1$*w{bz8k6lSPn-!rP3;nRj#fsZR$7-p z7MgBGnWB~4jEIrlu>1=gwJzPIcTXCOc|zX0LZNo6t>Q_#6P;Q}|I6Fy{NW-sVxHL! z**@~V!s8_la;EJrT(rGmd=0a1Y)(tV&8ZjK{LuTiUdB_{v)I9k#%V%b-p*`An%30J zR^~^n^~freuH4C(I6ws$X<~PoWhmqyOrOY)ZCFQA#J9MmSvzEimwh;Ow@#@OX{KzR z>0g?g#?mk2wWjv5LXRt=4(oU#79Y|*r2C18SZ*LaEJ3`KwPhVP@oCL>68vgC?wK;H zwIy#~6yUAZ1XXyt8pt#;1{WVTeK>Frk~B?dH(&W`IB|#AFxXN-^qp1;j}n#GpR>Te+e>q>Yh~uQHpfeZx$k*@bFn+)><+I_jWe_mbd|$GJi#R$za9+W$Sr!~6K!)Lrc>PF*G#hzk zqm=`8FdrO9+NQpR-;9s7sXwxbiM%6Ginzu+&0na6WDSC1v&>02St<|GC=K z`TK5iOJj0a$UrmUcBnU;u1C^#8$yVz1k#?4_?Q#Lfw8VbLinRFT5xJv&RjUr>*=Qy znh}CMXWy_CELJ@a9e?);)vg01_IYD4=9|_>3Qu<2GtDNt+HwB>0QG7pdC^jdTISP; zE27%ZzN~DnI?%oO$#ed6A6(?iX*G-aiv@2s1y1^U26XZ*$GDHk2I))JZ1G z1yi%Bza$YDx8QKlL);bh5GGeqRd50J+UXVquszFrm_9}ShR-zPd%wykg^Y{=G|bkp z<{B*0qvuv#mrNg6NqKvfll=$F(^qU>9=V>=TeiQ>wx>(^@oPn@D9^Wjv)vkQS$|Ue zuSXJS*0hTQDyIw@w0{jz)g1vkejc$Jf*yxLU_d>4D^!BV2g{TPClsx%hp3>`ctb#n-hcu>gXJD|&9{40UI=!U(r{+zH=XPtp zXRK|KiT^js|5C$IkZ6weqd-jNinf7P5>@rCp&fP?t(#pMF_jL#{sRnUVsz0GdxP7F8lKy)sQcWK-VtkqC^r@$jKw=r5=b*&_4c^7pskPvPxM06-W&;Kc09I!^5B^b1*xLb z0IQ0e5qm7|mLr^wt0_V_t?7I6ws1>SiqommncNrm%O|Y-Dp;O0zebQ>GDH4Xom$g= zx*>n=Bel*)>mf;n{&WDDGwG$vBikngCf7BQG<3qbmP^VNvZ^9b+*2%C^qbJ}D?Koe zFTpzK&^E)c?r9a*#Lho}b#Ev-bGIo(_Oqfzq+OhFGEJWR`e}bZ2H!MG5tZ@8Amg3K zM4+H(V|QXVnJ2a~(!`rB$E%y;3rmFR>zd8RvAccx7jDbX>%AIf#)gRrg%1}Z=T2de zff)~w(cWtKG8neIRTHwb5|XZ)G44E)Bf67)Ocn_X2IET8qnQ0NuUMbre?P9+<;Y@A zG>N?TX$nSrg?9mV*)q92CUQ=oK5`m>9wD&YmasE-k&X%+PrrUKcae9cmb*FXYx+fB zcVX`MY6-qY6lhn}qLmomD*fT`A3Kb!?+(WnrO*%@s zxNk3{aC<-dC?vzcYErc^;x1G+8&?u$!cU+mvkG)`pf|``&@owa!Ol1>fmCkXhJx&& zQAnX!zqJLwF>+{xW(G$CPruQtSM^r+p7jrT1ZU5=hUQtg2s@jD;VdFcODTn2rhI*s z9!7>X9D+~e1r;tOwk0WxcNU9Vs^bNC?{tUtzSWDq!x1ja)=>6)FB4z=Ma;3dm}`O2 zh=HM#gDohmwiooGLWWnzdB9)BSlt+STTNmO1}qbFGT&}ohttAoF`g9_GkxebY8t!1 zrSQC)8IqSMI}uhF@`bx^PF_{61upTvAlcOcGtFh0AG@BxoSMA`U)vi5 z3XBa)%WuUZS+cREDHz$A;beuLF2B)M$H} zZE~3cjv5GI-u(IxKzr%8r{%)$1Phcxp!@Ab>bVr(%6Uhu1c!xS-Yk>O!_Q>=V{V_XI7VF3>Hj;OB`j9eb0qB>&PNT_0Jy~6N=6{R9^ii=X= zHq(<1=3hV&3}~=IUcgM{o8X0e{~pXqlfMKTA|U7zqKyS%T+Vh6n@*NXHdYiDULYGq zwpFfD1G?6+Y(;IMm%R>`{luKX+S|@!1AXbX{_?|Cx4Jk=!P0$)={Cn^DW3Y$OX3XQE!3a?YI6OfeYp zDGB~LHbe=!; z10m@8A#-BqW)*pY9|L_Y|C5ekA7Hx2?H45Vxk`&}#7i7>S)nfyxh)R)G8}ySRDG=Y z?QOd~LB$~#`pm1?U>Bxx&69!JN2y50J4@lb;kS~OXX{Gbz2w<9)LqlJh%37say~KV zeHjD1pzuy-U_+fk*aEe))fPir$8YItooX#^p& zJxcAVBvqf1prB?~+^|lw|no$IF*(FOJpbjg$0t~qSE?xIM@c1 zKk8;4(6W>vb?a%eQj^M9XzzD|yh(~BpLD5d(YaCbUw{6!t*Hv^zVEuQwRss&uvwS_ zr6S|XE)G&ryc7_$xEcB%lL&S1RfKZp#{uzJ_Ox#Alv=Y4m6@fawDN>6i>b5Cn|s=? z_kS^d3n@;U#d)wO~=01D1 z%v*?PUb!!*Tj56<)4&H+ytB1qw0rvVi{`z7F5+olinWJ8;e}Ee4J?0oY!O2#r*u8H zq9j;?%LdD*(+)9<=YK-O_!rEiLd`nkKRZo-Gpr(tHgMA&O;NlNrYy`RthQO4a48EWkIoiGa-~d_9SG zns%k?5mw#y*x%Tz;c! zI6ZGi!hF(?x_)-6t6B3Bt`;#77~X&!cT5C2NaVaO)Mw@IFPYG+7OVDce47 zqXas~emkR1*omCOA48g-W(WMpC>V}Vp;6-Eb-6`R2e{$e!}!0Lm(BjX?jY9gjyT5a zI+r+o7{B~P={45Q^YtM-U1nf!nzpaDh%aokATvlI@7?+e!(>%pZ#~6t7f>aJ%b#s zS7786))!6Qy^iKqAd98^&wcV8{(bvmhj%I|7=!Ov@uv@gGqy+RjUQ)coA9ib1!H{H zP&StzY!xd4#csiDKJf2oMot#ZpyJr+76`lsdXjui^z>kuc~JiE4wSl3lUtsQMkK#ynxRPOZD*UlM(F!@H9&HA@OR-1mfy6@Fnye*Oz^xiwE z^`oZly{VX%d_1)*o5%k>@wbX6UQ3#|Vk>nt;GynUgJW1mQC1R@)yfNfQN`JlrRc?A z5k}Irb`9(p{YrPKm6I`nF+x-O>71Wn-Y4p+g^6iRZch*M`<7nol?N5|9?RVpKJH(> zo+w!HWb<$9m+6=o$G53JxD0*qZqnyd*}SHwz57PiOmlr4=V6DYGoxRXL1OT^3{qn0 zQsqLMxWU0SOkBy4^TQ|CO4sQt9-6x)eRmK=uM-2w8~;X4sY~IxrZkoc(z^>k*k1fT zeWNZPG?z<5!2k&Ij63yaBw%|F112s~QSD{1?1zN)Mc@KMeqW$MSk3l-375v&y=TXl zbqH-^gWJ7P!~0o*tI01*mG&l87;q-pd45)XKUjCTB1ec5r~X7hWJ(W zq;AVE#$sIR@TTv|0=4Qup;cB|S?)je#~!YVx1%RbIX~G#AT1GO>7MdiP>jr&bm`JX zRDIol`)4_lCaoFPB++BMgT{w;wp+w+Bmvb>ShTmCO4TNVkn60~`{Am2n*ds%Yuw=iNO$Jzuw`K8kBz)F-2qDwgU~7?|^Kmb)DXNV#En6Z-tUAk`S3 zrKHkJebkSnLjl{kn*t~|P?Wm`^6dS6dj0$d*@^1=VLT-%x)X0nQ_A0{N~1u__k+)> z_>QSymY;WvPshqN;`!1SL%s|wjgfe#qN|2O`L~SO7-Chjr~cILFD|r=2+$MVaOU$~ z2|~&wr_8}t75PD`kh3w?fXI#Mbd}w?o2L?KmQ0glZvRQ!om^@cn&QM7gN-Q{p>2K zaN1l5(Z?rN21PS%E^l8%G!rXyzs3;5uKyNM) z(Vqko#BE)}hB*{e#76|@DzcQ9S0`xvlviGg?&qSi`f#ADRh^UQwSI>q6~(rdaF*I+ zo*<6qY_82OM7OoLnDfYDJlqWSU89~en#n1k#VcCL;Mt^`besPGv~^Rvay}R`#)Ahe z0s0&hiuwY_Ptm+5qug9U50eBjwAVKdOUo!#%R9OGnBadwfH7VVtlR1`S!q}613mTo z%nVu1C%TYIs(TzUEBIC9`TTK`pR%T)uWoLyM)maddz`erqlHOPZ6v$C>w8#+E4xJd zL)v&3!(t04jMox5np`UKQ!H`3fybxkU1x~aC^d%C{4wFL4np?It#x&Gry*2k8CcW- z%WWZvKi(d-xv%&WK+!xQZD$RXcN&$&{hSYdEPLgV-r_LlKf(&`7#w4Y=Cp~VlU&s< zWNrTd+EPh<7$cH`;&=u?&h!A+xq*? z#`nYiBsOw{z3~0~z!MZx=}wBx*c0bAJu`#Wyz5B1ywq0Z&x8CM6p>2NOC83avP6($ za=L(Ua(kX@r`E1MC~ELqTEB)RvW_|T&n1Sj91k*JfV@8CJ?QGb2F{uHa#>OBG!0rQ}HG1|>skF6^B&xf<}neIfFGT(Ti>4r7aRV~?0BRd2)fGR8)Vsd_H)e|q)mW!mbH%YP1^2f|xJdps*VP>A3T(Goy*%wM}5^80#^ zYPsTT%{#-_R`%N8!`%!|bd2!FYS7H>gNzmOLGQuF4?OW)=Y)Jmb*AashOI63p=*0^ z;!Eq4uo4$zlOE?}a0WAl%C9{;)~|+i4;t!`N#YAO(61W#$!puYrfKC|@EgkvtAT;A z5EP7HV!V8AXI~3iRVui`lF?r2$@=YO<$L*b(imD^>!~!N`)l|i&8}!MS__NchH%>3 zf&)nwV9LW>sl?1g+c{MYtV%5hC^cD<{O7H^ep5t`g@(fLWCy zLty@EGWuY)>=D$ek_T$cm31Z2U)HEx z+I%Tloo>F{r!tjNvzwGuBxG`Oql5J1b~Tq3=ZU4$Qug;y`vs)Qx;vyGmqD9J% zdV_)p#yZoqJDUv_XVvVyN2A}}63piI-Z>1z7$_SiMaancN$b$`u9)UHh{f|-Ph_Lb zYx&B}5b%(3=E2GT0N_b}PX7RbzpQu%z;=>A*Lt$)#$Zf7ZQKeZ#yL{UlhkxQ#Z;H! zMUB#Vx>mak;1hz-hR@ZJkMgZQgSzgM6c;zTo~Nf+Exnu;7O~ykqBL=#k@1Eg;0Y0P z(Ci+STgLt%@cz9tnpcFZbb&EtGwSUc!?)(n*oecs5-?bC&O78|Ebg+$PYkHOSlaXG zv`zH+SvKE8pAU`9RFo-HmHk`%9ns3_e+&FYY>X}9wYhP0bdqsMVpWaSx_D@0F*Oh{ss9|U+}Rn>@H`t z)gjWaBZ@&8k~z!a8(k(T=9BH~x1jl*s$m5%q}hl$)pI>)5kvwh=>b_auy>zL2BdC$FfJ_*uo zH6H-arAs`ocQ|#uO>e3}tb}Mm|=QYQ46%Z!^NqGdG#n_RcOk zC2iK7pZo%!!?%h}PQb&sLNpSwXM?m{k;vu^Q_H1pQ$+O1AOJE+H~NOymuTT8lmHjS#~2#pW>L^B?H zfI6NbeNJ;`AS`5=fZR<{hCF&x4HXN5W3)pLH2l%`-8WhdJ|gL zb4O?3qi1ZY8&P9?>Y%CnG)1GdPMn62Nhrp9AL12%#C8pH{8a-3~77TyDnfMPWF*yo;WzuxE9tNb^A z*K&1wGa~%DO{lc;w)i7h{{H}*v@AfV2P6^ma56yYlU05%LfU?-qS(F*+vwKuF%7g9 zQtD6UE7BwIMZf$cZK%zCB-VapQ>+YxyE-DM4&{#J$_B8(Z4zCUlT>avC$IR(A~=VvZ}$nFPZ+0a0tr~2M50%wa8d_PU~Iq zJ%*pILmrzY#k`jrA#l%cZ3#v4k;lvCJ4u#d(NqDBYtejDrCn;8OkdglT51+|5#Cvu zPsn9Vjjh}UMs?3^+3i_(w$~c1yg%Ar57ncd-Hed57f^YSx!{=PNtK8GJD)>d6)477 zd3!miRB5FytFGUv)hg9_eVTsm=0}aZEurZ*8cvI$=~kL^T=}!T@C^3|V%dd_iTlmG zlbzfH$8m*yXQ zD*M(suaZ;;py0b4`gQ7gtkm#TwUmU}X&y3%fTgXbvxGkfs0^h40KkV8$%D)4QKJ<) z>Qh(M>#g^@*KV5~m|SEi!;!_=y;^^!#a%PQnoWy&q9(hzJhjc!d9oAhlhg37r{NyA zr54ouI~&Cn)xGr340zgQR>L;Y)8%c;ft~`Bjn#=KhUaD4)?W~CK+Z1hbJTUi=Rf^_ zdZfMtv{VS1CyqE`z!_}YYaE@!EO6QWA=B5I#}|?;Z3)w_T{i7!eVYEQV@$&vM-d3Z zlr3#~9dE^LOYH*N!gkValJgVa6+ES?x7|PW(T3mmL;gJJxw5v`G&_w-XyCDe{7W>h zaFOkbLWG{fe$IMiiemU~{wI>+8($uor3vQCaBSyy3co7l*pZHZ5_{8*hpguxXYr=q zgnf%oJ;?s`VTQ;S9*UzHv9+3d*|#NT_J1!Vi^Jk@)bNs`@69dVpXO|9-YwHSL9b}G z8Y@Y44V?07bKH4FVPuLYR0_;KZ{A56+yNX8Ylzb0z1KV`q1#_c9i6R>xEB8aW>NNs zCmWrnJcVKj*r0V8CmeMC8PeqN{BkT_7V%~5vP6)y*D>3<@{kR&s1g9H$s~I9sxPE! zmN0o*SB3mZ<*t0YTbN-8gQ!(;Az%kRLmztdf3qoJFp!~ylDr#tZC_j6_P)MaZDSn1 zSXfuRW$yI#^RX|2q|$sb;^=3(c@jNFAF;)8aXE7oySD|)5<InzVSTwI$no%+J222 zG&fqDe9Lg-@5cwCj#Z@RoP`_{Rn3jJguE+uz8kW!hG^3$E+q;bvIbq)jl=>@2>{>$ zfNKWVNz|=upt7@z;zhN!x|rdLD6Lghat<&$_3xkOP1UrGM^vFt{P48H|~%jhaNc9QkgzVFZS=y13<{V(%5c&_gC`>6Em{X*L2=qn3b zi@S?`-ez;;mPW}*2Ia;M8(|y*4_V?3CtF{KdTx{Fz|vc^DX4jqDkqeoxMpkus@_(6 zuv6DKthu}&9mFz1`frZPNQ|zhPPaJ+gWj|?y)N@t)1a`_Exd0nye_T~X)xuA=V@)Z z+&MgR$Oovds7f5VwSQZQL%qK9m+(%fsOg&6`xl*aZ9MA*mGyn8{A{+InOgcf~_W9vgzJ4ae^?~EN#?w zJ9zEL^!nE7F1r*_#p{}U^u}ah#9UDePc?z@#ds-wv<`l z0W56mgpy_ARzcScHlA^ktZ~jssCZ?yJGn1!?)+Ok?txjP@aa*tbB+-QO~hxZ;CAA? zo)fi085ce*M@JGQi{a~rD#IL%M~wdfiLaK!@U|BTQlzL)Nh?{sy7uV%^tsW4#7_%| zja0N-`gJ;g17FFb_?-QjgkH382iSw{v&vMMO_->ShloV zEnz~%X+5Y4($4G>Gy|%bw5TvwB+E-B~;N?rn{$PI!k_h0@=)rx)Q{Z6@N*bx0$f;<$L+%MfPRr)mOE zC*@W8^Y2smgHO_J^qZYVD+@U0vyJCWK$~2FovgUSD|8_CZpRq0dt(af^6DB*hm7>| za@*#E{t@XViQJr)3d9xlKVC7?v#<24okwTeE<9-@XxoHm!mbxM>TuXN=dN*IK|Hpk zu}-R}xm&%i@9DL?y$@D7mKosvl%aWA-7WW?hp&7!@Xobq=V_|?MAE2bdooNc2;+2p z2;=y6{cFoD?=Ad0eLaQdi)3EjcD9o0+CWC-V!W9;4m-97O53%!)onDXH0v#A$M%*a zljO(Yxm8de%5%8~vXDPI&R-5&A}mVYCRo71U-(4sF@Q-q8?)P-`t$9}mgP9SJvmXu zSN5>JiMMt0-{q=2S{RD>c_~wC=V$(BM|I)tV_vov>*2?Q+yD~p;#hV>5B#)Jj?CBu zk+fjeUx@q_d*Quu#tSx0VXuP-B97bUmte_RAqQ(lcORT!4up*4rjui;*js&gj4>=B!S52ymhTz22E2=H=^d;{cLHV0hESH@+a%n^qFZ1a^*O(%^BABVz_vVg2^n3w6LdM@sB9 zOPwoH(N2>th2kW&2#XMlMY&T3-?&ih<8B5%nCNSgkHa#&?G@8&zhwEcV({(K%*uOb zZq+zEk(24|>eh!fSk5gRa#OXCx2AKU_`$5@DfaT3g~8jA9hds})Sk^GmpgHs6^2gW zis-x%pxa4le{X*PkV>|b$~P5wZXP$B;epD!EyQ3jAn*v{pW+K^ZCc%+wzlyNf=Lu` zTq5WPmx1x2SYUNl8gBC9t%F0xBRTDIx}lAR#EAgrd@@h=NE+2nLFv z7<9!PdTH8QT9&xHfMUrCf?DR^T|Sv=EhPK zlp9zRab(ag#0~ zxt%$pMzdSGbSv-ms6181O>En*WsB<8&rQ}0i!^QgaV6&U7jNO0f!(>^?Bn_bFQD%x zi%fH$v-Z72$+U?yJF4vdeLbQ3=$_(00EJ#Uuq)yc*Vq1wVGhPUgGCKD`)H0V9kbsU zsw_8j^Pc@clo7po-o`0~Soy)G8AnAjl~eBXC%)Aryo)+j%+Xv7pjbZ6^E1wS3YCWs z<9JIgAK&VUZsUA@V|G)`)RPzU5rK_!ZED|*PnMf^%HCu&rYK@6zRNvh8zxXEZpFt` z7kQ8_I<(N@3cc%RMQxKypCim&Uk5emKe)7zfhnUprNqDS&fC0+W|GGvauXHutmumu zFSb*UG43eXL*jTxB_l%fYP7Lkaqv}l|9vceJ4BjZ9_Fz@>@f(WH0s1Ybx+sQBo0P|P z47Mpt{sxr6oE)-8L2VstfHv6jB(P^9M^ap8TPJ{0F(J2eozQEhx;YP^XqBf%Kh1R( z(59hMW)GOgo5##w$ozJVoQG8A1%SF~$j=jKiEF)FY`7?m}oUh{EX<9(GOJAh~#kqq97xl(iiZ0>& z9lM#SYf`61sDwCw0?u#k*r1gc+ewmQQo)Gyl{Pd1xzDO%fE$I|Jep?2WFm+R|%bHuIZ6+cZ~ z;||(k4VrWm&}*(|E{#H=Siv8&VBbIwPhSk$EZ7ed;N#?rGB?qZ0(a1WKblxyYzVYT z%|QKMA8)F$8{9z#{z#$BHBB|Z50p?xNnRdhu3>CM=nE@KilF{!|FnPFKkc9PPy46+ z)Bb7ye`-Na?%tlx+oZ(hB!V!3L4gvkPC-r*K7JT?X>lJvng5Y%NP73hKu3i{1)f7<_l zX#*ys8&^73p1$tjA4U|JKspJ@NlFwMB{eNQBMTclC-){apMa34n1r;ff|ANEHBB8o z1EW1=me#iRjxHDvFK?`WP)JxrWc1P4_>-p-lh3AST*}PO%_}UrS$4bf&b^wt#^%RQ zo;`oj{jz`X^}F{UKaGEzn4Vo&0)uYh5=?YQ|$8%cguAodD_gS%Qx{!4g z?P18Qk!`|gLhmI>B1zev7ulkE>Pk|Sz)3R-5jCWMUROCV{ zk2SOZ(0d{RL`k|}UYMbe3Z@q~8<@r>+v$_ivL3Ejum6GUJOBVV15s~NQI1pEe9Vb4 zrc5YGVA8RXL9le@hQo!Iq(Qw|f+J6A8w1I%yNMhyHFwO(V$$~<8jaqTu4aAwq#9>H z&3uW%MUKO<%ymq~2kuMD9X&xN$<$P;uzk9}W@pSx<63mHim%UnT<1x$$Rvdn-~#1n z%rTC5o6|?t$qyHQwcIruk(r4D2EDumuf7P=%-z)n5;X+={IER2i+dCpe^y$`oWmh7rCCxOj95qqm}lWkGQ zl;*KzFI(>_CG5goG|GI_FosGTdnD95RhXo>fr*ywO)kVyCINkWN0v_Jto>dWx9F;d zEWNc1p~UWFFHm&s)qEjyyC+-F++R}!E2eK3GfN_}V}guAZvRZg_M<^`x}(O5FH%c1 z#_Xci9IIk;#HK>K&d1YLA6GqvOt-%-cHawUSIsr#lD|azFh^*gYNrKi9h!72UAvDfFlo|A!|iz^W>eV1D_e@f zAF{DnbyvJ!ujon{VW;%{dO084(b4^%Jfhi2%GSB;Qy%+1^Ro7O_}gdAdCIM1nQ`fqHFy0Jtj`eKU&c-C5hx;}@i@wXdEX?C8AF zDtxxqb6ZI$zTBx}>ZtI?21vXzr_O-i08dxJUE4x!P~7i8S#2-T9} zK%MhYHjdr;L1NH;w(G0jw%wba7;iE&(}?O%>ykFTxXw}n_)-5r>Xt}Ti75w-&JoXp z4ZIT_D%hea3m0k6osqyKx{;0E>T(H_8w;IrP{3VwwezO+AKPz@^Sjq2KV@myjk-Wx zdaLO)-{h2~n#K7DlP|Im1r+oqGx?}`?L?~(0k?hOxL)<{Yp?42?#=fOk>|@k$@*ax z|5?X*>%+kP2G`@sHswSuxjrEqZX$QHINK_(c~$x-`xEQta5|Ib2#5kEddG z69Z2!c^tUzG^Lmp7wKQz&70h(r}Zf?Z=+R*c<{hopX{48Kv_W@`g;);D1Wf9;hA&Q z=1F^=Jstk8F4TR45E>)>8_Fz@f>2`(UY`-kGh$MuZOL)kFc-L80Lenw)fSM&-q zDZR~lT$0=u=L3UxZY#slp@cJARfh5O zg$?%&DSCIl>V_y_rTGD((wEBS-D>Vow-X36a*uG5>Q zs6XYq)+&C_8 znlQ3J`m3LKn6Kq{`RiX(DC*NO^&RetHl*|`C>yU5_rc33i(Xu!v_550P_N;>%|*(e zq?qqdg}rHSCreAc$iMx7=R9lQv9x2mHNqb07__(cxudIu4Her)+DM9cYWD5kDWJuW z68AY$RP-<~soF@wI-y ztw~HipXA{-4(K{`9Cf0JwA~yAfrp^Q^reGc2bYv-TsAYX9jAKc->9W^^Bu!&k0lYAy^Tz_3?j0yxc2x- zG1s|EU;WvuwV>;evnH`*kytyT)Hu&r9aZDMB5$SYBq)4*_{~h3{X!FNb9nBTPMb7M zLAsOMuG)MO+ERx~exI^&;)|PQ$-z%TXKwV`biJCA-5dN?JZT#MERH8ch@xn@Y1ul< zrtjW~jNYh0qleeZf&rIDYZB5)Z@=35Jh2=7S+w??G^2FCDqZvt89D7h9LrY&!x**_ z>73!3f%;pY^!>2`8znXCTA5AVs1@RJHVVtjqpa4^F_=hGerVbGvCw1Wxxs)!JqH(> z3YA7@xtWQZnnd45-{7(5omemFphT_B3??64{rxGem?j+4d0iCwYNsE|t0k$G7lcOv z4Z}Fg<4kmYdJqpNSfoDD)HE}ZZA0lq`hMX`=6oi^=zL^0>PbmM=^%gO_F>8F^ZG4~ zLT*Apgmku43bx}^J@xu88eOyHcgyWe68-d^S-fGmpFv~6K2eZJB6A3H8>KQDffh=O zaEs^)Pz-%H30;SM1D6Jiz3x-r5Q7%(yZhWk*R!75|6-c<;_0UEhk$ES@BIOC55{O5 z0C--n673>w^7?qF$Wxn*f2WF#lRtl<-cb5eX4b6=9EjG3rp?v11C z?M(wRcoxI7Ac^N>KD;PuuX+qS^dm8IivHORr*(J7Lb64vnfmqyhXGG9>XBz2e7Vo8 z7xVlmujYdiVFxd}XT0jFC!90N{A3tueV?C=HjeumjKS-8Hs&{HUP?#Mrdpjoc(H2Q z=X{(0Muo73@9p(sPfqL$R_Hu0z`|ACl~&C?$;o^+x-<4@_xwiPfWxmi>8}XTDOluR zZ>ZX@wfGdB0-@0}oKI_|4U0)-Uf{aEAaK93eDBwoWSlkHgf`EePGo_jIm|?IkHCXm z&|f-lKu!@jG?C{XqyO-VpNgP*tl_=VLDT9qzhlz6r}5f_0aaLq($!ANp@?x>c#|n~ zK&)ZB%v)S&tFfDmsKbueZJ}RYrUgs+uCK8_b}v-})-IA?z;jy7pPVq35vn44NGi{w zbJvz9zGL*PuzLY4ZVCV$&-EPsyFPuoH@{gQuEDw}yK z#2rrh*IznO>pJMzjQ0xZ$@W}0`kKc;Su-|-Pu};PK(SNIqYrm8f$v`PB>LRUS;|2W z1=I{ETsz8$#gT>kIBk4T7E0B%Pi9>K2UDdmcTS@rJ0nW)Oj>uD#h1-dX%GE_7=5T@ zfQq)Iy&F`&&3hfzo;;(H$DN_&gywq(QNT=}k9%1du3yyD>3rzKDgBY8X{GD@C=tJY zv$NExK1=(&O-X6nZw?MkO=?jwX%*w`DMJz!i@l?!4U_rt$3C}F=DhM`?+S*4P^T2l zMNK{94YpXs(7C+$lG#}->^Y!#;~RC=z0C{#eml8HS(NLx|G09(g2(clD$NHo$m62o zKH^nt8T#^mDt3cNB_{BdoQ!sJNh9f5?ZpdsjC-+~Wv8$C9(wfoy;#dm_bt9nRYy|= zBPKr$UKQ%j+hWQ!{o&5bnaXtoi=J0hs$MH|uu{pSB_D5aBO%>l()C7iQsr*Zk@Oq< z)bW0#?^)EGTBw=JQ+ZyqK93e&a4Spr3e9>3PF}Bj-y~nYG*4}h(Ywq`605vmrokQj zDqdI0KU6%KH|U~H$N>#yo;}Q)eRpZ+9}xO>g+Gv8OZr$Rt~~z?OOBDeQ^DR$uArUm z`KD*<3TD&ZmG(Mw1FRdmIKkvZxuTvs~U(>!M(Kig5_>F|@E&-`ln6-( zC{Vo5Q&pQuxb>`dhACs*%D(n)R!UGw#JHV*-s*lxxBtU|(u94lN^#ZYpmo8^C@Fni z+9Q;j!NtTp2g;nv8J-(mA0N9Y8)%^Sr$3rHIAYYl0~Ss+o-C?>T08C|cuTwCty@=xs=@bCfBg=(+%NJv5A&iJDPG7h4V>Kf zOkqT-_i|t5!A<)-=hXx}9UtE&z35cQpVpT&VGymRog7QXLrEQ)6&dhx?wH&Yz0k%Z z>dlr>cZO0!-wQFd#&VUWAC5~=f~a0cKWg7uAF7==wS%kq<98IpJpfqnqpxKa(br0{ zO+x#9<}cu8cl~;ezA?HiYtN;tY8ID%B-2kdn#oUbr<9*ejsXM=##~*=(6FyuK>6}@ zXloLR!arVVpL3tJN5w=u&jxkr%wZXK@tkAwl9OfcfO}P6Hg026Jo*-*fSi7Ap`AMP zR8wHP@8_k=%gnY%q^Irj3w`RjMK7>gUKo+!8CT&y@sO!EYPvsCejOjB-09ocMb}HI z<+Q?ac|QJ?Sd?gt1$~7atjS5pXdb9)+tcYt#WLqGr7?B8o6KF%Y#mOyNVgxCN7Ht0 zA#U$_9=kb|RM^7%IY&Qd_WG(=$&mXTeXnT|!@c5-U`wfPM2}f~yhTX@;yffsb z2FABL`L}Giwf=HUC1c)5*0AqJ5$n^v@h_LEU+9jPD2p!oyn4GCZ|f;pX*GBwIgefS zeT~Ye^7wjH{MH!X!RZ_B*4Gp^yzdiWVb|Y`1)eqKx&yOMnCUzupHuLwbIIn(m(1~Z zW7ABUIES4Xd2`;MjY#ADGJ@(#8?OXBc&bqQ)YMJI*w-t2gdK~+j}JrE)(!U5jii^! zHPWe+SYl#)P4cb2keU>)O?b{R^rw~D{c%;#!I=oPN6a#S-#gM*p%rb(7(j$NP z^u#k1`qml0IV;rHSB{y944LYoVNzEPY)Wqx6J$I-BIYt;!zLT??W%foTc3F;$})nl z^ZSkOEw76oxL)mt&?xD3JMIZLG;iHWuIRx3a6a|qwogo#-%dLvCL~Y~9=h{Ub6XRG zce+CS?7GKwJAj83c|zY53hqo=kXOB~(V9PS^jZjwnSn;Wh@*khpzTW8 z;IP~c?Yb_Tq$dL>QYZsxRUb9%8YOOd-jit_=e(O9a38O^nt35xPWcjw+r^Jy!WUnvUbvWn7t&)IjW@W|61fy)tKZ) zPnQXr{3d}pY5Cjojcsk+-%_}?uzr!xy^0(0yYS}Sl3{=X-ml`2-jqrjZm^>x9$n=` zwmyeRlJ{|nE$$*kO3??A!y8o5OQk3Zj>Ds~Wr@R&b5yITbg6WiG?dbNOI>@I??gE? zdmAf*5Hh) zvWY+a>X1PL>;Cc^oU~oJ82L*vDPyA;$sx0ZQ5E>PI;+Yo32s#he!zZH1CEu6{(@uHLgrFm8HTq-@mw6jx#=oY}5H=S* z`&H=R*};?{lVJNJO(%veNbbndcz(NZ*t9{Os$X%Aehjv>wJo(A4IP4v8uW*xKqq0L zpJaj=b(>wk<48nl6yJTnZkcsSaw&V&TTjw+enG*ORx02T2k49W4`>@KvNm#k(>r$l z9$F{v<%{w6RB6q3ELHtOpIF)i>WffKz9l5!Le}*$R)( z=(R>%qUHkY>x7HXT~xa+zF9ital^ki#zRzS{2cF7qpdNQt#7{FzxV4i>fU`$A1w1C zg%uWP#DY=#=amFsQ(SnYWF(SBdHe!C@4^rra{n@DHB(%Btoe+|AM@WLKX&Q6u)(O) z;N^`D7JEK3Gy1a@ZtX8&IfRjoZeeF;p!^u-%UM%S?Nz8JwRbnYm4`3M+cv5oyw#*< z$__;}pQ26?Yi+XJ?W15re>-t~gVS|%yp4d<^$QLQ$`=$CyVQH4c~7QL%c$eWhap-& zS~k2@E$1;WyKZRy9Y6m>kG}KlthYRj$xpwP9M5OYlRBE&c3`4;(x7U3J?_wi)|m%b z0LL2PZzcGsisP~M`q$>FxsM1_}&TLxhZFe}j=}U`C`+WUY z+B1^+p?x=xU5b#;M8$3g^ewjXz4*S4j`u@kF56zxmd~uEA3gasmc;JhN1Ky@qdtf_ zoKjB^MJXtm6`Nq|QvC4N1C>pc`jHn8T;{X0aTbd%cn6%&s?Czmh$(`{=lGEzlwM3K zm-{-Uw}<0;L@^`#S`r*K&&9L^$VaChlWmQ^cjL=KVPepckPpCw`IYmI4QD%3EvQS# zwzeF}?tiAQ@Ve>lV`ESJ+-96l3oUYrsWO$oI?r66nP$wCGO@VpHc=^69U4FMZj)s& zgVX2z_GQ?`&X6tb(&vIY^sINe*d1Bi$a>prlli?v?mg;N>jJhVLuf2ar5Qn_PH`8D zE7Rf*K0TIyUQR0VfHq0`oc6Z1+xq7+FUV2FIR@JAh-C!6zR~4Z-y;}HU-f0F`-b>g z>j6~QJ|?CB&x@yW@{Z$q%~a5wIwRR=|2o_7$(;`lw%X3uu5IzGDCkLzzF6q@86B+u zTmtCKIm&7MkV;35mdiwv+1_Oqr#Db&PsL=8Ur(lXf#_`qBR@$ z7;c=a>eM0Wh<;a*#1`wFj+tH&mxZhBbv58N8*mip~75TpXk=69<<>=@vx1d3lR zqCH4*ifS=uE?m2h_i7lK#-g|BaiE%BwDfkC$vsd_@BNz5T*$qr`Mao>7C(=;lb5cq zsw0J2UTTTRh8TuZR@W}3)CAb~S)fu>Q7G%uGp32o2^^v+P?msEaKYZ2F`*XqtU&N- zHcPQ|!HpM|c{lfNmF=|J_pIsFdrPIQ*e&VdUMFmYjtR(`j;l%E(X8Mzbm62>nU*`X z@j{!xhRLD@>(5csDK%n|nJtzRQjtfJe@ySfMPw8^r0qIxnb&?u{$%^rCsKyJzSGCT zT7z$nd<_Yko4nYNIYd{5B6A~AOG;6#Ppzh)S4*m2za0QN$Q0phxbt9XO+q}X#7dh- zE-vP9bnW`5yq*rzZ>dpDL&tcQgdP?89;FJc(ljsRIMb|RG%b@=sj%@#hfr3R&F7;g zs_Mh$+uvNF+*f=%S;c*)r(^wrxxmxuR~V zCyH?Q+3f$G9^`cL`L&K(vs=cxLLOSSpFWv+ZKlTnuk^bwoKCCmdtv&B8`xeMPVgI!5Xp68#3F? zuy4=jkDPOQV#mZIT!)#!2BQLj66;#@bQzx@O5?zWDx$07SmVe9N)$!jmH<5laLWLwdR zI=0=PMfp@#qC(Qw!)8^GB*>pe{V z^^|9oEvw8C>Vgb|o`4 zP63TmadL?_fU8kUN2_mIuP38DK>Ap|!G!0j>3349GCX$}q@Hz}dr^=lw>|JP8k*33 zoM29}WnJ%&M(nfEEs2WGd-LO#GQaWFTmd?a*B!tGFq<~W5*AQ z&2#N-GH?vY5cYz>p5}z0@7F}byW4br>d&0=O=6_7k`4h!UO;Gc^r#2iEXH@ADun02JdV>9*Wu)IA4Z~Rx&zU)MeLp(knu@J9no@fq6+F%k66y6G$U6fD>NZ8*h<) z9(i|QAXMyaH%H^6^}Od2?(YvbQHft#ny~L8ZN7tks#%uaz4L(*R?M|DMepjRb(RVV z=uh0o3Iy1jodoVrN4&5BM#}RCuY7S8lV~U+BayT+*~&P(;oavuvRjk`t}{qD08p!n zf_^XU>=>she%V*YM4~ry?tY$^+BIVi@aT6ri#FH~ zz_$g{ttbjy(u-&}l@o{D!qT^gQ)OQ4x?}t0t{1fn?NPVf1kO_&Ut)$gJwGpkj{(^y z?7L054C6U@EuE)(0yw08sKj@;-Ygz+4p~P@U%zvxADy~IZoQCUMZ&-KZ49172NQX@p413M!UAfzTqoVP6$(H9kz2&*k>*}t-Ix)b7 z)GjQ}w1`2UgC~jZ{-rxc;$}GR$!Dx7Dax+Z4gG*bwQ9xT>+bcXOHP?8ic+YfVH4jA z6n1~{J2SgQe;+P{*+NieG4?)0HH!I;41@jgm`GC^?>_SrCM5ZFiq7q1M|uZ3T*qYg z9jIAgr)OwQpGyEbX>Mj|a=5&_m)CK+wWUdg-O&G|%C>$R-p^jK+FZU7TLtOvGYB5u ze!+w}TH{9XyDJkwp)Ts_P2oZ~qI7H-y}hmj?JA}}uxnb5qit#U&AE9ejyg1&UVy{! z$h%Dn#>ot4$6DeqV!iAB`&%!xz#oKe7wg_O=K)-(dXCa2?%7@5SY1D_hpV^AdG z#g*&E`X_j2t@he>nN}FD`*mFfwl?v;0 z`da_U@SK-T)QXap0B#*WHLRgr=Z*<;^sn;RRf3}NaHPUV$PCuBZ&J-06S=ZqIKTcX zn$K2;Qsu$aJmXL(;3XAdsrkSOm?^x8Ir-i&N;kozfZ+k%(Tze<)Yo6tEON6;C#5KUBNMupYQ5DX~N|72NI?5fWIhvE+%%9CJCe zAGaUajvE?oj@ojM?8Fn6ERy-WJ+AE%sZr<2PR(3|NBe~R(q+$6s!N!9v1~s#|cR=gV+vHO3_b6!#IQ~(V?lf0v+=n(LMe*_N^%h4@m6y9@ zpbm2D7Nj+_ z=Kgdxml5}N)yipB+V$9^sO$@qr$i!8V71M0&#>97$>#>G_Qj|A%RQYuaa$6PM#dO@ z=8LjSNAy+~VYH#*%O5;}m2-KUN>c9+4LncTJMHm-ES0vKfy$3>nnry;W1MYX4*ArT zi6bOfwG-O3(hvRB)W=BTt=JR;;Y^9*nUAK_=_uJYUmg~!T3@DEekN5-@w5cTa^a-T zhDYD%FUP1d^>-{LvH>?C=Vwu?X)u|+1FJd=q*WUFx=E2vk=A?8xCE!H z`myYhrnAAp?^=8GC)uLoN$vItn7mF9RCFw@ox{W{roBy{YswPGHXjEp7+yR=HEkj* zXsVNu)Ny_)nO%wZgy^4BRtbk|DmJ$V>Al;lIG$1zA9lg*5H|CPqN;QKMQW?CTjfFJ zPRw6NUL6wXV!~@N`Z@ha_R^-P=gHovZK`#zJzT9>_LrRKwKgxJR^bk;JV&aMwXlPk zW4CG}Q{g->-7fxHEIAgK`ur<$PAL`Un$`0t?w)Q9avl7N4fCk)faN;M4X5j@<||H7 zP%|p>OvV|-wnTbptF=CU<7q_Qk->^PS?gy*wQ*}o(iU^!=;#BTZ@-GO1?6I2JTre! z>gb2QA5)b9dBkMg$f8&#B?{>aSn*#`H3;JDX)1!rm|yI=0rd%q*OJAab=w(%31 z$e_cwQ`&qa%+d;<3v7eX*qM}`eME8ThYI_ieUL&bo%r4mIJrLUJu5YJ$_w*LWjCft zw9j4++Ijog)%{04IkESi?#@CTF`=}}x}0flq8+j8IdlCEfLcYO74~kOHhn+EqV4@M zJyo)7yzq?sEL$-6hx4lWhD*sk&kBR=0UNNP{V!irXq* z0$Xr^gLS*YgYX(1qpzboq;qGI>-r*g4t0|9Z)P6nNyw6G+bI@(oM~MY?_=$A@djO) z_ea$0ORhXA&*{a-=ycy&rck?^qoa3iiM~W)a(LZD{P9c2jxcSIm7(4;Pws>|(wXON z{5Bx7dE=5hE(_&!bk0ca!1j}qB4#C3r$5g(uP?l<6dprD0c#`?MpPjytyuGm{Ak=0 z9c$SQ%sfw}<=QUaU(C~}DNsIgG&#O%ukBg&XzHt+kyEgSt^2ZMs@vF_D3-9!8USTL zn!oEW>Dy(tM_LYNHgYtVLPzh*lPSQ`+~&DWf5a|O;td{e2rC$Gp6Bg&aU;-sCq`EFMxm1ANPUG4n+@$Si;GdhE6+TwbTj>w)-*%$_B$qiX#5v=haK9bFQ3 zdZ%`Mb`#~}hGspR;KJqC>(fI~`aCE0CbON_IWO^|?$Ei~Z=t~*WXk&`sU1tF|N*I=Jx!OVhGkJ9}EQ*xgd=mE7eh$vjSr zXX!7enVA`x4p5n=CBB$*ImEnI&PPm(R7$nt=D}&*I}SdbmJJyPl0FytxMPaH_1dx_MGt(JFVr%N22(d{;9d` zH|FO~j^mjl4>j!2EW?Jz?4l!bD2Xcc29S5!5d4r z9$gEoMyg#BPPDW3_C~MYY*f@{&H$?P&ZSuB2u)1Ue(uSwKY#AS(;M+h6E&jI*hG?V zg&j??E_+Atksf2+*j$CA)}B<7sH$f6#jg=h=Z0Ez&rjTtiV>>O=6}l?!b0tNE$Yth zk(4xZA8GaB`l4XQp6czhr(U(qB(_-=`{zH?NR+ld2FVTsy&B5^%9%VhSAc>3vBu1% z@_=ua4FT=-bykI6x`C~{v2<#g08VRN>*({b{s=7IOQXL-+lkWEQO$SOiw2~t-E_Fu zpI|z}C$`(xw95YdmNA=;OM)d?bOkgmVcJiSMTO@Ee_i)tM zQ$gxaaQ(sDwa=(^bZotE9&sEci@VoxV{mfzb4iQX`7y1louVxiTn87Kf1o_0Ok9*s z-rdv1Q%8H4PIcqsB!i1%VNZ6R_i%U@)&rca@WR(q&`oTbLyxTea7IKGshE@|cp%bx}MGV>BWMlSDa#m+NIv$&zE!_KZ$XVV7utRI^*6H?^|6cIe+Y@oxKYu$zf` z(%ud)@wcj6Tsr283)<^grS{n}op*Pl;D+vJ1A}ndH(FX2y2yUT^mrA627^PX_naf! z>dbW2_v)WMrg4q@#vMoVEzvXlhLHoP4Y2NwcbnQk6UVG&VPWIQOO?LQXX>h;fo(9& z0T!v<4FFJc7I29kiOBEAy{dioN$$bpsjrXwcemIDk6oDdcv@I?q58e5$#x}`z3}*; zT86>#k=)Ne{J!CKnQ&Y1lRM+jPrS6qIiXN>w*0DP%Ec^M0d|suN6!!Klsqm0q!!O7 zHhElWmyUfnoZFc3ZOcfL%wXNi7&!0Gd2Ilt7vrb+THc17_Jcz4b?n{!VNv>?Kt#IC z*}c3#9=0sGJY?5Gr4yTn(NQ?>uQ>Q}ovtKmokm>sNhX&QjWT-|&u_1K>pSXRHfe2) ziO*fUcudw+rBcPTPmaZRTxe+E6pcp<8wt5C_o34ClhoD}O8%D9?t9Zx(yq#+`9OBW$-w zx!$f!Y)^G-L|pad!gpsJUd>Kl<~e<<{1eNSRGIkf*({W6=(EZ1ijqh(I>Gk3lbQ2b!Illlp7u|m)-9l<=elYG72*^x)@ zre4GLH#whLijK6d&N=(_?TyP4St?kSYx0_1YXGPvHDu328KT&b2qs`-vX|3<=QY+Wn z08`Y}h4qJpb#qacQBSk_GPGPc1U=yFem3RQ&|?l1vlbn8>yxy=SPn0nfpM|9JC|`` zi>VF;yoGu%0~a};rSP;q0CjCC`$mT(D#2v)t=1H$NxAmpOei`p^V}I#m4&sXBS0%J z+329Bz&prP(|6M}oZ08D#kBkf2_I^gb-s2z?KEm-pcQ{mF^OFoxT1zWbNv zgnG8+W>LhU_+Kz>Z(@Q`5E8MX$`22C+JkgzV8i>bXVG2(9qAMY}`QO?X8`9 zFR+2WaZ?wyz~B>&F@24XTn97gSZxYv{5Dgo_pn-MzCO;y98*DW+5lH;>1KSSr8VH_ zVY3ag)dTfhaxqt@v-f%43-^r8viQem33D>wIDAY(zc+4>9m)Fc)ZB6v_#6;5 zrVexTvG_2GwO!0ccAXZ**^c`~G8a$k_kBXE1Z%&4bhn_DNo~u9;r5S5g!CVlUf-;q zy@ziabBEFLNc`pl#{pof%eyn7Nq=v|LNvVUJ1_bXwXR)KksiY{U(GG;&-)e~cM+W> zOY*vEbm&XAz%@Pl9b1aM9My~pL%4!1+xZ!yfQ1e16e9BPqDi+lva#-}-M6s*(l8ty zj=Dp(UO(GmS1Luwj*xus@^$k!w?`gnkPeU3iA*uD3UUGU~LJ5nWhP5s5_mJzZIDp@-j@0`c%6Pfb%X&yx+}Lb*O7IZu{E# z;ktr0ht z&!pRG$^3Z15MIHZr|qP5)Z%Yq?;I(iA`PXWe@OcLd*5JykK3yzgFZT+aZ;4%RGQ#u z0ZBX;cf`zM&(c=<9P&`vOA!iLOgA5vc+Un7=jU9~hob^chL_a4TRn=tWmH9n$TPr8}@vf44B`Gk|F{j+WMSSN;Q)A`sY1|+6mcoU()AQ5ZGl5*#x1EY+P zQ%M0yQs!3AcybT<_g6U7Rlm2CD@r_kWh=;c&mae%kzusv9p=?FcyyBP*zH9f11;7` zix@M{$vJI4=Ml*+J~q9}MWa0mO5N)d&&4YGQPO4gK6l3OCmg2OwP>rBoA7qb(cgbZ zh9o5!K9@$X*fK1ts$CRxuVElnX;bm88*QT-CF5$vX<5a*6HBttoD}M;&NnHqXO;G! zx```(bhmS+_h>HlZWay!`b)V*hs?#x430@13WO`k9{UcU9JPyTr_B;gPHg5i+{g9g zE?QmJH&JSW=fHc%Ao# z)%yA^m~>0p6Sfv0xjB5FOkFlm!aAgYwDnQ#DHU8?#7Wi-K8K^VOvd#*p3#jIE+|}m zaDd8{^ZO`c%%)AR4s(PziD$`BGgD`n1fXhwyJxyLIiE^M4yMjRCGSJg!|@Mu+Usvt z+E#*tv4+vjq53(^9mW6N-f?bX$HfcLYSn%kHzT9=Y#%^j@TX*RlO zLDS@=D!Pt=?5VqbOcK)sK2Of%S@`jh45hGd*2*>7**drd@rvf=9&#ZT1AGd zkdBLwQrS9jU3Z|=m0U&6^kB!-{OQFY>mP;Wy6P0K?Uc9VFzp*04aMsa`sgpyY*xu7 zaXPrXa#~Z1+fh{+U6T2V55E-(H`TsW=iSlZ@3$xH#<;_GKf`tBN6GJz+@q+w8pC$? z^ZbU_0#bF!_ud~bj$)^TSGu0lew$)#cRW=}ev&53W|qXC`j(f>XhxM@xvWv^Hq&wD zOP#xiI~}+T_$$AC%$FzBjK&%4k(zgh#8#+12K?dnk_0sa~|a z)13Nb(rsvJxX5ViSxpD+ds`csGmF<>eQqg`i$+D&-XH&}t_{o17RvYLVR2RtrhwYv zdhILo2LSg+ZGAQZFG*;fOs^-|bzxf$@gMG2%&xs~UEg+hNFOz5yw3+y%+Wv94ULRF zLbLJW!ugm}J@}O&R?o5lws8H6XT~cZnBKO&-652Cv`$*EOWI01>Y%@C;M4E14WgGH ziBe?DJT=?aJygtIE*yA4I60n#anl5jDw^t&vTGS?dm;+1$aVJm{=h`%lz;@vI#Ap3 z@@*!RopQHi!HEw3lwIm1qpuP@$NX!we4BJ~+OFGQab1QGz$T8t}y1umkZJfWnGF<0vO*?=JZB675CO@&`UJ|e` zbK~7)0a8{~T4$L}w-1SxmU7p3c@-rx`aRYz!qgC++}h9zo)aV_e8k+%=HSJe-7gim zE~MR&oHFYctyXv#^s!d6!$U&#=6RK>lk3U1F}%qY4vz{Kp@>#u5({jqPWG*Qtjx4k z%sRnXwlBq_=CVVaNEu$Ko~Q1b1GgSO8*hV}?1jFv9B@Fis8 zEB&~gy#JogA+HkIhvR_GR}Ba@m1}W4=|!mQc)C^b-d{- zb1Gc5-QFJKF8ZpZU+|=& z50+7-5ovo49ck?pKavwA=ZCZ-YgzpHjvueSUL*b4%ArJBBp2v72aJp;syj5$>X&`% z9*!D(c~s#Vi6+yEsytYNdNxuNhun zh^`nw$#l@Y)ufgxKMP#H)4(Kg-(Mulvo4o|hmqp-0sfnJo@h^27IRuWuPjqKsoN!1 zIy8f_&k9YMwb_<%W&6N+G%HeF5iZ-fJQi6y$MHE)C_ZHu;vIaxIXw|ouj=fWCKI2ek<_J_OO}|?9B;qn0IfM! zR!UM(E}u)TX>a3(4=#ylHFZj>tpXTn>Z+=kQ!&hs%1*cCB%M4jO*eWZe#31678F-} zFzOrQxr7{VN2C0@yB6n;Q&eg@sN5~zMqygeOK~kDWgF9R_U8%`XCF<}1=)5+^m>Sm zX>S95v;p%ijoUfz3vVndX@_;yVf!kYmrN+lERn$4wt~@-oIM|>=`Rf2GUjXPh$AIs z8`~q%dO&lkV2{=H7IP)*Vj!D@mXvLpn|tK?XreFI<&DR#-1F!@=>$KkSo`2MbpyHV z+iz75sFI3q9OtxcGquk}Jd8PKXFF@s@gcjP| zg||xiVkWRqsFp>Ig=fk6%eTdxPUxcYwM_zcT=%<0fiZZ@b#Eb?KDjaIG!r|?#jwpR zw~l$7Ii}Uxd$IY6Z(9WJX^1V4x!{o@Ab0&vZl^P*cgC(A!PmRcGH^W0r;VVb9)B^t zP(_-QbUW@x(5XW=HE7L^w>T$?Z?w+p=g=}VqfCwXqOTI8xWDwc#%ADcOJM;=%<1m~ zDVysZt+yIUtD85%kpxG5J}QFFgK3ir+it4;ae3^vTy2N?uy@p(Zl@h2JKVEbSxoB0 zzRf_c1=>hf8@?YB`4S~P4pf7abm2!=@5CcQC2t;`X>HhD`lhnEWFB+ojV!5Ix0%FT z(v~ZmL4AaIF5C5Lo1-qd>R5gqJ(@$%K)=alJ|dbCl0-RtSVz+@i0>$0Dom~F&cMSag{SQ)7Qqr=2dH;hv`0=0jKm0eE zn}HMbb~s)Z6btx=0fl0sZB+k;A`P#-QmQuVHX4)B(9a~9O{;R?Fp5d+e>b)Nw13(^ z?Vt8f`=|ZW{%QZTf7(CopY~7tr~T9Z&uYM&H3w=x{F&(l)FbhRd&dB%M~Z=a4=_-V z%o*;9FhM=?190!@9;ip*2ls6Fp&n%z+;e#V^{67@-qaJQM{Nf8wkknA8gsaJ&j9Mt z?t^==-B53x4cue73iarW;oi(!s7J30_ngi_Jq9(nXGIV77`5SETPW0H;)Z+fpP?Qz z58V599_q2IhkK97pdKp=+_MjXdTdm1@2&#WBOHj@rVjNs(7-*mmr#$L0qz|whI$-) zaL>*G>T&YJy(gkjk82y;n<#;L+@f#~(**T+cEP>FF;H)#BHY{X9qMh8f_oDCq26YB zxL36a>Y-1|5sYf_+ZHc>7 zp*%W1!5b30yVsTXeRkOs(TFD)&oDdOjt`81H^V-hmwm`{>%4m!XU#{64?kRRSyrlp z#veabFS)oxbi_<-OAoWpc9-T+nb!QELw)w5*B;@c_qjgFZ6bY5&UuuJ=DfGHsg#!Y z+ol{`4bb*&sR0n@R1r;)v^ny4!el3V=k_t1qiq}0-@W^=dst|fo`5*pwSD}1I;l?z zPaMeGOj&&H-mHMkX(mgS>p(*kN{?OX^$Ca2tca%Yy7vt=H*)f+42tVULu@>TE=wjR z9VEXee^WObeTaETA?eD8_JN$84s5Rh(u#zmbFBCEHg)W?=1!iU-6p7comISb`=+!a zk{`U+6HiL&-50y5+bvQ(lNxTr=zOVjC+^4M+qA&8(o~wuFDf_gb8p}7eTIGM<9boC z_>);*ua94o5ItLdi|38d#s<K^bA9IuBC6}oBeb*7Qag*SKhiFbJH+-@qgqj^dC-T9@8mj)Ma&MwxHQ>kn+Vq8=> zJ(J_x@A5QtcP6?=_dDlMoBe6&ndq9jw988i5pEVi z_D)V<`cC>E5AW}c$gR?nBC90XRdcrbUb_WA>5`2W7?w6^g{!$=6(0v_msO${y6y9 zjgrF^J>On!>DSyZjhc0C)w%C6jAus!X*r6`j{x!T~3lODeP zi>WyDZ11CEvH68P)*JSaJUjTQb-kkH4?`K?DG&xMWe$#bd(%Z{m-=v<$;kA7auU(= z$57ASU%c|bMrpinr1Tj@y{((=r6--+wz_vm8*81XTzEhmyy>RS4GzJxdpULF1_k90 zI^2r5_~h|+%esB%k^>J{-Ysj(X?|oN(QiCSa_10zDe0&FjHaQ_lTYlfjSEOQzZ%@e z18|;9-SnLH>I0iYT0;ZgPKtG`yPX`@0l}#1Pv$k|=Ed zWzm%O7x9U)5#c+S8bc~Z<{$XEyWNj|v`N$~Z*$G1{;^3f_o$+gYd6L|6!pDK;tLIo zkAFHa6;W-K$O+gH`x;w(cGO0vWC5#~i;R=^sE&`Ha%=#e-dyAvP)TEn6D- z>>n}4WM<6^-_!=`{AlP_|7`h71{7^LFKu_7^1iX0)%zeodNAg#0qeK1DSz@Uv=e>b=jZ3Y z6Pn{K>q-030o|R4x#&@Y8^fxrtGUm9%B%Ik~_3fAaGG z_<#SEX6){61_pYB_KbN(2>SalX>$OHiJ2b;6N*NorNqI1(#Z3`SO^8hW12-M{OM2- z3H^n1Q8ek#WBzunl?Gi4I->Hvtt817PVkeKuM5@{;{fc!gA0@cz$Aj_Jt!i0egqHhgkZ}d1Y7c4ZbEy23qF-VN4ey#a{z#a zc0$De0UV}WWz#C~p*INdy9mk$KK3m0Z>i?en!rgAl$#)=rCN10_>czyeC8>HzZPi` z-mnbbRg9~4Vkdxu!~wvZ&`lU_9Qrk{O0=9u{f6f`FRw>|9b6D}2+o->i3mH_GN8gd z%c6+Cd3A?LeCG`S^n3L^y19xigMllQ1Am-EAms&5nN$&!JJqaW3--sgRXn!^o)9Si zq_(scwt$mpBLdtP!InG62;fn;A@EN$adHlVJMgXs58`#e59JTQ%d+3++8dB9IEd{j zQvmP{P4pxZLs0I8pu7g5TZZ1iq6p0+pjhsY;Fq2Qsf2l1T0RVo;5wR@!F#~z|7XQj@s!DLSrl>oKEUF>Gb_>p z4d~Je?c{?i16nZzRJ?E_SfVK4&(j}dOF^577de6F_%?@H<~g2n zgqeF4u$RD=zVeFxKgc=E7FG}(n%?6}=WEI(nh|U%M#y=87STKpLa-$i>9(h3@-JX0Yy&#=fqGBYeicGxav6={F5z&pM&(c&YZ)KGhs~DV&;67{T3Vq zZi=A%HiGiO)Mck=4blR$MF{C}@j~E}cxid#lY%ZwT0lX3io??d(#Ui9W zCq@+E0S)jYfM)_DxS_`gaHLl3drh>NbHV%PxF|eZj9Uazq>Pl!qh0O)n6@ zA(ahGAO>`hNdLT|&BO%(Zh;4f1uhpDT~WEX{-}zVoXg;kf-C-HEMT6~FM~tp|J83P zAPi`f8yFz*8~5Pn7T7%gIEi3zYXs$%W6R(W{(a;mI>}BL4TxuJvi@uca6g2!+ zpW~c)-2@0~Ip9uwYYX#HKXnuc;Q~{Rg#@ebz!X6N!dD(7 zCMtw^z8gV#fCC=94NrOO)yY-Ca^)m3<`U-leq>ZwL|{uPbbcSj4we8eK;38cP{>G(D8f8fK=3>e!InydD0ZG%0T;Obr(hWdCy60|f9MDA zzms5#LGYRc>=y+10P#_w+eH{0y7|h*aHMmEbj67ee&Vtch~bWn%%(P+$=mTixef zoroJ~SaDIH|7%H5a3lSnHV0s(Erk>ElZ)2S&KE^Ju=N{}`?GTe8~PncLys8H3Z&;o zWFig(KY$M+GV$Oki+@S-KU@KSQC!hUq{;=^qGAP8-i;qnEP*W(Q4qwn@5^rC(*CH* ziBCO~QDA4GH43z(f0h=|%t?B|-~b2?EQWF~^BiRB4~_(U+7|deUI|*N=SA><&du2_ z)r`lkMW63n=6NN=S#0z&IMn%`2ZO@{(xXg}7U+bv`7MsiqF4cG)yNfB9CFU?EC+7j zCB|=baV;C@$v;aAtXtR-(qfBD+ak2$t5E`YS=3qwl*J7Oe^v>h>_dP*kcPlNKn#0z zFyqD1l?Vk_CA6k6e>p(`XFvRJLEw0OUJ3ZzLr~sJyvp^ls=*E6&)EtZ=;v(?_#HaIg#y z+k!Six4aN`XjS^L`n+?F0;HM44u-IC_`WiuDs%J@hmaY0#ojd5Jml=6}Eux zU;#qTyAqZc5b>8-%Yg3r%^KfdQss|`n4z%sM`k~;hylGjvMh>_%KT2eBdTv+gO6iD zr|3mRzuEUy;NG;Vs{^h+B1I9jp^*s64>Gnya0A`eXmUA@-QU`@U70-!L-A8^A zaw5IuTy=?&?v?*>2^Hpf$Vy2Jl%RO|FJddu6$hq164p>Y8T$M&aSem-Ao%(C zm1W@JibLxIZpN)Rw0P}G3|ruI7C$nDi1aysy_{F`=R7B2`b*5z;28qoXv#B&>JV(X zsk1zwn+AO<+KI122tiQpffU7~a4`?qrmt0g|5C1G9-UQROq@oD*Q`?GC(|Af+uQlLy$n=_L~CJ zaX7+&;^`YRT=60@0o(xbo*Odx8F=+4ct7?HVnB&ni6Er2eriR~r^O*AQK2LZKI3D% z4g@zj3mw`&-wkEy)-;Kveq$`kkkkKM4?yqypAlL#!ZD6_cRv1EoViBbqKFUNATzhl)g2f{I-;yU<5{0>qEai- zc)vwyC9?_uH-RU{%WQ$pFB)0pw*X6N%Yj?JSNqzM{9(;CKb@-ng9yrRB3JVfj_9AA zA}F2pr5Jy{5d_|Q66q8nM6oab9HC0EU-pj%8Wu%3S5^s(3nURZP@Zz83J{ zop_!DAMnHa5o)BKaw;A=}~ zE$7NW^-(#WiY!@2sN9#tr?Zr@e^Oq)-zd@nSZPanGJn|SAZ(G>bUMZ^pxR8Z9ZOi(~i<3GA^<@LW+L4jQT2|%t}-CUmOA+<# z0{HW~70g}^ckBz)PTt$FN35NyGS!Ug0r zeYZi+vS8U;23t2UL!>Ky=_wN*0^A+BD2A+{P*^TFgld!5M7i`T|ECh@A0xPheW1ti zm-38(Pb-rV-x2vZI`1ta;WIgu5%fHQr8m{cSo%wKty0m^>3B1IAT z{K&f%yMUeelc9&xS-i-VWkOv&(1SOZdzL8&%_%TTj72;0iv^m{m6Zsentq43Ixywa z#h`)(CWud5>my?;r01r)x@u)=OBepo`EL9r)xT z_{p=lTyOjozYUq6)F2|Zg2BTHlV}7IxJCN~0yy4pdH03@9tHlY=ptEBxqk+a#_JYp z1Y4|-tN93XIYi_tXT@J1H_%&zpEjC#Qw|Q>&l+ziv)WU$?9dh~{4rMs2W~V!*JnX# zu|`skELs~}nf|-}`1}a06&VTP&v-I)zAi$ylpjKX6JLgnMo#~g$7--ZKlX?6>NS)X zM20_qa|=C?T2W(JaoG$3z{IkgucbPx5kH`EgtfwMNPWz$Cp@zw4^2WG(-sNXv_6D9 z!=bsKC5|(FPuJvJtyupdka+Xu!diUbR)Q=QAineqi*&^k?eM+Pet{aG9JvtL#kU+R z53RMx!RvR=ru8hVTnL}2Jp8Xp-w(wtvjv33_yTD@#Jq`M0(#gF_{XOD|X4ImqE%3phhMA#lSR zi@nHY>t2{GIJ}tyh@YYA%YF;ACcbEV5^{>5+7G#kr@%Xev~&~yxIwUd4W8TJm{~p; zsz*pmAyUp+S1ggxOwXFMBHzz7@u~je0VbeBo93y6bk+T z!RwZg)waE2D>Y6F-D_BH0x1`iuUVc$z=xrx`emLkS^jlpc_8tpfnH0JAM{(Skil}> zGF!YrF27${hJ%E?+hbXue3Npz(sua;~-m&F`g}f>%dbEt`yrZ%Kx>Lx4VzP^O?0#UeIQOta0*&7qjqe z?f=oZ2Os1@qHgQ6d&-gETHNc0Dm2!TabiXeC}R5GL#kY26j$S_`pI8Egq4o~?@u!&`0b<2Js0BQ0l0DGUM*L@;IkK9#6RMpiK`);KLq|7S@pCvs9n2P79v4#?~3CUZrg+yDU{fm~YJzY@>( zZmUoweoY)%DeZ)OQVf||IY-d0WwvXjTr9HYrwjlCNaqS!K}x)f;*$Lnyb_CiAUf|a z=`2`Uuy|YgXNMM?L_WV^OWBDPa8Q({Uape!wRy|P$1VMSQ;0>>Gdpm3#=!@0!Ql&N zp7dL#XGsj`aEm@d1Q8S~Uc{f5^N#%DDGcP} z^Y`|wD6Xzzz-bp8TfsbElZ%2}w*Fnc%>X<@i3xv@3pB>agfnsy5#!Lpt~lGWD~``0 z7>g}~V?m2}gP;{B@rNwf5Rtcm!I5qua#5_Zc-bw)>vKYw4`mks+}XA8e8cj}GOizV z#f_IAHpIK)O9Y>DDGJ<)dqsQ&se5|O%B@xyFD+;J`n|gQv7>5RqoB@IF{E3jiPwt4 zoi(_jm0{EUO{$!zybb(_2XZyvobV_&z9eR$^-}?U=VV$XXz6AhiO?;uD5}R1z%#*+ z7??)=Ys!f#AcuK=i12ET@f3)7oqEfa0qyt6{maVo&xMtcwV63&_QL`hiEm!Xen5?Q zpOg1D?i|vgecnlk3af3`RBpHG#ayo;`sU~nJiiqSgI@sU+_I9I_@_q=p(?}=&`Hx- zxS{vRWosnQiGSHb0CM_s{{-(Vze+(!#7zTG>VjVGkt&D5 zk$HIJ^MDUNtg48sc#*wQp5aser#G#^Y+2vD0&ZC`)V#8=vIK6PMDm>YM?4N9-$Akb zs-xtz?jy2*3Iul=fK!O$IJylW ziO@q>lh8T=cBW1a`5-ezJ{dGQzoP33TKF>en%+#0oP{K^xYmJRAxMo#rOU1wRO>!XWJ(rFCa+51gFJK5v4#FlLgg~RM-mBqo(gY#iF>FG ze!Yym5e)tUf68veU{(14%sqYrCfv?Vf+GbzGUH|Wr@?~NDbuRzWn918Z=Qh~BEDt} zIkgY06kht2MfqeQz`Ka|Ns!fU$fviEd9Y66-{{3EUjt-9;N`nOd~Ia@N@Z1ynfxmM zr+xgRlSx=%N4|9jnZVzLr@RvXWQ0CZ&-%dwDh@{t@SVSiSq6ufdoovLs)0#(of`kV z{LJK<>?3l`)O5wNLuV6%_yfWc8~%6qNpCljW8`Awv7eVsStP0fJ+ z`wooSVt)v(q_2m7%xU7EI^VWjNQS?8WF<+>N>%5L{wUx(@wx?RLxWbH0D@xJg6W?; zw8?N)SL`3F>B^Or+R4`y z9UO>3d-|dSvB3c@82lDzPhY2iFti&sz$Z`){%Qwo0RAsFI0!=V!Mb|7dAc}37-DFr z01Vm>6X4?+6ohd_`vqV_JfW|I2=Z_W0)JsZ9B*&z0Z(6dvkzStm77mOHqgl8by z8^nWPeqI@Whe)!(i@JC_dHP@i#32mnzY_vpa1~RQ2?1}_H5erBe+?~Y_$~=Zu2`2~ zAB=C1)AG1UfJ1@>_XnVToPsa`o=)C@KY5QIGYEL~ZHN;XZLX_lhBhS=0eqSdXzomyx$3v*p#Q?#R_ni;rTNC>TFqzV35qqVF|Ots9+(8i_^j-H{3 zfgX4k2xF>dWUi-WCWh8C(lD^l)HBi%L#tbuqm7Ks(FS^kdgkC^=Eh=p^uM15ff;L~ z4Yf=)biplZ>Usux=GOSDYU`OBL08lU=}|+QsF|AUX;>JjnW9ZBOihf2 zFi_Jo)Y8O{pPmtTU9^^^mXSHyOjpgoVD(L@Yk>r*sT*j)kl;;e>X~Y3m_wu!KEW6o zAV)x248+i8CR!SL&<8CmEs%CKQ)@Ah185CnBQvc%7T`hPPPC?)p_-1C8Cn?00SN1_ zOaR%fVPUFe2+;@LwwZ;xnYo_1g}D}5$JkgC;x5`u%hXa&L(6PC+Q1m%w>H|sObbt# zrkc4L{_-FS$QV6 z6lfWnT0_tfKkytEL+{nq0=Jt&ECg@Q+*A!>jG4Kqo`(7A!@x_L8=K;9?&tlYjkI(O z^mMe0G_;@tj3J=CdS+T8;27zdK?msJFAfeocv%bly+Z>7(guF~n_!CJM-Z*2jaJjN z)Pv|J91jk=nI1tz@a)sjC2$`aeF<7xK2Kj4?_f}0sDPF**w-^i0uvg9@ePD#oP;jM z8`M>XPA&o1KyiZ=p_S2o!Oq^EE@%xuKMRl^Wo76fZO_o4-~bG51T7k^ zVPaxoq-XA6u4QKKU}gb|ityiYM7ICsNMXqEOZ|GY^shI|{Ccw{22!y90t(*wcR-j> z2Q4E_VQ?QUe2>bs;87u1Pf)Kx#0iUlUFZ(cXcrIAXhW>E-G|G)8KWb^En`{NL@G|5w`I;y**D{TMe-Z;ZH;&;Qgl z{t*93fg#7L@Bfp5zW+~BLHeKg@4wMtj|=oQccAU?^9*X+^!SB?uzn7K0WPkd0U{Ex zko;-CL=YD1z27tFk3bSZ0l^rjU{_D^QC<(~tk|N?*X=09*a0`H(G+J7G zek35+*B2AuU}kJ#szKl#jSm<}Lg^CdGyWhbL_=)waq>gk79JTb)7G z7lK!PNC+@O^F^XUvpE3chS-MZ)!(*ALtAKRJ>AgG!Jgi(4tR|~3n@+L9#`Ett&0c7 zWxoR$Ht3kD8UA&rfu@?KCb&&pe3_5n5BN#k+X=nRo8U*&V!*)F?f)N2_W$7a>-^t} zF#L~P>a<6BtGAh$po>hD1?H182xA+3jZ zF#dilUdJN0gCzL};~f%DSB!6vr<*4x;1`DlfmAOa0H+dvagb9`kQ1o5T>U&#l3c|QzoxMOU`-@`(FyMaA5KIWxJJ{z}V8H?2-k!eu|GtMe zILOl*WGL^ymlQC;$Hv+a?9Xff!Rf|t#b*JQBWTFFtvW+k1UzT;!3ZDP3T$?gKmUQg zw3MWX2s+{r9>)wn>gWKBlPmmD+Y{sMD(nKvO3>=qKoE}D;A51P&BOdKXbkk_zF=2u z#peE^fv!JV)DIiz8HDu(4Tz)&;ot};QyU!Mi=bRt`LBe)mtDCMnt&v-9SzeT;u#PW z?Bu-wJwU?0d>=tr_yfoj_!d?!vrM^fu($VLPsWEweog^_82m*8e{uUO3|l^D)y@FW z?qLE5r~d82KM(wQ@k4)42mOaxpkJqEEPV0)2ORbNi$lz{rR3GMG%?t^`~m+Wp{5rU?28GMmc<`q21d-kqdLIb0Mtmoxt=Lr zI{$ne3>UbTLkW;;I@Zi71cM(-4Xh8eK=JRS2@ztvDtBRMqNM|B4v_O`H(_4<*W3rg zhl+#72h?L6z_thM}FEoH1xGXj#X_DF71)E%Ts#FuWq* zC19LwJA*ufyq9wu$fV0(r`W1HASgd`(AMc8Y#nS1+z_hV+(b(Xy5zDdBj6Hl0p4l= zEg}Va!#stDATrCJ3TKIM93TNgZL?t+HFCw@Pi5 z2Y<`s*#T=qVUg9jo?r0ee+@VOkKlzO_*-#}yjZObelOY1_#?N0o}9~nCf&kY+{E#m zHircl@6ABGGIa6-Nd?Upw1OH4a#+hqgZEcN|3%ZUqIAFKo4vbwCSKsl9UHZGUsu5gJ6W9g)m8e1|^8U_A`g`MDPAwCD z6#m`w|DE%QJ;&$YypR;J=eYjccLaL9zhB>378@T}srz{PU?3;=_ZH$eA^^``Jr}3~ z0-TM1gj&A7D|~%dOrT4Eryr#JeyKNp;VAt(qDi~LBUvfCP&rUyWR<`l8G`gkgFi0d zcBNI42p%U7_T|B`kcU1ifIo7)KY^s(zzt4zp$d}F4)}oOlie^sS54#z7m+9Q735bB zE-!pCeup&tR~kb&!HKY)0E)N(2<$_zzX1;{S81(e2+k=|9qqzh52xw{+w3NpA2-P`<|qpRM@MwcwhiR#H|`>Tgo} zi?HzTLi~$^K*=R=ceMbUTB=F&BDo5Z2cMv)`S;=YtMsb#t~vp76Mu8cs_U$r;^yt- z9{7uM@ToK8N#Hq1xBAzY`o-+jWnun9GFUI>{lcT#Uvv#$OB>NfvipKE_vSSNBAk3H{6NX2Y69PGyWHOhBSGHxN6C<&b z%wrSwx8JJjZmIRMWgwY7_u_LxEUBxyy1HIns&0EoF~o;grtu{ed}S5i4>v$QLhujJ znDI1T4zrI;;Q|*;I8K+<#;RT)vSqf~Xu_8%NwA^LDcKCzpk+%LX2Ku>Kf)@(soiT6 zthp%vGPPr58b_YDOT7o2KT;TvtjzCrU^2>2O;HGv6$oXfV3LZR*)(0fKkn{r7Zbyn zOT&LHMq%F%tr6s`d~8GbWwd%oDvt z=xR+z9u6@(Ql6fu`)`nv#&?yHB!~dZAtfjoiggWP=a7=86pzPCgPOHWnS14F`gH$! zxVf9;resU*Id3%69Qs@n9|g^teGx2~x5nkw*wp*ZC3;MZ`4INw(f({LPeDNrbK;Iu z`JBu;&tx=btD1s?2I)Od5tRSK(^X~abTK8rm?`Mq%sGg)$PoC?pFckZ2iJZO2Q%OV zEM|6tSBfdnL&wQN0MOgvnk4VswOaG2+7Q#zbFKUzsiY4O5=BWBehAvXg9bm#UjY3u z`J2mjBwj#He=~vm{Thu&zLd!OPGax4SXZuwQ4rqc`xg(7_I5hxWJ_PS-fzC!>27^II@&on7NyVF>V7$>^Ud2%R*L6t zAJ%uz57K-9h^+RW2QvTQWj%KR*xlLTl`la_`O#JfFv((a_!_Atm)D|{Jh&8<d58IXc>6`A5@XcJ4z9`ycN`tt2cNFISg!bd%L^yd1ve6F>a7m#|UhSkNCb^ zINm&ZyK~&#-#d5*fBrbyB*|03fPKheVGM&d_oB0{kDcSg_g#)hqXKm@$ojHcn~rz3 zcRuVKYwts`(xck&cWdYO|D@M{M?~e(eay1|^|iSDfAy-d`fUGy#OHg~e+N<| z%e^1G2l^N=ZPJFJ2N%8uD6;EOKe!GI*SAdXPkuZ_da-Pd8pLdDO5h(*6k8#gn10rM z-$-Bh!s3UR8seWG-L`NclYpqb9-H>azX(?=c_U4gk$<=JK7StjNw@!sw|{~@X4wCg zwbhll{cpmO;MxBFfX{ce|M9IqQmmeEGYq%>WAn%yKHN751nHjP{lqh&=P&6`KRIsC z@-nK~uT1kc{n76JX2zz5_a8Ej)yQ^WGaS;8j}B8%Vy}wG3;m2wkh4`5y$>P~x~c3W zQV5O!;&cW%8I>V41t57NS3*Wx9M)c2-oa!%4wFQ+*I`O%6Wo{QYei%TGw7n2*6x_< z>v=P(wNGvJ*0f!d=Y1Aa8*GkylS{2=;D7K*@5%+?&{oqP{bd@i)~q+{;X^fJ#dAoQ zALmb>h+(NwKu8zonidqp$C#N9iP*mo!y!1G55ub>dqkaH9?GYWJ#M>$78(-uD* zWHl%B9nNeVm}Yva)aDf1yL@sxnJKtd4#{1cBDuf(w@dC*i0<7J$nNBE!fQQ^^iD5Y zpDDe+)XVAfo005}zT%L6Qd!}so~PIcr}Rav5S#37?`Jc`DTBBLV_xiKA->jeE#S2`JYdE{->{a(5wga zPVX^Uab>gYgHsHE}e|2BT*W%DQhk_Oys9qXKAd9t0rFc$gU|9GOD8BQV5Np?=HbYy(eOh41mdhGcC5Zm?SK4eM)7Y&BRV zh#vkO65LudWv)Qogw!;{ISX#`xkG&d?8AQIaYK1rucxyzXbt1^K&?@4u1xK( zo_zd>{zP|qrflD_NBB=`;G6|l^N3pjR8OMFpgSAI?J)M)-%nz#%}rSxt(l58!wh8e z4Eda7o5FqdOxi}IsMu%(=XLbL^EzTZ8x2GlH)bl*W)x{NM4E-N8K6u>*bM^hgq|%X=5yB8faek>eHSkPoCpvsOqtT%bJu&Y8@N#-qFDDMPr%!^W@ib_f zPlIOqVGFs@tV~5yYvjc<{RKdNJg=Sz&-9dTemuWqiFk9Ch}WZC(C$MNA`#!w^;9BL z5Qx2+O%(~8l4->bcN21X1YG-Ml)TVbEBDl0!L0Xnev@+;=fzhij~Mmh6rk-2FE_V zQB%dliAgqUshF}Ft%yd!pN#dWVgTH_p5Vgt=1Hz)n>x3V8#`~E8+ilUH*;eb&F7-M zH6QlYoW!p@s{Jf;xtanoL*LRmX*B09iHs!4{_ZzA^L^6a|H=IXPt(WD`tSN$eE-kt zbN%0s`Fzj%KlP;V2Pe64Ti?Ue+X$VWX8y#}T+Qu?ORvGONc%HT^AFP)q#RnDBmF!b zbWO>@ig-(Ch!LPaUjNpfmN|yJ8gT#u|@V z&lII%1NaJHCc8Ag&`JBT>VXg#zga`FpKOuU2Fw^-TJ}0Z*!bHtU!PpCir~EPTP=eo)#k)4-VTFr9x5A#N?7HRx(+6&6Yw?jbF++K}@? z(M#Sj^jRqAoxS~?gX8vNEw`foytgNjs_2Jwe04Qb|LgqszgAaPTJ=}WSD^pRHT?ar z)$c${;`9Gp{}c0n^<|`AuIQHibbZXQ|E;yvR$%|vTKN0lEBKS(&-VWZdAH?v*xc%F@9cg&&`uJAIIFS~2!_2$zi*lYbFg7M7_UojQ~Nh7mI&zZ zV0Z6rk^3A9z5(fn&EtR2@0)31ld3{(mDvtP^kA_SoDqb;r=snEnGX>Q?@*~!*zrYV z@cft_)^{f30ap5X4=RV=RbOkOJ)(!xyp z+HxHmi~iWP;aWy-Y$gzaZ=(9a3Al1ZhBrbI^+fwam!?phB6M?eqYqu=wD-k#uJ|Fl z&d|RxTobK|7%1Qz0evyN=GYU*DuqOM-|roCKkXcKV6C!I*MHUPyag~@VKb}M3?E|y zzZP^-6EzHKI~AKcBYe8wcZBfl9lX`h@t2zALeL=5Be-nO_h7o4(dmsMJlg4e+&|Xt zOs^by97^OJ{-R(CWI#%(A+#lmA-KKq&nRJiI%J9n`{xvrN($at{iEt8ddHjbzQHu) z>p6-sochGzipA7^W4B+tV0%M$1A=H=LnO!gVA3Hp;}!`m#n7G+Lq?z~42;p0>0H6LK3FMy?&xvaLh}^o4DYMvJ2lTAU>I4e5fS1+ z3e&71vPC;7t$-D)lFF4LT~tE`auXCVn@T{_1V??QOhJVIp>qF)CPnIzGgNIAgx$X5 zFlP+L37Rn*gqh7yIkZc*d1JbIF{QK4yklAj&0>kxG4C) zkiJq##DDfBEq0zV#+V-eHyf>2jd=XmYOOrSe?Q{$VsUxmxywC_{7rYvYBz<#3$}$K zpyXw-YQ~00jCN5NLO$5VlW^g*<-*`MOOM{OYtqEOJgGW&Q?FQKip+ZCpn`bcN*=sS9B1EQ99 z+dGU>$LMlju#Q3$R$Fsuif@J!oBM}}4RPma43B8Ia%W0NdKC~+S4%@MdOgFfFq^mn z9WP<8&W%TB+~J9V@E`uV6CE9=@&D)>;Go0<^ej0AY8^0mndiGXUSt9|G|*>B18~fv zgXs)}vivIiTY_ORxdWR|3uSG@>4$h&+O)j}lM~QSp-{pk$_LjOf#rj6 zwNx+ilbdn2EZPGya*a!mD23Ky;<0IQy-*V9yK+e4_Q32-@aV$2(&Pru*cZ?7dpDd= zYFN0r!0m-1u zOUsNqwy%YSfD%zI%zu;-?7IZKFvnL2b)i5>@5IA|&ha*GFDQQWU}eHWcAXs3zKAoX z>$=njb`s+^Jw3IH$up>nba!E)$Tba}7dVNLb#2-KHk@=yz)7s)9f&|a12MzE7y*&n z8z&s-jN{^Hp-0bTG%*5YI!3^BU1b56<$ZAph-fbo3Lgnf-$d=tM0J6vknhTU&T7i% z;gc%Q{$XAW(5#2?0w&7p8B-aKRnsfwh!jL*P~X5pMW#canHUs#?~OP2#Wz@0$5W5Ad*EE=xVvJ@Rjn6Oi|xb z7wEY!ED&7qJg(0nuXuCb-#z|9ICT*lPoSo8rLTZhp(ny31q=&}Ved{JeJa|?6En%< z_$Kh$@J+tQ4LEO&!DoB^WH@9su;5_+{fP|?U_!*(M~}M=kSQD1LzJuK8{C4}sw#Sd zRu=wJqb*k5;1d*TV6cH9fFO_+1rOWA7RgYZ^p4hvWOCMHKrzO0-~_jGB0oNN%Ti`EER1*j?i|8qFwGl9hw+J8n zhj~ApoG+hMNGEt|2qDIzHS!WEbFskpiA}@ObPcmj2wa{vMYr=ty+S zosU9Big3kDmeM%1S|LVC(NWL{ps2{G-d)@)gg07eLfG&RkW3CcbCq@3m3Pi<&eWn$RC7iV|u;dnnMW6u7kSalh~&k$n0!*9H7eZFq)J z8JxF#j$F1N+N4%oc1n$Qd)Zl^+Ss12JuT?-Kqw^7YC4)=;xI@w<^iFZF|lLod7a%?FS-( zHHtgoX(TZh98aF%r$Hl}Ua47j4WZddz4j{vDghEH-@$6gGeMhuNB9dAWjP#>CCs1k z#1=pM!{TaIr8N|oUa~?Su6=yR303D#!6thOlVJjv&`KqWb;10>O0DPM`7W5vaD#5n59}g>_Vh$Yag-PW z6el1gxN~`Ao-xz!>#62AMia|qh7Rr!MBjr*KWtoTsJy3jAT6h5ZP(K0b~|X@8ygo( zdH57`^|H)JwgqQUh{gs?E!gD&n1AY25$AH$@<)B>2bp%7!*2!-jxRAbWM+w&$V0oY z0g8Ktak716^&!?b{8`Wz6&kz1z>sN5Jgcmw5Yn;-=4~){RRO@awqjF(F4FhH05Fsil?B}1E8m|0V#AqnwiEx<_%nMA?P&8<$4Y=qkPn+sfb!L?|E!ifTPYvjx z2!d6jUIjd@&*SGQP{NZa;d{Ips^P)m!A>zHgC2d+qlgEL<&AjQz;`rsC;+TEm#WDQ z%Hi;>(CjK0nqpaww-c|0WG^QOeWqB8aM2eoQ)IJsVNBGeijH}FhQ%Jfd>6-RuPMhA zXd_?6cK&)#i&z02EMPTQPVlrbrQK-V9rHVjMI7#eGLm2kOITk=jH+Cs!sMQM*|QsI z2@Uy-E-0D2MY00m?g5-mkEErkPJtGgG!1wRZTQP-Pl4u_W>GVLDd1>_oVd_41|adsQ*Yl9y&ad1+?KOSiks z2}OUU8r$y4X6=8@$k^iYcCT~DwqCwuO}$aqn;e9a1oCBc_=1)hAbb-H{3rP9dR`x+ zDvYJf5k$HH?+sghPJtubfz_>B>tjj$*z_@m#FyOoJKXMdU|2bi)sdib<8KQU6JwE2 zDn-Q`DTLEc5~bVk`y{u{F~+MvIC)wjF~qe+_`*MU$8O)jl?W#x2A1NP8q8P1M2+JA zq8>=v()R4|j|*MI_|{&d?0t>iybootk;+msCP-XBe*77(-r{1@Zl8*jddis3@mVfz zETpnQ@hUSop{ky+ClxS_@Mpx053Dil|7Gu5`_smi{_Df1P=QmR1rySyJta-HDM?z+ z=C--?@|0}i7$>j=%wovpZ2R4x`OiqUY@D{)?dkL4S$?}I$kIq7%}w&m=)za*917E& zK>OEYJ?uI4Wo9s4{yCeG69OQK0;|n$8hor^Ypb?}7#W1NxcK~cq+9Yc=l>N9y80FB zcMAjfO8(!*lgCd}{$EQ^pZ&W}!HuBo1;HRNX^AV@qlPo7G9IMMaIj=w$w{1* zmmTXR3$B5{Nr`Vz&Z?JDCM7!z4gRloj+A*>`N|)WR30eV{}>Qkea|0}dM0$)aVP8{ zERNl7)F#GspvR;(v8m#a;brCb;iX_;7^m7r)2#-|ZvJI=D(<2I-|t&tb&BJ<$Zyw4 z&WL$$OkZQ%&GDe>k#3QgIKtY5^UXs4d^V^WFmRTB+dh1a-Iruv<+Qu+mm`(#!-EOn z;2r~~5W;Zcj>rNH&JC1wZeGIWYpHo1#XiD%=Hn^OT7YQgc`psqqKh=ogD{>BcrEMK zB7E98@jbtP3HLzGy8QJ;Hhma??jSJc+SHorWe$+wpbAi9Yj^K`d*_w2)qY6`wa;No zRn^smEPK+g2G*Adq^jB@ `V1}>EzeI$blmk9Vi!P)GeQ}>&LAecl8_A&^kXtlkj z78V<_Wp+bm`1+7bzGTyy4^l# z$)$<%a4wz#a4T>evVw0=w%*>iBX5Y6PlkP5fje1Y$J9aKxr1DMoM=~wA>`l#PTj8U zzd8YZmUR{Q_S@02~N~b`~f%!4o**z7}{?Z-Hm0Lgf(#zIK zYmM+ed9$`v#xw7dAD@s)<>4S8$tnm52Ma{qq)uSe6F+z!zF0(3AXUVm{cAG3PmEVo z9z)!0@2sETP^H}3-G8~}^k{Eu52~u>hfc`R%G$V}N>svpRrN{XB(~&g*IV1W4WJ~^Ngtp z*!m}XliEdcqN9)W%ShSyIfu?^BwjEalYm?)75`|pY8RgOSrsLGMHLhCuI3P^1yNZE z^hF3C?!Q0Tz?{U8D-k_W6`wd+ojP^XPA#t9Uph@mq10Ti6m3*;)(eg#fwDr@@7c{} znO_VB%D?tK7#pq%hy3biOd3+|J%IEFEDqqXSNWcH#m{7wqy;A{NE$$$}c*PoQ1qzJo`zp!Ga9ar=yNiv&WU~$+KF2 z%cSY{@tob-K6|cA`_VVG|I!o{V?xNQ+5jaHa{QjC112eF*2eLbUHkrhsm-5MgMK#! z9tD-#JK*|u2PpVr2cvWcBb=(`GF6(qQn8mbo7!M|M-}Wj?&L_aa|A3{+YpIk8@aRb z#l$69j$Rz%#-xnU+VMkXx1^Is{o!nw**EP&K324F3|+0Yj?m#XQx=!4Y^w?wuUa1#8|q;zTRn{92{#p~A}42v)WwfQ=0(uYVFw2ev72u=ZvnwhQ*Qjt=lY+jh9) z?Zmsj<|tyaO(|^!Tz%;|hydnCKv!ZMTBn&CZa2Mwv<(8&K*nF0lWoNW=t|B` z*^qd|>nqC(gp7O#TCLVfURPRHL|E1@Xy;bMAIu!J^HETnOs9SM=3jgMSng@c|3n{+ z_iZb?v+))Jl9v{h{%hxdbLYQj>;vqK2j8!cujGGuvha8={V@B80=$R{iQ7d*B8 z@??_(5%6Qv8%+nQ)I1*q-pA513(4|5^Nv*_H5ZO6746I?Z*uZ8giJP#K@uuQf?T_^ z;g}Ca-HAK&r~V|4Re_5JM>N1c^@R1cF#Wg zH&sRddhiRakZeI~Jw_D`vbeGH=8ybKVf~}M^|ix|{O81&iw4I(1Sno_8L;utWpAAr z^L;&yWdaYE7ZTb-oQL|})bHjiJdAs)#xLI5J7xm)3YOayaSyMn@-LMc;Y(kRDx5N{ ziIB#~k%NY0zkfG~O?khKgDxD@M*h{n(3yVrf*u*49993dKBQ`>9aq5Jy{QU-6Z`4(+)!QwhY5$B;?TVY z?gjL)O8)}TPx^OLew!;~;Yo1S3xaXzC`>Idfq(flFVjs;a9z*H=e{9MEJhKC_f`a? zy&hLC4wLc+>`Fbu0lfk2`G}CNET^U%vym>#*Y5U7L?vsmjA}$7i3w|@In;ihAz}1f z#OzfrvgpLRMiV7o7C$vxEL1liBtv<=|VlY=?k$cfIZ{G1i{Dxj@FjjGtWVu)xYGmQ*QXFYSJKcw!@L{EM z^|0J*5`LZV0Xx{Ic{A>0#4atxhJY(B+NAI~cl%P!(MB=oj2;$8oskvGle=v(=@B2o zLm;r8A)00B{(5(tggU$!jERNE1Q6@fJu`8Ax76*P>6#v^Pt?>}mj=wd#Q^kUeZmLn z3#uSayq7nU{#;j*2(@99Ta51=?Oyi7U~;2) zH4mIW_l+S|7K6i7CphGoH{Y z$^LA4W%GzBOoYaL)_&7s&ZP|J^RV&6X!O37zT9(D}}2{|(A5J63YVDN<+ z-eu^7z05~Z{^8s|UU=PP750WLAH3e!+N!7oq-at3LX#Y zwic4r=ynwDG{^|-31N5ZAi2xi$B86@?7VSM`E#9r9jDaLqWt6TFg+~m(fm?p&+VU{ zJ=52TJ4}yI_jISx{poS&&R{*W<%6?weN?U{GfXWuVKT|=PKPvhI=9dm4*H|%?Gp?V z%_SDOc}wEP@AS!%|L_R-o_%~d|Kp>l4axtW$p5(1_*?$}h)?03;=^BJ0?;$By{cJG zAvy)1x?umusZcvIEBGUiGnCRUqTlsv{`tA@(RMK>nXHZb!s5chQf=XBZQ+^IXmD!D zv}^FQs-j8@{Pz+6eawHCzTyPQxlF7ig?IM#)lR+y=F4urw|JMP{CabRZ}RMoU3xQp zcsWnxych30rgwGVE&NsA-NIjU+okqjn9B@L-NId*bZ>FaEzJ4l>KRuxU)p)5z1^js5dure$i-0cX^2 zt`M04;@_pS&THNl|MWE-2T*19f$}mh@eP}3QV$U^Y2WIiS%*7C+nHWj$#53x*a3HH zhR5@G#$K{xxwaQN-?`f9a~{0seW>^*m=b>U-{R?3_(j2>?gH z6&o~0+WwYGCZ{!LmM$(d)lOh?3=u6JPHt4^w78%%P?lo4L*kXmkSE2-tH$d6MGeSG zGp3gDZ>^_3q5T8t3SO1ZpLgKLcqH$;j1c`GogCwf@!3?kQDA>BXlG})E!+=L{`n1o7pqxFrw_4d9rA{&VBPQ20n*fayg zLo5tpWF0|*A*YbwGHN6pqT+Noj_Mx9$!l~ykmVI#=u3n2v;u(M!EjG+d%j5=$z{ZF zGdQ)u(W5>JDm3l;K5}W1guUQQL(l0;4dFC6U43yenjt!ch!sQ<5mk|005nZqGEH4- zniA?YbW}_z)O;2MKXkp6Z@pe{cAJY!WqDJDvVgHaOQQRxdSmEF6GzpoIL_w{T@A^M z;tW&%G-4m&9rg_?#Ou}91~Qq^^)q+k1j_z#_M5s0h#NrzROa9`f}iXKPEN1sO7Rc< zt#+yzU8A5rfrM#oO5vvuzjiuE^Y^J#{6na%#?U^O>i0h_ho9hv_~BRQ7@mlqoV`v1 zg?j|3NPj<-PCw^jDxx0aA5o|JcV0U=mcqIXv+f+Sf8*y|ZZgENd%hUM$YV+l0+OGY zy-;#dAzeIC*+*YzD&XhQr- zH`-7*<8<)^^2{FuSFjCCdMx1s+J7tG4f`;N0@0Av+fFdm=Eaq-9?1Fo10I>n&^R#t~T-)ayMX8Yk#CRJCnMW(41A z5@kqJ1n#}?_!^9r+IB4YR;Z9kF|(Vl8}{A}<#LADuS;89^k2L*sHrRJ=xl3YOqwLl z#=|vb9M{`iphseX;1TgeSi>PzMuUAswqOCMs7Gv%>B|PX8N!G6kaiwXE+DR@@OaLn^$>IwfsEGY-7xXo7P+*a}eHJstA`xwK z+M{fEnXG29Y>veyrkQ8?ko67>b|_7}?YMGpLUUD(HRW2TadK8_46LbTDdf5C-C(}Q zeea`?KB;W5ac~xTc)>w}r4T;xK_c-nG zevoE|T2vg1?pPOU(P4+A#nNQGYDi0n{O!0JwfJ#lZE9N85?W9-Ri~3ztH~Vj#ozI#v$r#Ay_F2+|WsP2UJY&u5;+g4UUz=vO(#}AsS zuIi=8nch4q6?w>|<7TIB*L$8~>eU3I1ue7L4Pe}-9V0d!L-&FX+oDZ7;9a) ztsTObN>xf|Xj zDD@Plze5?Y{ z5Te)xBg3{%|G~@BEYTQt#Y&<7X-^x_ z!X|{vMxHz2JKe-}z>3W26zfFW_=UVZUH!GmU+oy0VqG<<;%bV!v!w@ATyI>-MV1U( z8v5=sxdI{pXIf@o7s>F&9z}#QXXE<_YGNRRAYfGWa!kQwJcR^Xb}5dsdg3#v5fTSt zYd})E%1}s(d-^UrNvclR@dYkt!6k1(^~OOE2rv3ccWrI0feZm=C-KH!ZQ3m{oKwoUE~*(0@o_2 z)}TM8RTNG@4t_qE5_?mXZLu|lm=VimI$`2D^ED7}z{?CdH1)`yd?+dpXicG*II10&q$;zJ%&tOiSBPR`+zR)MC{CMHn6FK|= z00#cVSwsg_^{>XWMaX1bx@4rJBuX6;wIxzsX;(Zs+~PK{SGwKM)C$EWJ1sQNeXnHX z3{OALo^EbQdAVi>#a|GUqWR_`<$|UW31Pj!DMVudp;#<*BFH(04Y6RBHzonQP>;}3 z=eVmWI{$-|5?w*q>U6(zO5&T)xidCKyfuv}ki;e8F+F&T0kH3Z32FA0I6t>l9jCd* z22Qt^vn7M5O#oFaspwFBF`qs-_M?}N8b;n6iNg5{#*VW$2=XKYd&D-5#eN0uWzHH) z2!VN_?e?#Y)b>@2mtl>_v6Z#?6*U*m?G$oyiwX>qnbGd;5iaeE-z=~=i4Kqlyy+Q` zxn@oZ7zS-#cyk*a(-ELGVj&Sl7*}L-^FU6u$Z3|eo)Dow)rZqePn;u88QEkE4L;?M zPXp~US%&dOzdCs$6Cjt0$F(K-Ff@kp*n~QIq(^s5Lh2u^3GRcEKHCe7B3Qd3$ zZj#3Oa;H=4d9#$T+VV8lMU6_c8fn>Tetv_JWc_RiO2^jDIov9#9<%DG_2l7 zQ-4qjNhHSSfSef-H)E3Ik%Oj9+0NlSB)DR;B#`q%`Vc4;)gqFjmGF>40*B2^V$nBG zdTh1SQ)fX;*>nEGt;DV|TM#+X&|PRsO~RQk?{T^8A7Lm>g3*Q8CpZ;qnpV-kG9YF= z>!qK0bC7yX3$un`CQ9Ts3{ud+C*104;*J%+U=_n{#^*B~)w~rDF3anfr!m-6IsMAT zCyDDn`rI(%faQ*oN%lFUwXKH@LX-Ykq<=ake)oTh-;bpDF&B%PyOTWoOVSLI2x3Ui zSMDOkzQ;zIjf?NFlQybPpAyBAw7P7z*2}!BUe+7x`E!cocKptp?CE6o4IE^YBlwt7%#Cft&PFL&PY~27NA-AKm>q=2d-+`)b(ASD*H>$A-oFOX) zbUVybGdV0rL3tC+=H*@@)M1hk39OpfHfCh>RgA*I4T>qHn2mDtxkJu@mdC}1B`kM! zTUl*BW3&(&!ra(_WX`*sszjCb{2Sd!$gm=-k19|&QEH`?$;o;+Ra#5JnK$7w8B-3_ zG~%$HGA+FRVO+WySwz3&OPq5Y`^KrD?I7`tR*~v95K&7MibyXqG6bA+GPFTeifmrm zMREEh-ArU0!bj34ZS;nm87<8y0ZE`6VZ()ylsZ%XLzLFwg~|;@#MXZwAXZu3;1IX*QJ8o>F?~IhiStapeKPUw)0DT0(!!t2#~Jk16avefLGp%N zvm!s&qd%WSe?GNjI}w^pjfjqQXxIbC?jt+uN>q@_u;Nv6K9o6qyKp|um6*WYM%X(P ze4W^(-wfhvCJvG52%B?!kL+^}`YzQQ(um{av>ffQ5bf|}L7c7>i}FS*=8GG}Y09(c zW=`bTm{QIns*xsI^n4^}n3OSf5R$_rX}`YHP+cVrrbw=e>ER69wp>iE8rrQnND{;C zD0BP<7?&OyK8K>chL#qRf$US#L+IWkO9(VY8FtyuMd`cgKI*f$I;7!N(86hj`5zXP zNy|~v6FNHYwYD@L3!^3o`+{NNtSYQ(m7$; z%PDIeCL%-Iojti26vRa6NNaRWhk6L9#0(sJ*dd7kF3#CTAtxyWy4f*X*NAlEinim- zgdH^8CW%5+jZRv0W~OZu`hzj*oCDwvHjsZt`?vx$qLMs1sHF~6cW0dftA=jez|p`L z&e!063c4Zdl#EbF6lz+EZ`LV{9YNc>m zAK-E#Y$p2v`u8GkE%?Lz5gH9}t+)+8$G@fj*6}<1UCu2;K^=b6u}~l3 z!B|K?6Y1rn_nZmz66B|WEdecq+ga!Ca$p1NP#Pn^wbtOznMI%s*YprC%dzMF`d|=T zPTXgF7k??fY_-Ifm-=d;S*S?gINk+)$P(IY>UJS{6z<;{tiwiHSJ?-{gWXsr8rSKl zyC0tu*5eVr^4@y>ji;TSLYIxG$CKfc#Zh$7+owTM!F~#z@)qetZ2)$3dc6{xPr}3C zs^pTAj;`qqu@28L&hCa-vb){VmG8e51v+RY96mh=L}BFi9bg^p{s4W5!(Sybyx9;| z)GgbJ7GgsiDD~yWUFplm>wWywEyJIev64VKL9skOt-;rS!UO%q|0Uu-aFmM&?PGHM zpQq2Bt|j9CuC0IdPyB~J;-4A+0o}tn9?GJMIKb|E%7I+b1C(-^<&oSFt zma5ussI1}mK_ zxVYfUBe-r`k8b%}r2Z-}_C+RP$}5ffer^8%%I1r!E25SEmsnXXicKqAbLMg|!Yzt4 z+I6ujpg`Ubr18MpHB@6baa^1%B)8h+BIKZ85dj5jL#^59bQ}{(h-l33aCd^V1y2% zVrWlE14sHU2-TdZ^yrhK%0{B=8pUK!yflEj`tM=(8PzK^YG zb?9&)9*V5tU&z5L<3?V>4i<9SIsi#Pw!csyJ~O(HhWm@yj-+;Fl(%#_Xzz093`C)o z9jvhsqeWJ`&h@G{?)9Ykj&6)(o)OwB@+!|rGD>}ku-C1!D4QKeh-^8n(5{64nb928 zGqx!SKf`#Lp;u$t0-5_IS14`s9FRR{ijUV?ofpJ za{sB7%U7z6gKDKA)ECao74|e~xvX@aiDINUw0zbtmA$qk?fI&9%|Y=b%5p0C$#R%p^%-E)VPSR24jj8H=IdNVgi`qNtl8Y|@DPqLD7LXr7-k=0iUi zN%3`7AByL=k-p={w+(9w*df!E0J(H%(~U;qE;@*mRYRxe zRg~%plImGGUT+rh(Q+HLc3h8w99r@jLMM9x13!-@CK!@n?3vJR7Ohj*Ix>jmXaXKO zEV1!1@oB|)Z5f`;!ixp%MJL`Yi1P{W?*OjF7+e?`0p$kDNdr*_+%veDHhV31r8k9z zOKDL9k@&$gTotJoMH27Ng7qH|lcyr8kHp>vmWtzS!qfC8iK!nB0jEsr<4~`jQ4Hxa z#!bhlpDRiY7~k~CDfyCspri4%m~fM0U5}I<#>rJB6^zu z>qCi4G56%Jqc+9y+sY~X@_4v*0El<;w0e%yO}s}SjL^ZGDt4*(kV9q#0GI%$bS6dC0)`|(+BLwuK;Y5FC!x$}ngOAJf z!k=UmS#QzkgT|Hmo(?uQK z)g96v$;a9f={j`9LoX52%&T}(dQ|@5wAe0Q%J2d_Xub`%>&Nwj{Yqmgk4;#XoPbKP zjPb8XU1Hs~@)<=)V}ja}<*bE_IbbMFi2?E{thCnD%+j@_JF*85wo4gimDYoIYYB%m zVf10;3pcwI5mXA@OUMYjqND&zC*l2kn$e*NA?T@DvIhgxJPq(V#_Z{ZFrrJH>BPm+ zQarp6e9n4-D6MtHinKL3BREFKA0Uk9J)OEVv*in>iR$b%JDQBonrYvJk;01pXNb-Vx5$Uf>+Cyj`$-CJ53-YRu>mHMX+cNDZjXA7yyNZ^I@sQfqbfFR?XJZHIQ8Rjg)P$NaLg3T>sbIZCp5fPnEZsdnksD{Vsuu}c8 zvRfmIUUp$xv_d2!lE)%O^&v#}ucr{XT9_G$v?}Kw#v(T!!Hw~Q{P9ENR#yvVwX7%Q zXXUS3mX&BY+#a)S^C>pJcd-4cQQNQV)yy8utsUHS;X;c)RS|B4(IPFr6Li|K{ZyJ< zb4yQtDO2{z-zug5o-Qt4^3EkeDtr>DUdkK&EW*A+S55MbjcGs8i3k+3gPov)g; z_J58S!>>z;HkJ*@Sa=AqfI){NG52H9nEaxZ1i|-cZL2FPI9XK7y=cWolLHQCA`*8} zkT`NhCK6X|gh*UHiKFKny(JzpPGn%KW%Q|uS4r}Uv_uiMk~$;Ka-s@^N10RoZ|xuC z^d(;gt``|!^%wpx?|cnDw{XWZ11!lJ-B9?P{GvDUP}3zDA3TcyO^!c&ntfH_x=zCS zvmyNjK0WEH-$&`(cZo5)LG4#T?o%_G2Efzs%_ihFDpU6V(CZ`qpo!(UHXxkmduNkdXU)euQwkA z%W%&$No(>WuI8uC07m#$a?gn20&XEH7Fm9GM zLnR)ZNs+OL&Xav~*yQ^y&@uWrZ6F%FQr8+|sKi`QN45}&PebBs4x=k8Qii4;dkAt2 zakVlkSfUxL$>nrRg)ro}h$171E-7x&h7;u3CGzGJ^)DQu&>mm(Z^c4XXss+O z7es!#ETr6ts7RG7#UeUN#Au45RIs4M0sCWOr&cIzguxp&2FAkj;1K9c*4KPaw?i^NSY`1`wDH61ZEdv&^LV3S| zuAuC9S)&PUI{=DcDQEup?xEaTXc$w)Ua8BG6c2O(QP zIlh3q@cf%1@5PP7nO?*>pnysXTY&3WS)kwz0n2|Qc;RJrGy&jxQV1^o6=Su?+yL>D0e?PdSnq)--??_OXCrO-? zahC`F$h?~ZUCzw)rPOUL>+s;X#0SIotgy}R^w;wG^eU9aLY3FN2__6Q9vdwx76dj} zJq#fUnW@O!Oa_WUBDK+6NW6YPk8}*4H)<=hCtB-)PZGX&^tn;WAHLpR9rz!V9#6?o z5{kWRWHs$DpkXUy81g;%!Z;sN&Pz_kpyMeB@35oefpQzi(&VW{@X zu-jHt(qDUXd{n6(A5~Sl1pQ!3&T`lhB&Up2J3Oi#R*q`N^~0vBXgu1&&=vO38M%Xi zD?7L3^r{;-OEVeDG)jb!&xxq6> zx`l}5A*^kg?6gW)!RvHo2h?bhTZILb4HI~9{!&h1z+S(4l}Hh%xNEH|j6i2=rQB() zgd#imebritsM5>9wP$J2mCs?Ozlt9#=l*!K4X8y#({;wpXb)Ce(2HnDX4hJ6*H^Y`vgoqdSRr;hS5d z>`tugV!R}wGc1h6@P_@idAwcU{|+5uDLo$gu&(~H9F7qk~|xXL<-1uoj#t^*eYSpeqWDZ3!Vg=g@l#G*t| zDgiD42*1W;f29&KFKB5li=Ta1g|hOV!DaX&lwgF-E5I^3oX`aZcy@2kR%I7v2QnJw&I73mY zic$v;fGE9{AEV*A{8nH4dcVDYaBygTUxy!d&$R=Jlj4vfDqJEfw9*wUt!-lrf>?lJ zE3e;>+0o;usEE%G2~CNz>QML0D1cgPc|#h9aQ^N)d0^wK2|#|MmnMGn8gcqmm% zN(GK_C^>vwm(@;C2+=4!$~CI(N~5t=RWvyNmJZ2{%Kk1cz=rx=ZC8(fKCDHaL77)* z;Y82m!|L{7<@hB((&h~+Rmfu_%-Bh*wR(E;OZays|K*njX%=GLYBK|wh2$|Ahv*i| zIbBeB-rQmV^7kfJZ$n>x_W>FR5XD6T5fb*masj7A3zqUW-L^|w zAH_?{MJe$jg}->p(elw>azeIu$C=iUH_Wd^5=E?qF+NPCVOpdhl&i#HTZZWSvjcJc zN&gb@-y$-+hv{Qt{I}=p&)3)E@!y_3S^Fpc+aK~zr?^3xb4gS+!cm!TR5qn6AI?>9 z7r-T77NwPvicADwG5mDZAKVSy%PTmJ-+c4Dh=0GLzhBeeZ;E0aHkg;)r?g)-xHyHYtLz}W^U0|Pq>~oX6(h&&)1?{3<0#FNwIQP1%FzG(9 z%@>q^-jy-bIg5ic?CT)iyZf)iF6E-?iNo=E&+UkY+i^Thbp&1G6ZD+N{OOAvZar(> zn*!!^6{hAD>#7ggAf^n&MwWndA`2#t`o2sN;L$->S1o5uKb)lw?tg`uCx{wDodJ?~ zoSp1q+#@j@HuJiE{PN({v8e3-EM8ZRjw<`dKW}Q&Btd<9hW~qjDq;UmYC+RSP6U({a@L zVj~$#d_lW3#5{N-6rrh!{|p-|6J${uuA$R$+-rwz!UlKKHxC=JDY2!@cp5GwNya>X zR8+x^{p7Y1e8(WVD4wlBDcgJ7gSBstpggp(<6c1fJ3ZeY7R3uVVOV^xA|9`=tvxQS zJ$bxV6t9{UHL(iCRODn0M#?lfhV1zianJxX*oFb?M(*bTBm7f98(V`6!9_>KezZBr zJfjDim?G*_GB(QMqtHT;ju)mNP=YsgiquIUB43Y&=0Qh`y2Z+4xy4u*SsUIrd!zKW)1g@NnrQG5*t{ zl4c2U68Qm@xSjM`3z3q^=JRVJoO)M%^M+~|V>-cOr-a2l&L=LL`*qq`$L|>~uB2Q=NB{}bCH_7)4+*9mDT36H^ z{z)P?M0jy5m2xW>C@+E2VmQy}zF9kdb;vjmp0Wwi(n2I8 z&`hlPvesxU3%13fUdg6M^;{|iK#+K&0#2v->P7Q-Nmf?lKO7>>ITHPGZ{!Yo4r2fc zL>Px`y$x_z;x4D`r@Yl7+cJ5R6Pw7Je0WrYeO_8GKYOfp!`%1Ue&t1@)^5J69M!f@ zCzUv^06jdZ#7?Do+^+9K!A2vsT(z=)uwSoM8ts<{&EqLWUc9O|(g(zMRr*kP4JXuV zY{Rq0L1nv*!C?e9szOl@Sp-At_tun2q5Y*$~_sz0{(YQUk$u`Fu3O01XHo)iLd z8GrHb+M8n%Q{pndso^i8%K}cOMs5yt$5wTIli-VZuiQ-f)=-<8hN0WQB9URO)ZYEe#{W1w?QGiGAL~MBtJE0`8((Rqk!; zngSO{lTcM^2d?D+IT+wJZX9wd#+ucGMx$0eZX?m%giH3?9r_;S0KJykFp4r~4EIS* zU1L_yD~=L37++jatj)gv)`?_adXs+_Y5fuO`GIu5Z{VAuJc*RzKo(M^5P74_=(Ip_ z5m?bKx#o@B(Kt-AhVkhT*P$sB3>%}#{R)&2&^MfX5A_~F&&IqjE;$Fn;@U>ONT!c4 zW8{bwE1eNAsI=HFM!^T}%_(7n*!c*_CSY!1O5Lr3RM7>izr0ypE#yw%cbiJKX_Q-- zy?p5eQ^B;(@)#igw6(knA8V_Zg;Sak@?A(%V**w-w(0uBoKQ1*Qv~IfcDxRzQa#}@ zW%iWXQDWtM%o}arg&3O{P7i&j?E#jibOCw*xcSgdvg?9g79bw6#kQ(r3@!YZUsa!% zg{*cc>-9n!?1&%-^LO~e=FF_itM85qiu*c z3N~`X{+2~*6}lyNp^_cW5#Gb4Wy4k0_K_3clJ_7SSC4PUHfM0hRDyiV_GI>ip6k6u zP#UV#q~fe>7X&3By=Kl?XMFd_+H8qM24XM&Q?-Z=t5aew>~=AWJ1*6aHIlXYkjxlmd6#`WM4po~b1;ZtlBTdf@JN@io} zL|#Z34f3ra-2g7`PzGLHIw@hmNNlSVE4^^S_bUFR8>mkzA_^dZ5@&!Br^gQ40kh)D zVnU8hw%5i6h_1W!d~zpGzUCWJjvkd3OD6-jlRad-sY+a8;bg>-fyXMl@?pKY>iJ#? zK4pg7K>YCS#t-ts*usJ+C;DOIyB}cOvJ+^nO({Mt$_E5ggOzwCTToLa9Hw3p3X7LS zpnnD3Rkbi&zKBWVrAkLJ(lVjk$iCztQ3hn7QA}IK!%|Gcab;INkg|{{OH9I$B;S!P zB{xMPDZENjDiUEeS#}Ql9P(o5&%%liAg8-U+NWx@oa0OK9e$MPO8p>dB>x89Q!oI> z&}fi(Cg%qjUXGCk0bH;8pv#tI1S!*uO&`{V&NwhmnR)`u`3Hm-s%+o}a{EB_sc}%I z14KLl%N=i>&Ul0X4RzEev#M3^H4uSaw2~ni%@6}wqg`xS)IHHh%`9TI0ExPh%qzb- z4u&XI*;pmg3CVnt>R{V2sgTVjHUtGhIo8YcWQJg+Cc~Q(ZYcQ>hmO?|c~VVfD~%bX z%e-~uT}1K0$x29?Zt$*|@N3QlNpFAHg>pCyR%ii-Dteg5+8f)wayn2MJ0an!QQ!Yj z;Y0k1z>e^BRM{(@AlHjngYB-72oa^1bdc~gA~6A*fyVJsdr72kbS_%Xm@0Nqan@w! zY_*69TE#oD`pe^0GI9UqvA{50oRJcEqD?VCtKScWGvp5Rm1P4(P&#)T@wK(6qs+l!Z!^kA{ zc+B~w$#N!XCK3I0yBuVQ()7u*L}@_Pkq$Msp@ErH<`PecydjDuBmk=5Ekr>}u2Jc9 zTn{L0V2cfr2NKYU)lQiQE_-qpPxSfV03;mWMI`_Z?J$&c5XlV6Ici}G#X%gA6@Qjw zX2TCs`t>G{13)V8%}S{R9A^*5T*BG098BieMw2*-(uwPZVh2WjOFVPDic~HfI>Tt* zw~S&bY+c)t;*Zdjv`7Moll&?Dd0Z^u-$IcbP{U-gP!pzrHEB>E!T|1Xp!^yVoo`Ad z&o2!fyfZY>35<>#bl`@dl`%?)i=GXLS7z3ssH8YhPDkwYQk##gi_t}eC^^@oD1}|W zL-!}=-9a@Ps`}4y-7WykuF0o#Bhtm$Ql6Hk&>9t%BR*tAOuvE0!sza2cQA0EX|6;9 z+An0Afg^W|fjSc=WHR480fVq`$*suhYA5^-I+1G<~CjblTJ)M$Vm^qzt zeScd!*vUa-D>?ik4Hh3uRt8fWy*wggr9CrT`hjC)IwI*Py^>;4Qz|MeZDG_}DF~$pgnDCcmI%pm;%3`8-!}egvn(!E z__`>Oh?Ljig7t7ZWOCvMflK0FeCqRCLRPc@sH5tjff7+{F0Ltg0Qbp!i3Fj~9{(!$ zwZIS7;}6ynC5+z$S~!D(4kNLM%K^)bB0~2!C)f}&oDvLX{YN0A*6`1>wRLfRH$o|5AKywyZOuYlOG z(5PR>SDx?e^5}HW(5sq-s%=df*O_c1F}bjSRkP?pL!{i5IqCO1fs`-)gZG>E5&T9XVPI@}ckfrqz@9)Uer6#Lp~ zyB8=}sqdhZGyL7k6ZzCc2S0Q{%|#=@69yqFY}`55rvdAc6j!xqX$aSL)+iUI@u*;{ z=EIQYTsFWrgeqNmI%J7#=+dps3Sr_Sp-hd1qs36))`Y{9x{y&l7BztwI&#Y(EWD2K z12Sd<^-qB#L-^>ybI%^J3{!5DUTeNjO2dy@YTd{mxzf^Rfo}ye2P2UYG$ZtQh*+fb z(R5>CSk1DzQ3X}9ApM(67$!Oq?_dLj)w37`FX-8rlqTPLs!D9|%n_6261*%5lr<@O zHl)ApON<04uR1mKgQNOxeZSIZo1JA+xpKOEou^inMIx=KQAew%)MAp!d@+rt;+58( zWU!Agb;63gaTh6DbRoVBT3$iEnEMJ^`1l)W;UfTc0abr~uPEmy<0md`sCo8eteKPn zrfyic!VxkwWfgejQxBW5P?_j-u93{Rq#uI?7NXFf4%rK7fV;p|tmt9YWmQeam)fW)nbB8 zkmJCrlvhB4cf1_GA{?E1hDsS1%LfHVCT`cUP#494KS1L6HIk|*iuU`1p2POGflRds zkOLet?JAC{tfsL=OtXrYs-qbx=VF-zmEDV&>O~r!Np0r%;dwB2QF?wyM9{$I1a?4? zYZs=W-Oh{$`uB`Wv`>6lykWOGy3FVQ_hiyhoHe^g<00K6{iZ) z;XR}dsIk})K{J(B`Z>Xs&_;sqc{N zD4p?Hf-oni0InSpO#iiSA+4b zw4>WW0^J`=DXOTvs4Mv;5j`Z4q6+{?QFpT-6BXcm%S>m=umh-%JNmg@`>E1cg6DFW z%LZXdLpdXc4Noa~@kH8UGl(-4^Kzxu*eN|(S6T4H%fnZ1+V#rwr|rFi?b??0WL+U* z84;5zJb#*5;rY{81*zP>ka06G0Dv0M3QIXxV71(#d;5Ie*qn=9mE%Y-`J+q zN>Im3?iVYPCe(cX^gP*{if?QL&V0yeCWo0lyLso71%XCh+H^R~-G2SNjb|5t3C`~O z!JxAe{_t;{q4^+q^37x87htUL<)3rxt*q_w&#cUCsqe%2O*!sSoF?SI=n83vj3itE z;9RubCtp9ej50=OZCKlx+j+7MrKw~_W4IN!vknRiXSIWyILENsR3Wu79UnX!Xrn71 zLhVDWJeSU1`)s(L((?1CPh(D9#?*RP++vwYx*X7xZE z3>>fN46lJ8cvi&IOk_mq9EO3k1FB;#fX**nIQD3aiaqx!POrmagSH&+h1!jbiSNTjf(F4a0M3cj*Boi;sg<5R;WjjSF}`COH&Dsc;1 zM=YJ7hQ4@`(gG4t8E-uQG;E67KR7%!jpT0CJsPRVB%5^?hJ?g6LPHfa`zPxCveOak z<*&<+i^93=1Y)iH80j+40l?ivdm!2aq|ayxs2RPa#+qBX(CBV<6S)%vhR)sPjq72! zNc`0Yvw3x-*;=;lSXCf?N z7+!Rys#LLJsrjl}g}TO*ol3p&>Zo@5k>1nFl7a02%+qk`V!VNnY-a~}ma?U~XvHQQ zw>>jBrzZMk<>E&X{i4|wI!7+ia103IkzRtgPvI@RN3v*4>A<#9XrB+L;LR;n*_L)VeTxgn<5$-5J6iR}6 z4)Mwva7?usa`@*CaNz;BBxONezen!SnBsm3>)PV#ZUFdXxyT;JGD511{D3f_3dH_RG4DwxH^2?nY=T~TY?DsPBHwSOh5H4FE4D+I`KhoeG^OKWi5ypIZK4570o&X;vWgk=I1l7Z zNXnomes}|)4iQQAK3=~^Uzc1))kdPRjVU_sF zH4jSCVDz&%EfdcQfZzaAqfs~{c?P{@a(B8(re)Qw4;w3dNWBKpf24`gHm&0V(U zJ*!W{qxdxSti}#=@~lRHGvVwWb4;FSSDNksA8i4lUmASj!uRc4w?FQSp5tA@74BbX z8&ZQpP!5E`zqT$2E1)?S3OflXG zx6>VyZ5=wKhQ77SWg%*a%Vb6nJX{yTzX@@rmx6^69ZVi91pwZ z%F4J&+Tixwp{0<>LJ!%UoJRQ$*e94Un;c@32*C z*2GI|o5t)yPLjDu1A1P&-Z!_acnOBnMBoV!dP*f)>2U{vK;}Xip~0D~&ujS%TOA`{ zNQ+5qL|Ry04zVdz0eUb~7X#?2*}ev>2t+=IWu-C5vZ^H{0iXiU-l)MUky zY!_CQw=3Mm^=HrDE~{zOS#?*0_n5qr6pVwhH`>r1CggB~xC2^|jSL;s;czTIxs<)0 zGKiNN9(X(G*&}o<1Va4lwQttN5?o*V$E)i<0$KY?DTrKRUQ)7{l?}!4AxG_#@hh(E-i4Zr-NAK@73XMv+z{sfw9%eyB(0={ z$`B#-nbz5KH74ph6%MtcwgW94Yz#G`MzLixpArSwmu3bi<7qQO0;cMAFpRdoA*}L> zMK!c#LdGuS!D7hk>}tP*BUR!0l$Ou_Klw z<5S-$9Ur}dizE8G^t$w_Sv@$aP2{JHN;{QCGtx@+=%CpwF=Gb=*h7f#(pD)puS7_| zSvHZYM5KS6=2 ze74Tjl>EYMA;(-plD$$+9*fy3>fE9Vf=Lg%&P7nBpjj}pmngWV$+lmH<-U~w^IdL{ za`NPiSHY<3`uGa#LtEnLxUnt62q6H-aFVc?+YNrYun;Li>$51stBLJ~Q8&GIq=>4W zUi2{)p&_f0udbkJ5c&s^4J<{02`e@#|NXgraMa#Ec&#kjBP1JnL^7)-wXE(alpm6m z52}&Bo4UKpVr3QA#>45wI|(OFYl3f*voXrcwNvH7+3VE{o0!l@q+HlYWGr%YlUs_H zG}|%;6=^HGwRp*BYuWW48&!C-6F>CVC^SfzZMQpv-Z;SjFs+I+^n_Kl1PNV9h_?jP z`0}Q%MlUWrf7o53BvYtK-+H>f`5}j2F)EFac`d2r3W=Gw1V>8{OOJ~tn7)tCXBjUh zY=}=j${WqIzbTFNm#|eP?A|Fl0iJey!CjwU7A+d1wY)4>C)S`wKU!~zd8~9JOM)9| z>sI3RLu92|faBHeb$ULu!{ggT@W(eFa;ylY<&*-^&D@7m>5G;$I6%@MT@v(8i-JCw z#GWCvSSqio(wo%frbs#+8Mu{X!_0Hv=JoSX6Mh?8uw~5dpw+#%iRFOz>#_H8_uk*G zz{@8wy)Z5OhT?naMqxM43mb?pmQdxN2GVYABm?#}6d$6lulk z`F6Jrv~Jt?ti)^CWa4okRoVt)u9do4p&Re10X;Q1G{K~vB7A;YJ96!(Hqo_*stI!E zgxB33(%&+Q4hB_sv>hV}Z^>B%nM&sAG%Nt@ES+?FBZKV>bO$IWR-ed3|VrL zHk-R%_nr&S>P~t5ayqJz9yLIIb?GFyLIt+nWqOHBZ-QIBQtxO=AO=F{9MQgb%tBbY$>E5Bz?@ zYA&lD)HnXbzdFpX{1P&UIm0sZHgC4A%zw=UTk%LqIYVY2kC~JUvwb7xF`H)e!{2#8 zB)YF29%`!{`PI@KKIMSwU>jGC-F1d-qT1V6N~TW%-jWT7(zZ$UTe+~ibbSzKQ&R6x zhpY8MZ0g_c-g$Q4?U35Hje&Ankyh(3s7d(X_T+=awh38ApU*U_q%fWi$|uz7kz$`A zDuD^4>>XaE-89WM9!In&kX&U z0lONoKAO!@y7wl{|8z$ zuZ5rKG_f(b44OC@6ghqtT}+d%wAZq48ez$&2!avAEfgt*0n&b|94#510@~OH$`^q> zS)RANv;@eLd8+0u;#?DFT~%-KNv9k6$pw5C@Za02EJvJBMTOzQT|D;t;&|xyox7r_ z1A1!Ms5m;d?|S|)RH%e{dn0%@x5goSP`4&yZeof^pMrjIW<4eG84ri3`wT;z44q4R zNEsq9k&sZjBTgU~mZO*qW58m4PN-gey^T?*yCpVBpq{0^P^#KwTR!o5G6o{nRPIUW zM?Vrh2hHQ89fA(CKq4oUU-{Z`iJN2ZC6bVHoX^sYpkNFshI#;IFbmBruN(08j|JZp z3%-Ah@1n+cCLm2Tz>63B(~R)4Kp*RV1~x`t#K)MlG@1jwry2_}f*3zS3?X8+L)0}{ z5DohVP6vF?v4!}liTe|_fU%q2xG~ere_mFOwmD)VT8cO4yzwX8{H$a~Oo@>ziPj~9 zEJU*`t(O!*|!iG0robPRYUW8 z;zd0(BA5)LkG457Ioy@houZyLtcfK5wcBNaN8K$st+@=%pu%;eWg|2iE+7C2O>YG$1Q;^B$T1VgI zmwJ88hPUWd78NBR1damD!S-B@m~}P%22&zyEBrx79$}sXBddw+9*1>f@K`}Iuvju zelC*IqcDaUj6aIxRHZhi8o?Ybct1r0&1Y0VakM)OB})=7zUNffne~Tb566X>IZ`TE zZ?d|>%+`GtZeX=7>kWF2DO-@7jEIFeQLh6A>IRyF5^iYLK>FfkA${E+mzR_JLSlPG zJJi{vifE5M&_k$c z_-n|)+MFp&)l(LXiZfJT9Wr^jB;Az?&%D5<09XTyUSPB!2=|R+0^TG6ir@(ci)r6y z9)Qj@7`Y(SAP^bqKEklrfU!v#DMuj<`eZRR4kj?7usy?o;1W~P6~v|Si*Z z#vA4F9_DQ@2%{aFe4Gg)ZRLGsT*O4IONrJ6lx@qhc%K>}Wb+|_lKnG~P(fSb8EFax zSSA9gvQf^V6QdC(jLUO6n46wXUh24H_R5soJ`1C#QQz>L;-{o#oSRGlL~7$@K`C%x zb+#z0Ncbypi6~Jt6&aA^gU*}lus5!ZXc;xoGgGkeS5f+jO*r3+%b_z678-9;o0dqi z58#F{nyfiIYA-TgOSN92N2RWFJ|?Mp*g&LmX2r3`Y=xC1C(*@OS_=XQ)ZgsYL{##$)dU_v~rrFUE>?{RQ7>`(^jJ?T5MCN8{sd_wT!ZrB4sXS9E8+K$akrh zk0<1?ts^T*{i||eP85s?(S^vMV?&5d0q5hG}eJ*PGA zb<04F>r`oo{W=+*SIIt8$tI~AQvrTrO~cgXh0`YTlxUnSe1<>yR{?YV;Lk!X@WaQs z;A)7ehAbGdl}jYZ$))A?xo|PBUGxWvcCazy_BDSdaGf@{kO|-0qq~8#g_l-N=>d7J z07(igX<4lt8qGqx?JhtJ=G$pg4>TJKL+|Uf5n<6O1?3k^^vm^_9fFF3p>yHh>cQ&U z0tr=C5_^=SiKrU%F2IC=R9nsqX(rS#5oZ=)kWAC`kL9{0sHDncuxX0<#NnPO6uG+c zLuVti2R*n6=@BD~Oo1wpRY`(OA^%PS&4>IuxB?w$5x()&gA(=+d2DKY0gHl~Ln>Of zG16sp>-B}9QZqiGpr=5F$)S)tGT)rUx?->y>HG$3^*>By7A_#tR@4*rV*u|A!=<)x zd}yZv>+uxLX5jN#_PWG3pV;}xiqn%6SYYXe!P?_ibOvL*v@z0Fgp$Nnc@`>fFf0|l zx!<<%n%!snBJVk7X>2c%>wj@nIr^EBLd8f^B-$~r=6HZRwO;<_S^2gYX4zyvEU7s` zzJOD6P)0Uxfg(6Nxb^5`6W-*c7IDl9vN4XBkB36GAUy&caklt{C>KgT4Cx!4a0*65o8aT+m@SMS*Bf^8wqf7BS<5gtV4Dz^4USt5Y-{N$?gKJYaWW!5{)hdD!Vj0AHd32q)d8eKpRlEcMaX%d9vr8;?ceHowN;i7=Vr zwIg7{Hu@Ki98Td%iAH1dfT<73lL#gWYpdHKtA1Q$Ey_^-hh0BygXUci7+dsaC5(K} zTTdUe^y@hcGL!?7>(Z8XtEod(V{&g5`iu^9QB)brhr?^@vM?z)qRgOqVio8zB(w-t zOaiiSK|w6fvCvsBpdK(d{fg16>8FQbZiVb^>nyLF`iQdvl=Vg?8ZNX7h2YCy$}5=c z_vDw=)65Y%7AEcz)05KJGuC3+ z+7$Pwg?OFxl53mfrKiXmZErjc#9{|z8ljy6H6|56T?bwF=@e2bLN)#ASmC}W$z*y8 zly=5yQO1dl)!^Jk8`Um5ODUjDA&L`()CB&7s>V2!H*0I*4>VdBy65~Ljfn}HPvw-- zI*8O>j3&B6m?%?Hdb@|WF5655$-w}Eq}po8N6+c;lKRbVnIz1FTPG~F%%0+S4UGfV zxKKMPgsoH?lsF|A-AfUDfdt98*ScvY9|2M*)%9-z+9t^ZcY8f66>L*@0xdNG0>dYwes)q$%nJw<*n20aUwpMeTrmdr4FIfGUrFZuTV|5_5mNbn}mp4`EHK{ z4v1L8CQ04ZbN_yUz@fcsd(R~o2is%TzK4IzQYCA(H7)$f8{ zjhIZM0L6N}teN7>HpQe#(K=Dj)MKxwUeQ&eCKux8f#-#@c8x-PO z6re;wFpLV|b*@z83zYt((h_Wf6yiad(uZt54q=F|W<*S3?-Dl%Gjf=2fI3)JK%|dMk<6s7-AlniSozjP5Po7x`v&)#8W6t<~ac@zPRm{xZD-3Y#+q zfQ_C|SB1@!PU*L5>A$BNs|7>!eHs(*lB+#tkHUDbI@*Jc(LfNBA{pHWo`Lc((Y(S? z6?wOwRKm(NQ6V#pwq&YClwzRVJ{$&A;z3d-VVOj?a&@Ic zLrs9W8DPSI^UYO(Fm7`657&hR=2%WI>`?=8Tt;BroCF2%(?EWMo2j@j?Y^Ck0tYwK zF<^OCd=M9RumjyBdf)+(QpmIEMKQD5$2fw*YfP(-q@Q!^Fpo#Nrj0PMn^fcTCW|s1 zKq4E%M30f|&`iT5NMnPgkZLEG+wjUB1b+99)+Uo#QBHjk+KwBUU6?yNTVgD1xULy& z2{8{@<-(^kvL%Vuq8vs#F%e(r?VnS)5GH>Mc@Caa&iDQ97`AFll%)e0!5!+fkOQUf zuBlErf5A}QJrC1XHRC&gg*xJXAsVYPra zvtmfbikxxdHvPf)UXTs^U~wZE_p)qf%C#(i#l}$-;j8jW@n2$+T1sB-8VhHxM`2Pc z1ts*Ez#JB$RidL(QitxP40rx9N|Zlb95DB(OBDu8%3YDFjExykCd_??DE9wf{tL^q07AILB!Vz+)KDV3t#yo+|G2E;POK$#-{>C_N3_^wT(G8f1=|$ivMdZH(an zZ9tO0`_$2DABG6AGY#ZYSa3NTMT1Vid}WWa-jgya@sPBU4=^(aKbyV5Oh6afv2u~p zg^4Gq5%Q)sEVpc0yK>d=#QZgIl_Z${3~ZITmbiMDZ0j2Y0{pV}SbtlS;WKuT9krFJ zlJu9s!1t6xBgd6BEhNbA3{%G6Pu>|5U~>v^_AJ%r1n30Fd+Fb3$52NJqna<#AW_5b!vOH- z0Kp#t!n455z+QjcR)Ev#1m;64+REGzV;Y*KfXYnJ5Cw+VE>FIXVUHgLoZUl)j7D=6 zvf++{%V)69_upodu7J~VSbFsag~5SXVI$=g5%m0<-klgT#3xKNPOpS&k*pF zdM@@LqlRPBpVBzkM=7dm~~vY8EcN?yi=g%mPM zW~Pn4!ogym*~q%hcvatbll}~ra!%$XWwZ4DMz@uwg9F>*14v&@%9*}%dyQ>0Lebji za{noZVnE9<-*aT7YA6}pxTDS$(OaUy2^UsMPuAbBSnyX^?^nz`nfTQBDJ+96iVqB* z_3cZyv&DH36>wpaNo>c9HqRL~jSl!hvI}??cCwH1UDXf#(49PgicJB2Rb6oEP1QdC zN;VD^!p7l;Zksa->H{))!XCz{F9DO>xk?e2PvzhcL}a5MW)>h!zj6phsZkOC86jT6 z7gLQernPKMVBqOp{B>5&q^@>@NH_gDod?^l` zp|;%Nlc&Oy3{g@KBnHBnv^Y0Br1_~R*%(FQO8$&64B^=hX>*n*f2;&=nqNoayk(uV zdsLrzf+d_|AR?C>H-za(XJ%RV>`uoSuuXAJZ_Uu5Ffep|oI5gB1Sx;ns~kYkY>+C- zus0O)N178e0Z0UX21>|DJ6Fo~j-mqGRcxMUW47R0BNd&@bDpHAeD*4onO2KBsQ=zu ziA}snw5vpYQogf(eUXx(L_L?vLNqCJ$4HscpAY@Fj`X6ZU~6Igr6M)L#s)l|5@8T= z?%zUJ3e}lC$Vf*p;4WM6vniT1YbMKXw(Sp7z4H``VOkFy)zIk!ly;SCEj3~X!MM*F zE11|SuSd)=i?o}#{^cazEQGZp@@LN(De?2i2xFANN4pIuxZOtGFsj82gMIZTHTLmC zBHIa)**Q>S-$aec)!cVRFPht8$u7gKwHz*~mOgw&q-(YW@?+Sij1@t3J%-Zr3lD*s znbep_gLuwO;0Mn?ouk=D-{T)Wf12jVFa7HMA0}%aW*ITq<3r%PKLlaj7hO$TDot|z zCakmB(DoUHA2B@({h$&)LEh>TN+s zt)EsH0U<1H1hSth7h@384l91JuAClBa8_o%sW#nls7i&Qv||(Vb%|r%gXXGfCY9xE z!^6IKf;<*{K9!#-zNql@ZzS8fH(s91k{ccjQvRzc`_&E*>%#z^XW7AsRp^tOn8u}N zn=;Bh4Lbgl^7?h=KK^Yth$ip%fbCmiseb-p9Z;f0i~Fi(6ZhI*XX}Z zpXK%O&H9S|^+bK05PINmdj<^J<0n9gM_h}RJzdU8TpE2IhMi4|0g)1yDHeLk%q3abT%}D~Vs*e6h)t6O=&@zF~7GFBocF!^c)0H^hJ!XNk!eG-FYD-lNc{wA}GuC?N zlk26G6**Q0oTm^fXL%}Y1d^rbd=xy3^IDj!X})n>t(xs}1aIXgsd|P@k+-yDSqr~l z#jU~_n?g)%a<0MleE%(+#6aekqrN3*d9fi<=`1-G%OlIp@{JxD2i5> z%_UWDVU`cIB#WZPMWN4t@{QZqw%a2KI_wTyD{(k*J;AN98XycqPjYXTBnL89{m30U z+%Tm=ChanYv%#vmpEd&K)|vD`h&{FpAc*<|#R|5T$}9QS@@i{swIEBhtW|RH%5i2p z%t+#1AduE~ny^jq7rwuPj}LL*1>9RyE=c&KIV)J*R9T3*zR@y6go-n(BKfH{v{yOl z894Ti4t5rVVvI1>gRB{i_YiEHoRr#?7gfLvyD#hi{;{#Qe{lGpqvr9epI*QD`M>sg zr|Vo?Ub+8!+v|J&;MZX=8eiYs-uFLG>ER7;nENeM5@X+8@ zJ32ZzS~^jIf?zlls%k^81?Gt|mDuV;$gNxyi;IimMQyjfFC;b;fO`a^u&|lDCB8Mc z*@(PDEhf*C9GM!CXlYc^vV`5k6ccxR`h!?vn?>s6I!gusL-dKCYY1enQjarOg^r@d1IK^Q19?4#G3#Y^!p3U-tGBnNDIQea~hTX z-8K|!%ezI|+z17XTb6~^Hne-P-<_|%iuVhTBK^|u>HR{nIr`nL{yW|;Jc{&7zo+*L z#pdYus0!W2n>ecK7Q&J%T+o2KS7F%J$*00R7t)=~kzRzJbEE5qxxcgFF#{r_VJhRu zGar4RhZr$Fr4N}JJq4#pEPo?{@i{Qyqp>_ZV>(CO34=zp9bKx1&uMIg<&{=Gfyv{; z20UKC!$ilYh4`VRvBh!AGEZgyIz%MLcz4iOp01V_7*F+`%Awbdx+bk5w|&fJim+Kc z_gSyZvLZob(9Q(umzt3@HQfB7vX$)M9TRYbInGKZL2^>IQl!`L>5JOV0p@1NKRzu+ zB6ik}UmYfsRLJqfM)|tF|70EW^k!vY$G~x&9+_;|owxR-6S3eSs+nVBqbXOn*DGYi z5!D?@qSqX~m|^(gK;;Z-`;`}sTD$qOa#Y)1I)NT5K>bgPDGzTcUlWDF!vjz%@m@$Z zI|a9dLb5recw}CnvpXj!pncMr=VJ)J`i1cO?r4Nccnq1z#w=uIM@3`7=p)0$HQ=nz z$#-ov6KM7VA$uvmR-_P}_#d>qtTJvP-@sKdu_ul`n|FvzlK6+iA2t85a6A`(KHtjHzqHBz`~-psIK zmFPKEKx66#QsXk`k_t|WmhG4R2zHPSQP9XmXGHfsMh9WY1|1!3e%h1JG62lr?IqEk zdg?@cE~H@T1;aH0YLU(iz8TkLVxj0pTIQ4$n>8<|TT9qFtn*krXTLSNJROO} zkLJ9nEP|U-5L((Cby}8s6<9S8SBCFAfZ; zjZS=93VSUU*NT9`WRJ;oklcY<9ZFVH+dZl!GSDao6-)^O5GSP!$tO20z+3{TpLvIDopd$B}9=2A@*mhAWE%Y|jb_M3uSYSFQX zx3*P~b;D5FDP`zGS$3lYhlakDkC)8hPBmY>XdW+}@a%9~QU4`35wV-hJyhGNze$H} zOpf7F{5w()sjTzte}OwAGp7bI$A-Hoq{cgoXXA`+gF3*`ge4V8uy z^{soAT_C}#d)v@B-&Ohv-c=_jt=8%aT3d?mH}L!E3JJi{S^ylYzgu|gNEAltoRyh? z;lIFn)F><p_`uyW@WU4lke%I%5oafGcDa#}0a3Vj?>n zVF?9VJr$@B?mMi1c+jlBDX()<=ddoEye>IcqV~u4%yilQ1s8U12Q~$54~oR>epotX5{|eB5XFPOAcjC%t<(!(xmL<{8Nq!wpS5eTk;h4eC zWu@xE!tRhRTUBqGrYlr@a%B?Q^VhAI66He3GOPKusLxe8Q0T(y+KmXm@rbm^osyHL zlQdUd^bC<*2Xi$AZIY9=`_Aafr;HX0R#;hBDB2goXm03SI=5Ta8EnN6rOau~v@Ed! z?~Ha(_t;u)S!WhDXU-#SdQ?cs#?85O`WO>9ZE}FnLY2JTS9qfp;@BX!(%dM=eh}WEVc|((RloLRzqh;(BxHLviXOs~76{&^T zjEacMx??;@65L5yteTX0_jF$9GPQx(QHD-{M2s6mD`5Ip%ni>O8)dD;P^c9f9jQ83 zI~9eL(Cj&J$Cab1;Zw@e72E|Q z_z9b5Ujib9JzS+EE!4*O__8F2_QRz&F8jmFTn?asj{+jq1?`e-#3?<8<$61d!YFY9 zqPW=#&2QjZn0{CyCqI0yu}IW}CoHj?OU=86glU*OEpa)Umo_z(LV3-4QQOn6YU)B> z(($n@<=+7s#BGuWb|0|EqK?lNyS(V9krwbbk+Gr)TN_&0Xjd_Vo5av&8Hu4?3wL=V zq6v$xv`O_gqLN^>>ICdC9aC$Hu9yJbm}Zs&;E{<|E=hVewi8xU0RE-k1l%DxF*B*qE*DLt*of@?dtn&rB15W*n~y06ph?KF3X$g3tZi#b zEUMpjBIB{NR?BK1fytg-pg5H1U{&#-}* zL@ngd8I6aYJh9^eaLoZns;25{hG$Dg=v8yz%QBxj22d?^MWOY0?OEY05@ut@HqIgz zt2{4RHB7!$A-8K`p9g*qRqvA0BnTnmnu6{Dp)G$X@y?KQCj%H3Ryi?@Ob@f#D!0n3 z%4QZe%7&AJDUa|TjhrvM7rV-`Kuw9`G|QjTAgd63*@Ayxu6`Lt)Q05+^cX3v!_4OO z;3A|7v285inb@5bd>OU?o$8p{hWy4b%G)Nov?0k#Y$qbiu`C5Q^$U~+AaM~CnR5hW zIC3}xF(7gZRZhls0P*F>PRn&Nfk3rKv5rt!c#rQM;U}G>ac>AR`zxgfwoMS$VGn8-nj2lm!Xd z3Izw+?J(^vemb{~b33xKSeAy#tHgjyp+LB$0>`0oT!r+4t8NSwM-{p%sypS(EJ;J{ zqHYQ4OnWe}WimKQgUi(m(w>l`Gl~`^l>!mLFLt&I$YG_ys7hQe$;zmcWkv-Vu{&Nv z6RT6`QVHtu?Q6^}cp!05BSx_{;-qRLn?`L+Ax;y>D{6-X3l|3Cz#Zho3vg!G$B0P< zmFXJxMAKT5vWgN~R3a{vN~NE${2(hyD9%}4pPf-+sO@dWqSLPKf`g+9D} z!feNi6t}d4hDD_x0H~K>6?N)JXjDRj&bz&Cpv=OH5wH#Q;^{N4lLYW8D z<84Y4r$L+iGAcKM)z(~NA(tqjMPpkNn%*i%%Bg_C#2k(sq_kvk-E|z2onFHr36=UD zX*9!lQ*<>d!%9pr3X7Gt@MU;ezzp97Tz~To330WxFqS)0W5S}CA3{(HSWn`#uHWHI z*!o_US?%Fs1NsxIQg4`drwuQt860(_SA45vQJw@F9wjZDWL>E)gA_1WeVbzpIe`{x zQ4K@Td2&Jm#?#YiO>|wss-z*OR6wq$p$u=woJ#p4<2?t8caMud`+*q7)dP4GO0`3W5srt>ulU&YTMJK161pUU&)fzjndyh-sARkB{ zD;PQrp6xYGPn$2ql9W|3ihgh43QC2NenfSu0Fs538mT42qslP}&}Fm3d3%kdhI7qd zh+HxQ;v$<8qx-1aP4TG3-?(X;W zY`c*@aatl{OggNtbIt^iIa_VgQC@BEa8`E! zEm6?9K)xwos3-ElnaPS{dP(Y1td*arlmQd^E9fvA@Sp5}5&|W|`p$k@RT>VMeyTDzU|*&}Yw8Xo#6|!%tDpgTv@a$+Al53cC}~qPd}|n+Z6>hL z-q|YQ#O%<-xfROm@$?Ea&3S5GgIV_~h~6gh<2`_CDf(zxL~a&Vo0J5G?k`L`jj=%e z#?2v@KN|V|WcI=1(851FZ2dE1$cL5EQN39eRHjUS3#T(rLB?;FbLb`Hg&(=_a&Yoz zIllOj^D)bC6T>tDE8HW-cxKq@lv{7;cDpKWX8hWt1j=t6K#Oqs#csZdYiPxYAr3q( z_JH&;XdSUvKWxHQD_MiIKgfuoO~1{E*vm5owl+$ohov?Oq{Nn<8b|uiT2cz$KtDgw zy7t{c0LTFSj!#c#UFFE-ItefL%viPxGZ1o~9hJ@!<~i+xwR?jro6+xpKIy)F&v+Em zb3gx@vvdyvB2hVF9Yx6*00l{3o_s?HJh;NYKt{H)>Qq#qCculO@|d5ywx=S&2KHSM z$W&&2E^%GNdihCtjkuaXX&w4eSim_A`*Zgns@$lb@c{X{_3|3@rsEn6oFOvPETKa& zNk;|}fQ_#l?ahPxvYD91-V`QAEEnd7FAY`UuhI(qKFcM-+kPw=H)#dvkfW4&n z!WqX~J=ob%$-?QDn1!95AR(FkE{jBJoTHi%<8ZcGlZKxZ@5~W5E+dj!H0;p0mCcMsY=DRkm6*#|+9dDE&HDRfYLO6v7J;)PpR%3uF=H15* zE>2rc9Go#4Ybt{i1yMC_GZNlhTM~;m_Y4u%tNr?$uQhDH^4#0kuy|kTC*zxwldryJ z%bhX2y)oZDUBNRl*CD1ckc~!Ux$|k8kV|bZpWT7+Fsu_`?jameHDpf@YG5ZZBT z9LBN*={jMKZZKtZ3&z06l_IO-0XaQL%N^=59(C>$CX~ zO)gqEVm1KCP~t|$mw-C=QcTf9djMFDt8_#2uz?iYoisyWEV`A8+S#I&E$Jx{{@}aR z+R0y}gOlH-c8kgHW6mST+E~_Llkye?MU=9OpOFcQJL21Hr3A!LNl}Q{jyZ{?{!LM| z`!{p|X!=0D(}=B7uYY4D%NGGS0#zoD9|B5JL1o4>p@LCVUbFFC30+wm$J-4IAof#j zzh2v~!U}K0I#&Ua|2&(IzH;LYglsL04CcLMIMrsOu!Ox)m%?-c+H*;hqjc_=90+bG zXrR7d)s3hapXu#fId+$QMKB0xK*N0>Bw#FQD^{rEs>T6++Qtos(0JMo4`h%fs zj~q1oWJkk2s85C&Nyp|m%+BuI91T>^#&vF+Kti_{1|*1DFS4JLoIf6Xyy#;iq0tJQ@$l;R5wLc4z35tt$~9 zymq`n!oC2$F|^iXG?#%UjpH#7nv75vxLw3&c6%6jfs9>=e7vY;AYG`fA3tg}omQ;Y#`Ht7%INZBANZ ze4SWg97lYK)5eyy#3_BMh2;M3vx?zJ%{Wm0OHG+ zHmI!S3;Tp6`>DQNYu9&bji#}RRN{m$g|uR)Cwqy4=|v46<49S$Z6X1G_;uQz(juVm zbXX@gfJm*#JFdrLGmC^xw-1im@jCi{_kyHw)8ac6gQTNmK*4lCdhL2${|22v1E7pL z4qM2lL)1|<4p7D(998c*C#o2O!=q|^LX3FYnb}B;S=Kx3lhM)vRGX<3wLuv&#%v|6=ts?g!9=F6q(GA?^Fgar0-AnhVu zj7%air~pAr!t>Eq2WuS|)`-zsa^BrUbrcLkbw3xz9RI0uw8W2#BEPo0mFFMWLDlan z>X?=s=<9$&t*H*E^#DC?__=ZmYs zT8PC2RwA}$Fe>ug>vY>=Zl5h?ZW6S-L2c&Yj*x-2NO0y@+yZhL#fk zs7(8x0hAV0n72Tj&C*nXHZe8y_o-FVT8G1b7 zvQ{F+x7aX=?8waQZg-C95W1?OP+E@D@vcMPFq`}s<; zL2^HI+s{;~P35U7)|sOxqEeVvnZ42$2iJq8tNc`}9E;lC;qk%I20l3^2L_Tl!1i_Q zK`@r58l@RhUU1>}dj1VcA4o6&1Mm98`F5^s@6y3`u-I_yc@*_+h_WTrvZ3q54f;4@ zghaNYw1?z-Ewfjm%NXhr0X@T>_3p5#8@wg)1zu}iA6i6K%h*6>A|%dg?;o^}j*sh0 zFwg8lhxKZD0l0|T2k}>k6JJ)2wh2_)jf3is&D7eBZJ;YqN1xU}G=*7Kee9-s05qh` z44l>ye5VjQhvo~;G0|?;8aq@64#pA3w_=^GLNBD_B#W-_RKR6|=WLV=W$1>Hy|l(J z1z%NSS>WO)7vU|@wsxhNfC%Ny5O0qR@PMT^WIAC60=(!wQK`QvCbKFa5=z8FNAGyT z7-$DUG~dAPI7KN)MW{p3C#?`?0|V%hF7Z)ME!(|ieVZJ1WN0$1h&f~@~-3)K=d7`Fl&27p=Uu-$|x=RfSZhS8e-8ewU_n$#ib{Vv9_&!(>8vDBgwz z!^D##x9=c<0Vh(%VlqZN{}QMX36bI7H!)yR9MhUh)aFE+9peJY@U)x3*Dlc!;==aW zljJyi;7hvWb+1^`Zv_6tQv^gp5J|b2>1P+QUCqDSt5gq~Z^#hn;OD*C{xOWhXMLyE321y<#l$Szrq0&N8IY2&B(3G`Oq@~qy$ zhZspghw&6j5K2ob@?clC|?)NaqZNN579D&+*0&IX%)*({_)G}Nxe1IvW z$%JKxwxLyXf->Kh6%-fCE5)KEfBbTSjhvcKT1#aNU0Q7atB6VX@-o%19Hsb9#kat~ z7HkdHllfUovP_w~|9!R{fA}r`-RnDDSi({;^H|wY>B9tI`Fxgi$}-Ljs1LhLI;%Uz zVC#$`7gI(_ojR5aE6sgI=}2;4t}zai?xobc!Jx-&btH6(Y=t5bjwk|6-cb6d&5W=e zmX_;gj#e|7u_|32ZV+Mcgpdq7d`V3;93d@cq%dQoA1UVdG}|bn-A5Xx_!uU!g3Qq! ziiRdpIPc%5Bz4J}04Mq32}Ff+Ov!8c*TG?qgkqtD%!-R8qe94331yhoa!Qhbzpa!~ zuRuahsoyMN8qsWVrO^V3n+^Hoqeq!qu4($O+#DqAtkg}SAVz3uM{#OaqgnT3tek92 z(M&Pik(&+kWt4*bgo3lS883~Y&}ONiQ?5)d-FLll&~8i{a|}}_3ML4u^!L-2Jss03 zr-7Kf8gOiq%FM?f$7*^0EFd-U=7@uei7eX`+f7QqBtIF#A{zae5t-n04|>Q7oI8MZ zSf0qXCzJ_*Mf>Lt5{(>(Wh2%%<@p%2xn%m1BHKK*3^g;ce)>yIVZdg!IfN;hF3ZA` zwHl8eW#~0#R%|3%_`9k$;7gH0vx$|H(`E5agqjY)s*Xh&y@)Km!EMsGOlR5fwzoC=2K5*g9${(cT=ROB>GR422i8t$#MQxAKi`{c{&z!=D^~ zdGkiUiG)Zre&_-!R%bNaW>o$0&XB!x_0H|>BbeleNF>@=u*PIWMyREHbb#P=M#)ME z&C9#Uu;4aK?>2Q3Xy}pFot$DM7U(;paiq|Afw2W#(Rc8rWOW`rvOeV0QKkJzKgIHZ z!23?8eQpO1MW&Xy=igYGpNJ)&|MHje%IcS27S0e%UOUo!pMs;6E<7LjTy)(bdAsAu zqlG99k1xVGr6H0L_@D*A&?J|1J?3lVMdtMGOuZVWJC91srsxV{%}OSKM<`zu)Uw~F zDN^1{93UV=^d=tYTwEBMlo!D`nK@R)>9DMkxaq2f8C_lm@Woqg*t^qr1?*U0UP}=K zBVRT`vSwiHgOPiQ znc3YDCP;EeBUn~+748GcRTfKodn^Q}e&nq5ENmpyJbf;@ZWnQzGUX|ih)^u40Dy3P z3cIIcjB}#30$`*_yM>JSAalt(;N;>2twLwHwe%Hn>3Gi2?GRZ^DX%2$6wCLl?KNcX9$8-{DpH~C z5pOEqo}~RZtQQ{16h`Q0N)h>GeT79)`vt0_0`w7<=HzgHjX38P!n16` zh%JG(1W0b#-D|iQ(G1?dF#1%1urFW=<01K{$~MT=Sq7h#{!AfihGOME8Sxqj7H>eh zuGIaa3>dU6NWjTBU{s*g}Fe-1-d63FwxvjZ3sBgE4RDXv{W% zbkG^P1C@Hph*w((q+v9m!j$058PdTkL;M>JvOY=YJyC{<;=UB)C9NPP6Z85ToEID! zXGs1m1IM)MzSD7&XOoypJyar$Zn|QZ^|~>4@&k{e3Kq?1^Av^(?jwQRxrUYVJB3(? zAia@K15z$37Yrwk|Zup$B(lUKnAkn(in{j#rI3eiUEq%1=7sh#4-p&#M4>g<0 zspBXLwFOui-W(rP2}5515p1E4m?-suxN!S+uQc*IAt3==6k&r^i4^b_xqS3!^|I5! z?mc~_1oBQHd?wvExe3Sf$Cp>^bAD^4XDf2YsIEOfcQ3hLpp&SlavF)3g4}0T$4t?% zq>By<8}lheVh1#Z6T*LSR6?hmmFw@ruVtOPh*(P!Zm3*$U0(&?CJ=gBUZ*>uhmouJ zypt=quFu>KZr=IOe@m=ruLn!Bu2rp+fsYs|Xzj_P+=4108R2);>W3sLrwW~g`KBq< zg;|-*dRnA&XBB0TC?IbXGzsrr(_XNaGqi2YEvU4Ov>0?uh7{$P#5>#=zMc^h7F62D zusOdscT1)Yj@qird`UXO!q|&=GOC=1h$@(K)vvh$Vos!&AjNR$Dz84N0EAQ5l=N0y zkj*VX&&IG+($=9udlP0Bk%!YF&C6ny8k(h=S~o7F57UktMj2AFEHN+tN)Y3VhW{ks zrI@Kr<~6ynD1LH-vE8cx#)gZ!sKZ)4D?g*Nf=BCFgTB@)CA>*r0GleFh$E-xU>LLo zj5q=3i4GzmvfVNz>kLgQd+5SRX{Lt=HygQy=$v+=wm9Lavn{hibg~d%p4Ra4O&nq{sU6>>&aQ6fSU zC|bj`ge+2pY(=1go6;~4rMy%+AC7vh|%^IN)9yD0_IEu%x(T%+B$zA z3r9<3>r^K9BS6~>d~NY2b7vf z#e$Yss5*1!&ZWyf7Nk=oYCPzmc6_P5oa{OCekIy%QPiZ7rEXsek_TfVM}d;}$(&`amFjRf-K7gA7=feL=lR{-Hvj@ryw$44Qp5HXV)(wb#EW1NKq?S>yDJc6rX zI1VCl`VH--5l(LzcVlJ&*1|OD)k55a8XXg01Ug1qGFcJQL-Sx7ifyGFUiyyhQSg-@ zC@SRzNwu}_lT0zoh!M#7?M5R=BUZ108>%;I1L4@V2V@i2X>-)GcHh^k z>>2!}@Ma?am~nrAw`&l+ox(Q9n9?$o0!ITTPZ)|4_RDGL!}TVgT?r4}8?^Sn$0cYu z`jjH0|6@J9GO<$DxQB{Vb-ivIV3K@7N*GzVJs7&z_6YAN%zzRY$QlPvt}vy(jZwzS zz8?3CZclpp@n+)7aj#X7n?94mL z|IIMM$8OyuT=Mzs+CN^Ae^IYULpsvE)Hxt0h-#b;I;4FPX^jwhK>}RvcJcL?G8~0$r5DguN2(4qYhcM z)EYbU*>uTql$_p0YS^o(+@0A(CUvee=@TBEPqo*cVqLJ2CQqBi#Jl!T_C;~y z3Ympk8h1$fBx+rXxdr&QNGc5J-yl^x@`cJ6sjO(VN@Ftas8&OBqPc7pXM=3bDcWI2 z(|M3#KSMIZWP{vyz5nXY=S`kRc0ae!=yxKgGn(Jxd-eT$(Z9|dLPYfVadyGn#>d(Q zb1ReVgQ^5OLTA?XdNaeMGM|aZk>e3mh$oQt+l(ve*X1azKs+x1A$O1+=z)jdX zTT%cy#X5Q!@UauxN1tudCT>~QCMh0%qpVe`SxiqQPb|HNx40}T=ZPoG|7LA&iWU75 zf25SaOK+3X^K7zp0KH4dW_ zc;!8PuEp%cO}DjZJWhRIm}VTB)C_aU-^T_Zac9rkh<5TXU=uUePQC7p%zy=s|z1Z zsxHK-)P)BoP(MrhG%607K$k8|r)?IpF0=)Gx4bv#n>5_{;0IqK#053OSv#FdLH~)E z!JHFg2qGs8@0!{1`E*hk9Tn0=d+reZBLTAU%k$}CRC(Dnck4KoNrsDQyMQ*Fr9NDS z?j>BJ4`HC9woZPYh0#>BCWE6R<9R6s4xs|_RS656iPCt`MFq{!xr7r1Yny+^jLV1B zz;CO&+Ki$AYfzEap5#_&yPgV951^nDxhT=Pi+Ol_2mt zc$i^=b+1zvOFvfX%TcWoRe((EiENmfxJairLg9wjA)RStYhECC?{ z-+C62G?eRnnH<}PJlYto1?a~GXpnakl~|(I6=RFzjo=jcOOnqTg$60{I|AxiG_ehV}k5lwMPOf z-H-*X19xV56R>^u~wYI>2?Mkx;^XO$mua>Vn)-sOZsF@v=x|-t@$G& z(an4<{6Pb|U+}qm0sg0e`?(zSWEpghq|BFCo7&p!i zZHUx{V^3);wi?^*qgVTFl+n+v#FD(geHBjs5FVd7;W2mQHYPK|M)+D+zZJoZ)bi3V z<&|C+O;uY<0>8qaJW}0jtDmFnI4TwF-Fdfu@QEX|^}qi5?WgYIdIl$6g_{4m_L-hD zLL)|Py+9k>Zr2(+?KZ+BLV8V<6cnpB@dTJN8=s*x{{3g7lQ~s}X?K19R z+Hj_#?4y|7!9ys4vsK{I0$@?R_J?m}3P%j=u54amK}u`oX99C^bgtm`;+`HfoMhsq z$+mBldY2ubpL_TpeB0Qtj0CWLaPj0H(bPYpso6wRpMrd!iH7>ia;U~la3l}WkXqTP;;=RP(;QQ?DF&0%ETxoNxmQ}jL(C!3-?t#e4P64p)?Es zuoVBW6grG2l!c!g_hvCZYYrn@D{N%douCYUNJMsj-RU2N)jk)6^ZcPqC*Zodm8fh9 z^HKQjO) zrlWo*b1w>0TauTTQHI`{n~@sI;FE0yg-3Ed#LoCtjY`b1M+=kpNV<-t?GVo$o#$k? z^W&j^bUXhrV*fB=e>x-fx$-_9wDrgW!{EVS|o;zgQ}Njz{7jqfiaT zfN7r2?hP~csQ0Jk+fOy`UWX0b8sm=J{fjTI--EM0gJM3hy6Z*ptb9vYp$asMGo&0b zDYjIZLFr4sVTyy9*__?1dj@VIyoO3w34gYSa1Wc=42zkAcjB_=pWD3+OBn1yTFBw3 zC}9aH7NAl#S0l{F@3L9EdU_jTWmA0Ej26f(%(Oau?d*kD4lxLyV$FX4NM7J*DjSe) z0b9=BL8KNm}V`wrNK_42dw+V`oU zbZ4=l{EcA&({|mCFe_z>8Ko>Ez2;@Pc&y!-U4s5$(>`}LZFe3r?Bt|zbb9(Zaa9jw zpKzPu3aT!@&&(6_)*en1fnH7xiTLN(KVPMqKFf0$#lmXK=rqF$OJ&797cDOnbPApN zdj>DsMIClfkBT%F3O6$fe>ir2N;;nqIkOwPibq~jjBY4EDg3hDDu0!hB;%u;SJfhZ zVtAM^#?OfkTgVcRNXiRlrs=LvM{P0r@R2fs2ayU)l?!A`2CVx?23jZ@XjxX&F?$g+ z{Q|A@mAuSpNn{RYaaP(bi2Z|O_#)GCVh&8a*HvYexxGBkN!k79kW4-#yZ@Yz2RI+I zQ)}kYz`UsUlv*CCO=9*eQ&a}@?)9?+pg>>k*WY}Nb`137mFM2RhFN~4pNwx#PQLp3 z^b{YA;q48*y?;1ijQ;ENr%N;Tr8r~X_nISrP`HI zJWUA7?KOAXN44gw#_`fgep21j<(#CfCY54R3(2sK?X@WvpUgsrednT8cdJz%7L#zX zw~cM}vaxODa*KdYDnHdK$D+1(czkfQflrQ&yludS*@Ix*;~;ZL{z+;-Ot9RyJ3}7^ z3d|CwRP0>Y-lc=>V6owt^C|j6Oqu~Kmd?>7`u;W1z?kol93I9VCXf?%{#d;A{2Sm# zfn)F8VN-;#@P$nrE*jO8%ec~w`itX(gGT%Cpn1GqJ8T~w)!<_ZrWkp9bgi`WAiw?Z&}jZNJ^DHFl_u`L24fzf<20A6NEwVYLo( z)#?^zDhX`BOx0?xv0Z)hW(%MKzJ)K~=dM{0e&h@upmTe>W%2~(yRed30G@TO+av&! zJw~2H--k`aUJw0Ca|DT}$#UtVIb8;(J6tMS8yJ*aGdLb18^liFM8T%k;0P}Qjp+Lnu3nCi?teOI+qIon`%5R83vyaK$#uORN`?SS6NVWsEUxRgk|05y#ok7^x9Wv(o_S@RQP7bCd?9JS@@8Ya{v4r22#XA_wmUs-L zXAVn2E7TeQZ@t}F!_+^Bw9td5&s=@PJFvil5sUU!-VJbw0H`04PpM@&RdKs3wVc;LBr|8qjuxa9n48M zs6G#lH^*ck%Cr&kwDWV6s|RfqeiGrLR2F9|1tmlz!nbdaI#-Ah@x&wXJc7D_L<44J z5KWw6!2(moi#kfUVm5%%rd-RTp?e8{N30?Ww{4GvOWpBMCjj&P0X5-V+dZAcnxx|Z z-oeNnjgj)fxnwdlXUsdctT*v-s4^|I2+F^a*@;>f<{rl}wW*Jmb!OpW;B*IM1W1F) zYK+VQ4K4wzaB$yJ1DTQ15&iAy_{F%#=u4^~C_u>ou!)@e@Z1^Qpk&o5y=xSYK3D`N zxHNd@mcu5F97V8kMg2;L0v*6PvPun0w2(=A|332g$kI|f)In_J2k;Fsz3Yv2_;xA! zpaSX{@_ezLtb8V1#iWwP3N3`o!+Ix<@-jrLT79gMR+;;}_HfQJ;$EF#Nr z?c&8my0JjY)EyzY_&}$$jnr4Qu>!FeJ(sWXfK??S>8vR+@+><|9nOshFc8unX^SQ$E1Q2javHDb>6U%~AY=Nc4-0yO1$Y8GBfzp2Zt| zL)+y!aAJ7TWvU=jM*y-wO}{Z>I(JB0qLh|hvhruO)Hx@;2ll1gWAuP3GR*u9<&Dgo zYU&eqL4iPG)h857tg&9{lXGUA>2Iup6kv3XeZ&i{OqO_Z1q( zRgL3(ri|d++yr7g2y6SOmsKb}dXXjY2%K&_#a3J@6hR;vw+aPlN}!dGLLrm3IU>=U zw%N(TTR7DTJDpl%Y8kaY(HY;vZI z2{)Drj%v>V%3wS|xZ^l)b{X${y9}H~P9_tP!eI9t11^;NPd9`!9QwlzM8?1l^d%4@ zn#iy5vLdrNwEI>Lp)JoXBM2K1oXc@UY%vL42nv(EVo|IG3nn+aFj0%3Vtj3sQH!y) z#PkBqubAG6%xujg#jrmAI6>rZSv+)&Dhi}x@KrTD=s+++-C*n@+jb`zuP$AeD5h3S z7R#BDByxTo15v7Ytn<6*hwNSNCuDWF~<^UCJH9fAg8~d zw(RMaN@EWNr(UdVx-CII{y0`ELxUeHHPKot4k{j=aw)lHIUEPQXb;D5VfUR77IVn5 zjE6up5LJN*Z<%#N>~itdSB!E4Dgt~gO9Zwqu-<_|jYR879MMf_fbsKIe6#qmS}%#i zQ3Ka?q+t~yC?ITD!lk;P)`Q#x$=8;}mzW_#8MQo9B%*#fUbp30le*9Xg{H7tqOczZ-Jdp^64n8!>WrUOq@>Tin4OsmN3%g8g~LnXNlaAR=I zh~Y0{VQ334X-vR?{f}5`eORxSb7r;=KOic`c5gW@lpJdQJmjeVV3L(KqI( zvJcm_WrP7J~#{JSgm zW>w!=hW^e<)nyrEeHzujTmAQRs{e0I_lGMGr~AV<0G$8Mru)qni0-GS&B{-;$wbV* z?Q1)oiuoVBnURo5Y2;6!WDMQQhX)~53K6A_)-AkKY8;8)NSlKs%TklPAx}<`fVf_U zVQdN*N#QR-)Bp&Ttjo^-<|S&Nd#Eb9unMS|aci#YJjT_McJmxnAO7Nb?Rs65JEMCz zVcoybJ*3woehujtOGnl0OUS4`&mDABO}~MLof+?+L<4{P?Nb0I1#9fp_Fusbfgknb z+Mclf1@j(QMX~nyaZwPZUE9{T!bh^w`3WQXtFY2X)sh7mxeLc--is$j_J_7sTA9~r z`-bn_Ln4+CbL7%aDVYlBdlCSeF)NFC=!tBa02QJbU`4Kv~%Ad1*0JhQH~G6U#?RZ!%?{B zWI|CiE_1w_VP2TL5giDx+<`nX<={%KDwG+*estd2mn?dqS`_gO9S9NBdQf8&Y9oh^ z#PmRk49AGiq47({bB4H$x&yMjVcEikK!C&NmSJ<#bQ}~vNJ|$@lX&8{;EG2AXOor6 z13teuS8nG@kQ`p%utU$;D_p!g*+7G#6%iVSz(jhERFY#u9aw>jF&o*zVgd~|K-02a(=>>y0PhF9#9 zFhEHXXQig5j9V5~Fl4O~#Do61DHh-_} z9@P$ol=L)!*b$9mD80WY&?Th#vesyb7A-0CgeQrl*UAi}O|mb3#6BzhU7B4s9 zvTO#&K@PF#0;0d*9op{Omu`nllYsnigDb8kzmvreHz6hZ?ar0cdE15!y7IdKG(F#z zvAE=Ss?IdJ-+8MBz}Psr3)<`-Bh@_Zfje+AUyl5Cr|WcjQ`*2{v?gspS3{(}xjdGP znQzENlP|ix#H(<*;-WeIaO_1Mw^A(eBX?732`N}geJABgsqbJ7qF35YZ;rwPssEX+ zH1o4_RPcNfsKK&@nwiv^6SZ@xH2`Bd09=865m)D=7N4a5NgvT{N}$xbsfw(rCGj={ zUiM~6l{8C=)N*N73fT=#Z)rk_iN;Z>HD+6$Eah(IFwKKFxn%Uv&ap!#GMzB;EM0eM z>2w|Dq?00*;!{R3SwlTv6{V)0sa8~1J-JF$6P;Q%u8f{kXeL;h#0z9BJH-)DyPsW9 z1{{bKBtuxk5|-(LnGwhP`=E~WO0zbedGOMUC-!Gzv9v}7QH1w6eCa)9o)T3&l{9)E zAz9u>=pR)vK?S@QDKvm8ok};n&!QYutxP)Q{RB!y*+4FeZGQ|`SBXj2F8@Hf4Flbf z06I{%j6}^@a2OCIw_2^1)jDfwEAdtyACpaZ%Py4@%)6;Xz>sESO@NhNt#cJU!r$5NVP&aR-9I?4S8GcrBwip3 zLh9gjIo>fnwou)QtB4LS?RM>eGH!imwwxIL$>J9xPs|Op{RLT)-n_PjN~OW=}UzS_<8|o|^ftKLq#}d-muz_wua+!13)R zJo@3%8<%aj+;>N1r#t?R2J}4aLy7UQI~-OZhqXzv5A(3F_!jSN=fi0APL!5XJ$DCW`2l2d%uWAHO_! zbu23TKa1CuBVhTDf8NwG7YuquEs-7!0~y%Eq3wgc_9>^+x^pXVg6H z)Q|UT&8FBnI1&|cSUG}2`>Ihn5{Ivj4iB2OvLHE;Tv>e%5^H-wyMuZt%sSc&c+Nk= zc1m&Dm3@r{%N@tXkhV6;L++;U8Hx;hJ{(Dsm5q!g+(bc==Z}g?JK-mH6Tva|Feqi5>R>n%{xb1{CKDIC)rnuOc3=udO{Utvz|XRur$A6`oWjK)+PD zGEr0tgq<@`I*`e8DdLC$QlJR~xWkighlehdbQ3gaPf?p3W=*juON_Mm58+x=06}4? zA{{3bgGs7V9~%k!WcXwXFXd4hDaGPg?yNF4=MA&96?mD1(}ZRt1IFNNEKCD#w}WCy zE(063}5vBH44_I-&$8 z46jSLOJoF;VD*?l1%>uC95y0|pk}azZ7wb@iWjxr`o56DZea?$lW&3Kl_fSr9$LZi;AOn1 z&^{oMK#vIRuRMXqZ{lnTKS&kx9%F-0tQ)|8>tUiyc?GZidbUBkO=}Jdi*Q9!b=SN0 zIsP8K;%Nc$pj({*McwbOqYj#x)`R678(~SADt-oAQKPVl&BZLzRC7KzX*5Lz)0;vy z2l_SO*$JtNDFc;u2wVAVo-1Ojklr;MXBN@++&0{P3ZC+0N z!fW-Sxn05;0kmNB1Fs)mNc($Kc7IP^O`I}>R1~DSlLd2RC$g27rihE;m7IigYxmJi zJv0-h!xK|&oI96zA6v|s>{WK_)pm6crmMf|HUV9B?k;a!Z$oT18mw)_t5%N~o+2WK z+e?14(&|d@!|u30z#Tbw@$casy*w z`s66A6jT&3i|iku&X&wMf=#{zj1z`@WH|_BJ2pdYm2-xEhqlT1oil_d<~#D)2z#Kg zy|w~94(7|+#|Y?`b2q(I;LB2Y#7#kh@x_IEE0#Qe*e5E)@~vfU`C(yn2I;R!H39Hd zn95{L8*8$wDFsPASJj%)EMCc)n6?Y*23JF@TgdYlvhAqp03lfe#+uHp!@cqs>b27C zx-!pF7#f!XphfO0H7cnADCY)JwKChfD%}uO>!UqMUVY<}k8DmL_4l`Kf7};6$GZeN zoCsj4TmC)=FA)aX@KS}qK`EB;7@OPn9V5_h0L}GAw&(ccpr=DziBg9Mz>=@%$M18d z_%>@^nWA3ocn^b~-XOo;c`F0T5yBvQJUJph@ZaY`Ehcpp{^S{i(S}(ij1IuKrOaEQ z>@!epxaVztxs{JSh&5$v_7z*vNKLjQ-^oVgFB30!d%%)V9(advK>p><{TpVEmz$W_hLV1|*Fip4O~9a&0Aa%c7< zVJJXTyF-5{nBj$xT2FBS+!Fz6ITzD~&ema?0yVW~CK&;Mdd@B4FkT-dd@?kvsr^q> z!>0DD%~q6ehm0D@Hxe4)ppB2jtT3DmJ#6Y|Ch2S^4~CV)B~%WF*e_LMoZ4}=Zdr0w zgjVHgBWt3&fm6=O2W|Ydl{bIoNRR<&ofvS1m+1!QLr=GhHr${=nGd*IX5ZB|8c`6o*~wAi9y#wlrbu+0KTV{QnhorG!+k3PkWI|*Zf4vM_KxU~pemFo(2TUEAse+qrbO|lstk94c%+x(k?stl6bYji8wlkLs zED1o#0Fn#<$(Xy)R6LU(Vu>T8bXjs}10jBn{t9psVOvLc%Q-`nn>wqwrZ<<==}xMb zSd3gWPB73+nnst=txWV8cfu>Cw(+27C@hNaVD+GAF&)0*C8Chad-;}R-;oOEoEZQ!M0dI z7Lmr7p)FCdkr+mn9n?hOPpZ)raVBh1i8DtNOC8}(MdKWq{?WrY2?peIih(ALB<+Q9 z5+efMR4dP|EkmAC&P8P_)J60W(Lc=T1BF4fYSJB@2@P!rB~)B=_8lNHxSUI~t4c?| zSq50qu>j0>NOG9$m`L^+dP+CmN=3_TP{LtANgSh~&=j7cGSLo2I=H;r3`MT3{!KCn z6P1&i5g`*m6lDsmUAh?Bmwig7Lu)CGL9ir>Ofd|Wr@O(IW;gho4h@=1kHUmGaJhSZ zx?WW{cbkH@lMVWX7}_^_2PuJ>Bv^Avb6=()C)fj1_e0wYFiSvk476S$ zxpeE{iT$ZUv-HVx63WPUV7tSVE+dx6Q~QpT&MCFCB+_F^7bc^)rb@5vIah1VzCmCjV2A?e|6pXs$nWyTCcf(VE>QUK+AQ zWkZ-i#XK26<$g32Z#fs59TH<67ox{rr^&gsK3w)4jm1cP8U&1P5MM|IRPtGfl#EHW zWEucD4{`2#6pWdpf@)EQ+*C^5gOTakhyX}BU0*9l$o1A3Q{2Wg6~9e3BF(XX5-fJnxG7pLoA}ecjhz&{&?2*>$0mdYQTxAZ*41$$4DspH>Wquo~Zeib32PVxf zCJZcwH8X~n%&wRmq!!~Ra9h-VEq(cPqPj)8eUbYO9fo6ZbwczQC~DijMEwz(F_{=s z^_z_}Bc|Lqr=PSp)s6IFMh7f~L(kEK<(loM6iIZ0E_$c}U{eAa%m<}dKC$lTn8wbp zF3O0syB4`)0s-a^+gxDF%4ff{%#*FUCS*fxhxR*aC2$2@6l^Ny<<7+N@i1rc6-o_* zX2>v0bdSp%h9*lA5&Gw{41<~f&3K939F4s>yGR-sM>wv>C4%6yk) zVs7+ zMoXD-EmdNUa~p;VT=e$8cMlKI1)FW(ShjOPjliH;wb6HP;c4|~wXs7tVPmI6UgMZ& z8+9v9$_q?383WQR1uBw1ChA3@DjJ2VtV}&}R|a-v6mSc8a;b5Z#gxV-7nVnYVL%wV z$yxmto%+uyi^?6HJK%Y6GCmwbsZhdJ{qJ*vZR7L57DC_fC?KIx-%{MXU%3E~v3~zL z`cf!ceyqx_D7pdp0>h*YQmeq5cxMRcohw)+@#t0;#H1B6dNFYhW+-_K97p%W9UArC zkR8e$&fn&^6X-3^=nyFuZsIH&hM-geauj7%1x`YU3kY2VGDZh&bC}mO#|h$0=WT-2 zvWlw*^U;HX8PX{9dLx|1Vn3wEd`OSuGjj-tctnWQhzO~D#AE!X#OXL)?s~m=oV%G6 z(ObFj_~&;qi7$of(`WrYO%`CqJ-;Mh6msm260WYC-ofE<{a~NMT;@Zg5f$i?ni!5o zE`QS|-T`^8D8KROXs~!YEXf5=CbT3SaDzn6S*@Z#UKH^+2p zsw5bfv3`{78g9aK=F_wck_B}f-HWZTtLhC=PF}y940dTWIiU15`Tad51*BRb=&{V5 zhgz*b6KzbDb23S&i7UdCUcdo70^4&`gceB%k>CT-AFw43YV2)s;oQ(|z=S;M^G}X3 zXE`O3pkcl0jfUzu%MRE{K!)eYe!`r2 z@M^(`*(?L2(C5HLCnqne+qK;z*uzsYY&&u;F~KOM{Tu<85ty_cItO7Wpbq8=fvt!d zid3mxAoI5ht)-KbcBS-RyY$=Xss8%7^v&t%N^7~0l+Q|4CdBXDdok=o z4{M^e-g+WhPhzc+$dKq`lgjpVf{@l|xGWxjD8i6c zt-OScNM++Yw`0N5n{BlI)mo=!ELIUx&NBw`(4boL^D>IBNn8VIO_X&ME(s=yie!^o z%&gM~u)e`BgPSMo@j4Z#v|Dc;zt$D624iR$iItJcKTbY3(8?HH(crY$Bb(uu<}Kkp zXJ+xBfp!LCydz!v`BO7UPPB7chReikq(ZA-;q02WdQL&Qshb(7?)1}MfEl5hN^dpm*0S58jE z!s%&iNx`j#-_|m};=e0UA{-e&G2e7~-nIN{US3R$11SXzQ8$R-9m6<}A|z1?Vp#Ga z-=37i4xYE^xlCFY=5|3Ov?9H;Gcyz}x)(rwh&G_9-Z;SjauOX_K-#~{En;Z5iyYww zug`%50U^u$km?Cqye=)j`;gY$2h|4RBMOMS{LW};t6qwQ>Rj)A4e%bT2Rl94LX z&6DyGs@P&9b_3J|p%ztP5f24gTY53PK0S@K4qzNvE}8hd^9C&wx!l49`X zWBpBqSD++FiffmJGQoe^a(06r}9IY%MHNUQXP-f`KK z2I+0A#(g9h)J_tCX(D>(Hm1cXd)@)XGYwZRm%-YT^=yY$~UUq9TCgh~XGy>M`$)?Rl zQLZ`h3d(MqTGs8#pewj{crZ7_g-tP&l>+p}4mPse>e!`r8B~Piw3@ zoXVx4cy8u)r{65P<4Pn23h$j3ut#6|Z>5k>%pw4sD8j}l^Y;;7&my{pwox`Vo7ZO| z-&mFxo&NSlb-3&FXcZjSN3{f$jJmteN`0zd&?a!Gv6T*qfnna`-BHkEB&>iaE$X%? zGzz!!^l?Eg=&aygkll+CkXFRrK3Nx~K5NxW(wwGbKP^NT=iKp0v=K_nP>k|SeR&=g zs9-3&;Npq=d@4Vm8A}VGpv+BG@NsDa0#J3(baW^>*}s;}`N4WbL?<~V)S_Nt#&=id zp_WW>U?dNqjOu8Bq73F;a#U8)qPZoR70e%UY@Hx9yoQQPM9;GIgH%u}4hL&sh=Bp{ zoAd9<_I9JuuDv-tI696keAgbz1s`77gTU|JOs^@eRwwbku(vL`~z`Ek23`BCJWQr3(olqGEFhZz${4(!mh&53r1}tiFiCB zrvk?nt7P3`nd;)t8`x9 zK#Sc~0A94?49b9K3dBc*`v8>raEuq#0x~0dj9n?&vSQ(T=`2E+9GO0 zc}MfxIYwxeO2E3IDJRG3@kTEDrIg0N!V-H--{30KKkRb~&j2J+l~VSwIWqotFg!2Y zBER?3UQIu)R`H{ncuu-U_ZGi*Zp%U0Cf*H}V}T$iT$t`9oxF@?L7wK(qh;n4X9w6H z`4mWah0n{Y&aG@^^778p%YXnU>||v*{1uxehE_Zex_A`cs_&&sZ%ju5_M(>GWXzpOph-_|BATeUjdqQ&UTS*k<;jJSGjfzg5XK9m3!l24@_qs3jM zo%b)|2Y#;Ic=TU6dX^rjJ+VLYg-E**7E&(+b+t1&vH@xSgFsCY{J=>Fa(-| z0drlXZ=(;cClDp(63@QHuSKWGoE9wTtYh_@5#EXB&@$N38BW_rohlyc zk#Tg7Y#E^o&+mHqX?g8qDFqX9x7|w@R%$g4!S^_Z{{X!Zz;8!EKIr%laS=_zrW1yv zOiX4O!J=r6Jp!_)<@KU?R+ih~U>E~35t|h_9suFKh+y2Af$=|5oZ9P(C;|Qn=<_- z68uRL{6AfUAC=*g@LtOD|L!vUzq$~gcP{AqL0ppmZ}i4g-gP(Ze@7YHeJ8+_?R^LK z3T?v1T>#SF9i=^uA2Qt<&5B$XRN!uGL#YQ~ar!gvNG4Y1+L7qy;bS$^KSO8mnJNvE z(xFeHM)-t!1XxBmjC(c19Y_a&MQ;`(*0fG_EA9Ho8$R?#*Go4^;XVKL{aIY2tgLu2 zRYeAT|KCOalSJhB%?$IY=)k3hBN&67`-Qe?X7-4+geB9 zJpWD!-a}D)e0L{{tUq>tmpI5SayZKg!SehQiikj>^YEOTzz?3!kB5IW@bJf=AvF*s z2seN+4^)K)LbubwRd(QGI*7#uTXQp&_hPVw&{LALpuwug_W=jZjiGccjUW4HKrn`z zazRhz1?~smIGuy$&gxp)bRGz*gO2~Cyna3NP)z_Bgj+e+Xu1jVIh5Pof4%;^1F6Mb za}GWty_!oMj)AIWGW_?BfdJ=Wn`wMQ+3_Oe2oR4QIM3|O&5#cmJ&3H6B zK*fcS54Uc!j$jH$nH2UdD>GqfV0|*pB|^=S(zE3Z2fu#03dZh?#uVgD8ow`wCgh%& z8bU(#7BLo|EtG~H!K{7o2xUZ!>2=s@pK8h=8nbp33$%11O50>Gev)E&t>2w4W7gU* zVh2+jvrbKsBo?{}S;AUb)>kNeofWLDnLD&}^9XA*Mj46OM&1+DIgE(O8Tf&vVjf{= zDJ7}Gcz$l@N_72*c_%D)kyjn>d6W!MsLUYP$i-|#=b8?!$D9>sJ|6dmC`*lvPy(Lm z6qkv{cAElCHs|-3pb&QyoZraFp+y4|(h_DnS?JNocq~yL2gPny!cb1d4yx~o+JQWL2q5$)YJHw{kbdwjo^kQ(Cx$^eSTUz3G zIE6;kwjGJ$|)xYL^C3Qu(&~S^Gaqj4F)|DwkWPl7I;xSR?YVp1&7UL$s zgjau|=o-7t(^IiZC)kMavD#V_+m+*rI@9rrl{$urko9Ii`Pui#=YW^OP=|~;%{cA} zM4Fl3AX#+AM6XQg#(IgTzeyQLMxL8wNi&bnP9n?DqicW!8jIe-VeYsX%WvpVR=7(qoaux^0^A45G1j_VQq>^axYP(daSoF^3vNG(P(Qk)Q}QLuCAoWP_oafYQ4 zPJOTW6I%Qc<9lV3EyOt*DWZUe&kQDDgMVmG1lO!=;WhFP9QFW#^0L#RP`91&5ECK7 zOgTrJjwoI}TbB3}- zbw=SxH0Bsm@A5Su;rPyp2Ea2KOB%!xuVvC2Nc#i=^Niy{VPf-}9=td38JQ;YF!7C4 z;z^@7%{U_)g(hEFTu^4vbg-*zwV@G)w)k6%(V%Ba9b1#Kz1Ef+oz%tgZA#Kof#oeks2 z>2TvSSQ}2GkPG=?U*tJvSDO>8uiESGt;!OI(IS7(bJ&$d8F2~aLPR7W=Ckm2pRazS z{^F=|^mDtuE!HRu_?-2BsvR}!2m2!5xBur4@6*Cj?Wa07F?6n7w8ogNmCBKT|JoFe zhgLw-O26khIV(N*eW}xpHHM6~(Vi$hSzk_98%&|a3#Eq4DKw>egdRo&r?ElP?vI_G zsFcNy-MjWhy)M3e+j%znpZ!DE?+vb8uZ*}AE;G)}=Q*SAU~7Gjhtqc6^;P{3)Guj39`Ii363|eY}t`zq$)_Pndg~Q@`j|v~2~Y3XP89 zPG9SEYimnDqPIA#IyZ9eT-nzy9A>2KQc#Fb@ z=Qga>xBnZSKl$MtgC}+T{&%p}cLAkuQ23fa07wL^u7vERlI}|-7U(*GGrV?WT^Cr4 zU<43C!brh1OJdY1h^tx^CC?|E7z%*fY&RFOFp_IybD0t+Wfu9HUS57J`BZqK-C4%I zC6MoAaxCfDKKZBPYcXgAv)6P6@qiwjSTE zJ?4MvCDgG9GU=fHBXI=o|B$L4ZT z#{I<;;sWhXnES>JfaU|v3v*(X%jGN_lMuHQG&y{GMq9e}YkZr|kWILi-5ZfU2l0X# zYlc(WjK%kpttIKJXdMn~7w;xX%|vTmxWDHXA{(Ar`qRNeCNP+|SYzJ_h*$g8>a#*C z*lyPvJMA`}M4V|&l+>9~Z<66zr=Jo$g)eB;i2q2rYM6$XtEDfP1?K%GTr?kjCZ}F< zGlTrY^vlnO4$76(fiBU>#X>QVjorkFO-_wvZlcEPC|Z26vn|$J<*#QTisofskFN}x zXTAJ2pmYBs&RMJ2my$W97A7#LO`e|4l_63%Rcd2aZWXgn0dYu-C??4s0Oj1J5mGbf zz#oiU7G6g9Z2_c%=iE3$XrtmW(JQUym^^1rmKxFAtl+FBtc2$zM`O-45iy+i;L)`c zGP%?UO6jKXxv++xiXQ&w%smkGJJBRF3z6CZ@B$+-7!REir71H}s~p`l6stxb!LKuD zld@>XNt&Vr)As2ZwtoQh;{lZFN=dLO-kj7@Qt}(sayPcyN3ZtVB+Hu!Mj1?&Bz`zA zGyRyzbWK(ktJWm(EK7xU?Y7r(F>RuhF?Zdr>B(3sk#4ypw_Z4Kf7re9bjbGnXw6jq zBeq`?)!0^^PO(*p4JpE?6^v4e5txu7=IT2NH_^b;+H3Cub#3grRanjRZcgZ6pr%@w2scQF=*# z&-XT(N3~S>YHE)mT<`lMXM+WMa>>IK)8v;#_}(Yd2zE^-(UxY4!%%960!Pn}6qgZ@ zS$SJ(Op&A{#I5@5B!Vl1vEwPUHrf|R*#<6`75Z52J1$XQJSsIaB>Oy6Ik1PB3c>FN z#x27c-mwkV>*(aG39dKwW=z6XQqhp6X`01x^uQx;z@lj{lvOOZ}0SXZWX{FH!pP>@&K+kUjejMKM z8!MW1PcqwVdG)-W(rPg@5e~ zFW_diFocRI^#OakeY;m0`5ic#x}EBqH*^=Rat02Ps$V{Ow0ha;;1Jl(hy&!`kRYBI zU6RI!F3pa|F8r7sg)`2}Sr)nT*S%ut{M^0dzC~l3`YPupUeN|zPtgO;#qp#Y=M^?G zJe*QZ;|yKngwR3@aY~48l=8{rwe{2Y;ny;Ibian}$7mf&ncnsJ&S%9wMiV3X0R|lz z^36hNmFWU>;3@4~>?+inKuTOnIohD1Clr57l|f=->n#7STKynObZ|=uSS5O{3Y}5B z$qSu>*~**MDcLmUr^e_{fEEB^gG3RD&H-5c-ZgClr7AS!lh}u3L>6RjaXK+W2Zs-* zOf|>_W(0cAE?lV!aMBX?Jne$3W2L3A3YjJ6l;N55?bhD8q5GGcgC4Iwv0PIL8 z$RekB_)g)A3d#1e50q8<4RAg@53H1G6L&5;<&WFON&6A*K!mdpvusP4_wJ!Fg~&n` z_u9(oxPnNmS&+3zV(TJTe*iokhY;A2R5UFwP3RB^3dGlQfTU4b)}*1|4lo$A&a)E> zb`|3B*TJIADoYZISR?>W`59!V^7!wJ~3F)I;Dglu^H9@l1i4x?3 zNLwZ2PH1Dq&vvg98zz~>p#abAyTC~!!FmNu3ld$UApikK=LY_V{HOzVHb|O>|JjE> zP0lM{NclkqdWcJYW22C!#(Alx##AgBV&MqM786+hV;TLAW%MLb{UT*9$5^AND6`KI zt9IQBat<1qX3kz{=>doZkOr*M{S1DCuA8MWpRDdH4dsiuEl@wsp=Yv74~y|KHYwAb z)ih((%{-_%YeuN28O&G#HKVs&Z$!zXRP38F!Z(GpWtSg7NHXy;*Mis1?Pv==CO3n@ zAI)Y0KiUqkqu7px1ufl_bm~$<52OM(ueCA-hCAQxQryZ6CN#sMKv`R4A^S5)cT1da z#VlNdRZ;47@@&_72H%l9DZ$Wx*F)S26?ey>_J@cW?JpbNb7<j8?jb?0vJ7H@PL=fzuT)+ z51Mb<+qJ{S!OwfOee_yA+N~Xb5Lw*bv_Zk|5s7rkp;=5GsFF~zh~MUZ^wgJKP>x2N7 zwIk?)Bsi{};kh3;l))XrbgO_EjSmzlSP=_$$Nd2w{vfJo4O<=e(9A^(=FKCqK)JQE zMx)N2B2q)4!kc_{H9UE5Vn=Txk71&8xvGeWN|70eeA@O*zXL*(Zz-u~Jw=|Zm_mL5 zUAjosAs5#Oe>3aQhl+J@JwUFbHgdzF^wx0(?ZME!wnxa;jDR@}*bS&llZ5fVgD)RS zeLH}cW#6DfV+%561>()bSL9v`VelnWft3-U-0bPqz^@c&3q?WyAR54vCQ2kVC&C0Y`=Sb zrwe;hO1hb3jal*)*^5hC%}rW+4-^UN5gRA`bRIn#jvfP+foB-v1_Qcu zFtGn{j7F=nvCso(XFS3vz0$uv&{i`MUYm6W6yJzL;^=N?Ctq$n}HS&j~K``-%vqW?NOWyeIe^ z%?3UX?r*XvUSS06(b$8l4R?>}ExpIE-Wr-zz+1MK#ht%!Yy^quvVZbLf5& zimC;BLLhxfK6*n=R({#(XqOkZJ4=tslb!y2)}=LkYi1@4|6;JqNoSJA;z{Gc`zUAR zwefpoB{3lrQ;3hwrG{D&V!Q?)qxJfo#-CApi}&#Td(pq1XZ_+_QmRCn^Gz3O2~f3N#@I<8#o(8cl}O z^E75+~e)s-AP<5*=mWp?Uf?)` z!ePpE?uUV9Z$?MOEj&6Gv)50cui5Od(amYjYg#UM7F^B2OMS8-vZ2h}sCZ#sJUoXb z_=E%Ui6H8p5OJ4g$TaJ9@%b)%8g`f`1K!6GpdaB2Z{8$lVTK$n1SFRcQnt%_4(YDQ zAfGGiqGz(mc+f>r=g_%y;l-UY#*7eUA65gut=4}g*ZM3xujW04*VYrBX|B;}8Z%6p z+)VSD)#5uu&&nA;N@RWv-8!>-|Gj9}$uhjpBRiKjx?x;{%twHHoM*vvdEUroposHcgGmlCleIR4FaL zweh&9@7Is(`_1FZezlfjNv_IafJSA*yoqGhF7aHrJA$fdKDv_!MM zzuTyZ{e%7H%gRx0d&VwwNXyBEo&GH**w7$1t!)J4|DrK%>A#)fh`!7U#S_|12bF0C zrZ9H5KS-0fs-~0P3n`sOQXJodVVUZg0}Bk-7Zi~`=TgwtTFHzDmX12I9KQa(Jkf-u zO!|T|mwl{IC{gO8Z3vF=Z+zEB-`>2U2|L%0iLDAp+4J0l{p1Yxe(Tuf%r0LwLB|f zRVu7j-en>JdPf5-tmrwL($~9m<#xM{XBh=Be)aUVF1a4eRac6wbc&_rr(5+2%l$iP zb>$cf6zu7R50Km;gM`lQZ5VArhiqh6XD+mNH}84*C`s28gd24HC*}3b%=Leucw!RU zeGm3hM~mYYCIE$?(E`YBCMUcXUK)%hK57|a z$9cjHlywv`(b;|UxS#!&2(d6_+It}epMMEbx8oB_d?#U^)EKZD6R^DL8Hu3ckIE~{ zBI?D~)KRShN^zv3$gh{5i>1DOcaA~bpOx3XPq@)du_XQtO;BYn!bq4zcq4Ur@@+vR zowDw$sEEZ7Hv+@Za={?F=-0j_ZUg7nvEz-xC`hkxQQ=^Zd=8Ak0o`P=qBwUtwoD2# zx*DQwt?O|DBDO~@``8G%-?HyByXd+eW)Xo)xD4>$paf|}y_7fR3avJ5snhjob%daoDyK2WNF7C)1n^n9_nCx--U?_mT5 z%A|IOKH3z&=Z>&mfR7Qq-2p;#(p+DoBxu2)K_9@WfsRKxGcNgGkcf}d?~$3V>>Vbq zol=+G1w5xSpZfcr@H3yyRu=oQkjZ&WPMi=T)nsZ9f`#?*&Ah$>b6|&0bX83A*_s4h zQ&_mk{GVJqN>y|)aJ*Oh^*3MZ5b2lL7b1AiBV4<)u)E)PmDCPXt3G<9Tj79alB7iv)(%q!oCl+B2jje+J0tXUv9EoXNQLt|X#HlsGyagw>ZFc8 zFOKz(XIbZ>!tW2u(~gIN_3>!#Y)^kp_s;pR05pe0yclg7~VZi0Z90sSrs81M7 z2>E*Dq1wA+79S?i`5wx#z5i`K8wexuh{zw{_WdnP3U_u4s3m(=Ez$DU?G2`qWKeat2vc9=qzxTJ^{J z{_fI=nn!f2V{k=*K~L2RAST9yhPZ7j@|jX-VH}eHmjQN%SEY@`+K5{4E>iW%dAoyQ zD013I9>4^57y!QZQ>C#4uVn+vV*NW^%^413VNe)%ZmAObIUI%5hlp6WBEvwk;5IBH zaqgCWaMRn0Bc4$kqo1`kp>@+EIMh|56xdej+89BI$j#?kRTlOe(MoQW%}HcTc|skuD8Bx{cBCMq#KXw=W?h#2q}?!yeho7~otbcsX;z=bDfP6oH~A{foS;6>iR+mj(a+Q6MQk3f zqT_>u2HaBzyKNwVnlIr=GY2=4T8*DH6pRT=+rWfk73 zXs)m8`%l)}jap^DUD@Am@4***tKvy~d*gat=(>FM9X_T_n_34r2iK<>^!S1*wcFL7 zccEsxjSul~m`|ZS`5f^LjV!E?Qp)kV?gf68U$`S~u`}q61N<*XktCdZZ5r4_LSnP?ggWw*nWL*w2i`4z^X;jIQ;3Ljz0ru2&BvM zW>&W!GKOX@fnF|-$hyiOZQL(f?Cn~$Q8}uqI4)!ME%qn%-` z=);NCRBw@LnY~F=NUK2q!ll?wExW&$QWhRA<9e%b=cInX2<$*SAi-#Nh~<{Cml0p~ z?aq*6n4CKplnzrx=hUVeBj2eskJ|+74crxDKnxMo{ciQ&r^OsrBZ9DvTet)di$HJw z4@2PRzzd3I{U~roAEe50gl-q=#g+Jw!v%7%ZLQ`x#Iv;K0fceBbf?`qYIG*6NSSE0vnGw z%9|?Vk&o9eT1=|ZH*4FNTO6ZEyOiq8zP8;S`8fc_k(F(gQM{`H)1YOgZtliW#P`tY z`zkh#s?38$9!2VF(TN;bfwGwVZ}DRn%-AECWdilUgDNH!qeZg?-0Qu&(#6>8aCClw zvz1YTi}Jp-6T(cM6X>n2b|eqWlOAiVc{mB>Taj2;RJi{)In1p#MkiBB;x2D!wv zw_jk&y|4yuF9j;gF^>^4R|Y#y0+i@%g|uz1RbL*o_l5O%ZT-p9XV1U-`Wt=(H0F2F z`X)M1$Cf24m^Y8s=t8cPJjw(R#s&fpSW@_rf(?Ib40lR~R|y)%vE2$ArnhPpXyBbp^_bnl#r^KP_+w+=Fp7MzYGeF( zSO=q^F&HEZ;09JRgI>|qCJ>PVX4OdHMX~l6{t*r)RK&KyfrAN0`#z`d^klwHs=?8Z z3_ua3%Mr9<0$CK0&Yau9Fk0o2SUbx}Y>?hyULV59*$?6LWY zU!OgB^5p-mJ^tz`eEaIFCu{%j@!HepkJta7c>Hif$o@A*35F2=FX;HA(S&l--v34a zEq*~a9A0jYcP$3au!lFO2s%S|z(f+#Q|EUSxsym}l|uw6GtB!;T3)E6Q=qAbfQ$

    F@^u21yf?T8M)!pojw@>gW4QD?<@sKVS|PUMnmolX|Ndwz)CO@ z8+-7K(!mAXvwlApjcvn6bZ{uPmp`qemtU|jdbiGe{Nf=9LJ)&g+|x1qVOg4f{9bjv z#o)yts^wvEH!%0t65ZYiO*GKp=JrQnv(GX_a@(Q+qL@kDknS*p>C+!M6OfthU{eBQ zBKi;@``5 zTYgB{<0>A~k7s)M1@&tEZJbcJH3nc{?*j!P5DW3Q=g0(&=^scGQYtppf=}b_{8o5A z-udX7K2zuPwdUnL@fRRe)f%TtHOhi`hY+GGDoGh5*d2k`v%~5^dLpEW>X=gr!?$!g zr#$n&zmbp&T>s*NJ zG3K89Y+`^IV52{V5njQAhG20E+ANPT|8VXgRzUtlNS$y!Omq=LoTBlI|8Z{>BFRKS zIHnb$VKGr6qm){N!mEffHCLDz;yLV`=*TeWtb^tF{qKe{gZmHQr=?z+afKA1H zb|N|Xf0WU?d?aCH-|F}Eak@3F-I#d993R(SV}6-=vQC+Z0mo~1;VLP<0>(-5aUtbM z^>|zZdn50$kx;#AzaIKqdN^H)oJvU8ZmT$yEf5E;CvnXE`3?vTG?0V55wR51#~sH? zIx{P(o^2%VrwS;86I8{Z$~4==J*3myYgw6Vv5imn@w`7Wr;x?Cxn9|=U6V~U7#t&@ zBhMr~)q}i(x~QDW9M3`wP*nFt>ZqY`+3$yn(s>l?nH3@4Qv=B1GERwQM#?hb`W1B4 z-%er*fwH=EKt=G9AlpF{!({fVX?M}}&idXt*|QeVY_C)?Y-Ky5!h89#qSt9zSt!vn zDP0!|iPu+!U4oV^A6Ml2Ti6qzO|Egmfye{?wS<$f1D(e1enc!GsDf3w?UFoadl3;~ zJoc1X7^R98o%z1cPbNs>Zlfdl9P?K;Xx+%k4NM`&u%qWc7$qMgiUT}u)Ij|!MG3zO zJi;P#pFZ5ig-rn6*EQT^zk4B3LU3eqlqyjaijO$Dj6}2_U&cqd} zKBhiIh?%5(prU&C&rg6>H|OJf6VjNT*5v@Nl~s4Nzp0mnSDK z?bhCD^}gp0BQfqi^M?_Uk(!<*x0-a@cTH9P*6Qi@<0W9|oTXEj?B$A!CX=UR%$epx z6?z03+dSX;SDphdqinAw2MCy9oK8Y7M56!@tOy}^3dJbTflb2~@Zc)d3O-4pw zcP87ia`Tkd>T61C92EJK!;QSw-)G7NL#WaLIhMi{2IY?#k?sIbw~I%+=4O*1?6&C_U?e+vCZ@q``L zcf&(QS7gemujFLqi~vh-&v-tfsrVrJh#pUWLfFdBHx}-%q>_g>JTWy-;BD~bfigyh zD`a`2CSGA7Gasq@mMX(S#g-OH_NbO|-4lRp=AcJH;0lY*-Zo^AVty`!T26)9D^9b0 zt5juER31;0uX{JVvcJoZOk38Zs77dsUpH-8$rOkUjmsRuRQm268gpf~AhXDebE(r+VDt>gG7ikMh zw{6Y8zqiSBOzewa*qCkuVCI-)U>B_5KX>}yx@_jI62Z*J=`XPGJ(t%P`$?=0Yy*-3 z;_S!V-MvXiFf|MXgI{BO_ERp34I;h9HokE0w7KXLv)>_xFMW3?tQ?sA?GAV*f&g9;=R2hvCL>?cYh_l$oK!2^gI{^qYv8 zgi9h>5)mO1tK@ulB{h;$QJtwnUX9>edtP~j{SKHr3JKSiDtB@z^91`jdY-H%L9t_$ z0Ob)afNVfpoEfnhe!GRTbK4Be8JQ>UU8}?SZIFbLNg+3uW^R~wcVtKoAV`B0ZAGgw9=6F3l!}sTVLYT+ z`?dH@ljMF(4K+jVAzR8CqJim++4Yk){jcVJE`yudwz%}cKRfRCHW86z0EbccdF?S1 z=IqaN(~4>{u}?r}iS^W^!h(-H1yRuG%#9XSj{>1_845b+=pSHJ1Lf(sr6$r)E6?uD{X9q0 zC+f5Ksl;;TS*V1J;xgF!Qw51c^L`Q=3XCR6$rOhDAfP+4&#U88)5NHia+s~9E--f`-GzeXKrQRhu9**jRo;E<;7muVElqkF9i>^!h zJ9}|}Km=O_V32-spkU0*GicUq?VJ3M>|LLt>V++2lCrEtD618kR)nicO(> zl1ntIwrWX<6|#zIqL#4|MHJN4T2@jdvr839(wd5D2~lENYin((sgi0Utkttcma-&! zb~u~)cn-#_6r=O}eYjI1B1oV}510u{1d&0RW{Yg4REk#BrKws$Wtmz@lO)+>lQyQ( z*==H?6|yv{n#{8JH*yv%Sd!G5+BCGA7NT0UF>Q`QcE@blO`}Z6#2FM@CACE*NNUc8V;T%Rc*Vn^xM26jo>UG}+dy z#bUM;QjJ-uS+cSJhHkd1#b!u%cG{Y;O+{l`)Y3~N(`Z)2ptjjd5o=aR%F5NU(OAh@>5Ss?$0!?v-tt&JAaB{IyG*+N?^vP&(R$X`M^Vreo_KS%TU^D>KN zvuCA*>^o*Ek`{>q*=E?X+FK}Q)Z1#TwT7lil}6>Zb+&05vuRceHm!*@HX>|R%T0-F z(rj8<5Sd0Qun>%jNGL#y2)b5vKTR2bRx->|5JEyhXS!ForCJeK5=4;^(BC#ch6ilk zy8+)WD?|!N6v7o!EQ26X5o!RH0*D($UXC3E=s5B4o{acxfxZaM^altE<-dh;{FwZ? zpm)X8H&VOeyKep6J7f>0BIk{54vUcFSPsMom_;*!t+I;DQITY@THgPPec!$B?Av?B zpp#^_YZlhFHKQ|~QV|G@0FV`nAC^-SFK3e&l6;19i)|vlJ=0rLP`vK9@>$8K^5vC9 zsRgWR6{)GrsN6-XIi1r}B}|KpZn14u%{wY8&srms9S1F6?RCaF#Pm} zcbGo@RZbEJK_Y_v^NkvjM{XJ>t-B@~(xm0uS*1^7V}8eHl%Q|;g}Y2Yk2kWPN@y#( z^p&k%>8c&8Y5^^rT0fdWech!7`0NHAbATK8rFV*Ws4DIZmu=mLY7-!}mXxhYD_Un*9fwA?*20;qHd@n~)@sD& z+19d)Rb{GTsfLxcH5OtOt5s5pmZfT|IGtsX=GJzFrKy%%MXao?lR9pi+eBwOII_z} zSaz(o*6TXRD-R2B@!08;R+dCYWfn@!IL_N=Oe<*0TN5RAJZ{E>VyF-`2CHb6FoReW zk{-J{tvpg4S2?q@N3PkoCfh4K$aW_atnG1XAu|fwNZWSk?z1#jOSQ*!snR2zIOkcN zZoJyo%t?M7T)m>GC@?s|1auS z{69C7)m%WN0NJtShNc8QsG=X;>GV;zicC=yD>&GGLf{{+6fuOJi9`=k>eCoE@BKZD z{E4Cuvhn{{=5O|YblS24%M`SUQL@m_r>-bi_n0CV^?l!FXV1IA)`)l;?(C;KraY*q zNKz{zvPLdc#j>nXZJ2e}dszeUj`Si4^;HT(L~xl5RCnV*jzwTKtZ~&K9<9B?y&N?G z7zu zzgA&}YrsSUyC4V@oO|&_0C@;?f*}gjY22&4%{1+Tamwc}_=iYv4aPzs0S>E_+wkWt;^3G z^s%*?GiXy589uMoRX{3%i{aWmPlafFzp002RG5{NDbBEer7A}AQ(>vpLSreZG6}*U zJP?@Mh^9yxgln~6zLkPB7(eM1hxcX+Qb`{$0#xU-Fnxf)-;;gCr*JrV|3mt|Q^`p; zfS-ag7%z*cu)|&zwNXX-P?lo$4zM5(x(GTLUEjg?`?YgN6_W6x)LU*u-ap(u)nQ4&d##X#%Op3(N6grAS1%%vyqzt70KRzJ;czoIvmGqihX z-C%#hN@5D!e8@-)YBs~Pils8(u5nWUL_=7K@ZU?612_&QjI%0G{pRZ&1_3r>^+kMv z0OW6{d2}aK%j&Ky3{;NPaVj1(JZeY(h4m9ZaG!q3`JyYM=eU3{s#qQ_UuO(sW*)F* z@m%YnPOVH8hcdZId`Bjv;U5<WA;e=kxDIw2&48gqBQX<=R)S-|re z5VMJb%os3yTl6@0k#it!Ga*Jn2QFly98_d@g}E991`zysv5tC4YF^_FF@3+FbxM&W z#(VrlM4;vibRPk9tGtvzhv}ZU1nW5(TDh!*VrMG_TPG?8A7C;wbH)LnC?_ckx2IJK z!f>44ZYro~mZu-WS`<=p7ZnkqOlV=NE-V=!;IjdO6rlapOB9_Q?S23Bf5ES>;qe5? zzh(8-VwbZN((kgSaIl`PQr%)(7gu;Tsrkf*3qsVhh9xE7T!q04=Jy-Y{tfaUHzb?x zvHdOMhTjd<;3OW@gFzpl&@BSW2aK0E0$zYfM#Ln5-@Ia=LcpEM%#w!z3DF`3 z(=3ukz>O$Idk}aVraF#*7>z}xBYDh20Pqnc|HOi8z+DCeW}roEk_GWJ9FdL_bZy*8 z2u7T3*&ClgYB>A8i;Ks*!GK3Ihzx%)p z2Z9P=$0yw*;?|ahfiluzGSDPA1E?yP1_Pr`heG|&ClB{Ij;wI|kjb_>^%X&pN3ir! zLBU4>s*3UoQD5@;bUF>IRaBY4;vjlDE)O4&Km4&0P)@ldtK?se`(3g4pKkn@)8A#h zDJfMdCf-c7rVN3ifS{pfi7H(E#xKqw;sA5G#MUh3^%VPR4Gau2K%{o$#rU{208As& zKpG>E^-oF6#Dv1h5$dg<+Va#Ih}g7&pZE%?iTKBNitV^X(gsJbSVE4K*(gE-BJqbE zx)_E>rx?H)y`n*tBhW2u2aG3an1#r|L3;ujg1;I>zKW*}Lg?)eh!%uEJ%|r@I73F7 zd2+fL!x9@!8r3XR#uVu_QhZB9%KCJe#AH$QRy zQ}m~t@+nFm)F_mr588Z9jTHOeA2ZE85bzl&qlss`<%JOl_XZmW=WL7@SA|eQn%U*x1YXU>l^h!N{uvr%jyoScUf=cV+-NP)2A_MajDT_Z*@$A!N za6%m{K8vkNzA2^_l1y8Gnvk<(>#0Fvkf;JFF2H2)X6CaE7|HYjwSi!kFds*cEyPv7 zu#%2iPyM_R;eam0$RIkby&zFyny7_C8O;7(za?34mP?<2F6I35swvExahuA+&+Ryw zgmAg{FP2D4^p3&nfYwLgn%v?A(;lV?gtDnaas!3 zX!l6v>Ir9`@JzRXA!Ha?ppeU)xoHD&`VI;qN)&h$>~bG$eb1<=ENTyH(LH0Q-8_sx zPj8N|NrWI@@1h$9mT(>-6o(+wHHWzc;jP3ojFoXFIt}DGvngi9SZ>2qJvg(5x0L?l zF{H94{Z)_XtLe?5M?sSEw_7MMBuD;{^faek12-qy_6U=SgDegkE9Gdw@q%_^G z&pN%Bf%?K`l`puvO)2UR_V;I}d4>NRoMe2#2^c*LN^EYR-sw!G!%GO^=*B7JV7>QhTsp?kT_|?CsPOy zu^}Rf_9di;y-g%;f{Cb7-W=!Ud%KTG0N?kP6PCOY2McjG2bzEsB}8c%ivs>8tq;if(V3y;;1!{rgfX zNM`C{&}|@I1D{#%bGOhpn=ae?Qd!qaCSuV*YYghI;?%#8KUZ?8tUT=)&Sc%P2Pu8SD(eqvY1kXw=&^U5X$>G?&1+CGNN4%r0)n z6b1Kes~*4C;sQbz@lYc0y{L|X3s`e~1as|`LnnzqHv&y*fj`;-GmM}EyDiQ=G$f<2J{FvGD8>byMH8cCtgFwZ^@hj=Fp(K}CHCD+O z$uj(UcZt)jkJsk-T^?{YAyk<%z$pv;c?ZAXH$ga)%v~35ct==@vZ`0Sc}hNx)4BA0 za+ojMna%qO7wIGA^X^l{8hW&=!@{`;t+{g?^{0LTutR1kYAHH_gFY8ca1aB;t5*w2 zOVJXY;&hV=E8H9vlusjY7l({50MXtT8S8$l(7A>BN<3q`snm48)r(svp6@JAs?y!6 z;xe9tgP>cf`qVcOw1XH3@#{wb2I9ycl|%>u=tP?*of-lRcL%>a)T$R-&VvmG0&Vj3 z>(&$=va*A^n^|r0Uhiuaf&orj3ft-7i_foQw224n`@ElLjMaO)HVuQk>|drV@=}Da z=7p`oKx*X%Qkp2oow>~IABUbiXia1~Fg`3Y@U>Cs16TLRJYn9jARSC& zOAOzLxTZ;NT3~WPr!PyUN&+>cYdfFAS28j^8nUP{-j8fLox`EW@=P{A6KXh~Y4v+f z4%c;NB+H}2P{RnFZvvH}nIeP04y>>)+{o~%d|6~Fq--jY`M@=0Ei=ryoqk?xpY`}; zaPAg77G>WKTf{SJV9sVFv022nit%J9CJ>%7G7hX)a|e5dgfPX<>Z+enJ553zpF)q( z+p5*4zKzn<@~OGHBqSG87yVpsc>`l}PlFziVYm*1^STID9HnSpQFsb%0;-J|A=E%( ztkbL$YGCSu*23?jj}v)c3mX0*d7MOLk&kd7vV zjK|(`p~%raY(wpyK=gFlC_nLtiQ)&8Abkn>&TS#qFmMhDVKxBn8odRUhTya1It~8t z!|zNUW&M|rVcWKEjkSj?b!-u#io3N%gLr9Oo}hwosXCdr!b%Fmyb*y^l@x;ml?1j2 z750Jpzh}*HID4~zku!a&q%~olj_+U#U?Q1&I(XUj_W9h_%UdBLx_?LJ90P!AH6#}Y z&vRbbeBki{~_T zJjpwK-X31*zokL`A0^2y-Y>i(o8bv^F9MzrPQF{jwa($leZSlTDbz$IN|8B0id5prZMqT?L&z$lK-p zKu7WaH&=_i2t{D=L!mdzqy_c?z5D4E={iHP3QuR<5G)D>LQBf91_G66 z8v{7!H)q3e|r!U84hnJyq1HWaq#WrQme1VPRi&6~9GpP(WE_rZy`wcP|rp2SUs* z3v?9mUS|WsaSu>A)=Qi513~>l*whNF9>BWDrexj_g`mLV$xabK!zC4@3=|r$n5w+) zq6*#F;#QevW%~Q|D``hAKVeK&ts$Bx%x!-Xl6gLt@bZtTAAZ({Og9M=?GqY6S9agB zQNz`_fwn!cJ+Qc%Oyh7V%9FsCbuTxt}u~t-QswY7vPazMp?leNyz3nwqgVmnSGLIYiF>EK{bTdbY*j~PU&wR6jzu;lrHms95uW>L*F(V=aU5P2TJMWH@6Q;M zKYzMV-RE>05NBpR@C-%?rriR|8u-RZ8x8Tf)K=`n_c= zYTG(Xcb`Z^wnFC=L%)M+LMj*7nSN{j>)@Srzf&L3(`~=_vC-N8gRA2D9hmh}w7%Tv=FvdC5EelVbEU^kAPF;TqAK_hG_J~)j4I~Xd?2gAh$n@9 zYZR!7Q6!K)fDg@$zkirF8aV01Eevz>fam$XulR;(r;Psm`;M`;5OA+}dWI)!Kdzl5 zyBLRMlfw z!U%N-UZiZqz$S;yDOc7gkWnbdT($`WQv1Z{1WFEiJRjPQtAC~>A2NihA^g(G5&|Vf zesz=*mkP%||Bi@;7Q6Dg!~!f}Z=LuUxz^9Q*BKFW(-JJd}XIUB))^m17QWo3;As>FF}&ocF+IDE)r z2r@<@xo(jrW}z-XaP4^KY#`<#8be|t{Uh9LW_c={tQragdcps8MeM*dJAk1+;%b}d zBuK1RsN;dum`bBNP9GDjdPjmo8c+u;B?M5GEO2GaG?3fbAZO3-%Xw*@ zam_2p)eJPV1pvt~94rhrlfL}hs{@$=U_%MGse*O|(M7%v)W@YwJ;}%7<#0Cx0Kok1 zZ56cQZEf3J+jMCS#fq7jOk)puH$&O8%A@n~gnhO;#MH&wR6rnYK~ZWAZCkw@=U2&$ zm5g*c!PC{gzacr~+SYkpn5DgP`=R8M;1@1X+DmsBWD|stb{GCljLC)egvZe zrG-igst!XEOQ1|(cQ`B}suT=(=q0Hu$;2UcER3rd`ciYRVPs><>k^ z70EUDBi{ZDhJZSj6?aHEP)TJdz*@sHM2Q}0lZL_Kywm|9dLbl&1MPaoTG%WGHY95t zCsYAruViAz|5!RV+u zMHa@?j9CUugT*b9#IZ();%axo^jMiw?T3-Jx8#btRztX;HbLY!v@!saZevEy!k`UYW zP<5FJKHdujfx8Tjm>27XBTeoul-7oT~kz0($?DF;dQJ0Uw_B+oSsEshXhWG zK48V-cQfCw>qY|S5><6C2&eorqn^t#y&?7_Yx#T9HD8D?m@fc%1f<2aWF7$gG zfO*g8ReZ#aKLgO_?re(h85}stsVSvQm0hNU3WeY(fzUByrWsL;F)RB;bYU~A9CGJx zZZRw=PNpb@UmH`Z#W^s<|Ah}@bh|^w){vP#jZoNZ^)rg<{ zuJdzs;W$$K+mXi8@5kp&y|c|xH*brflt6RgpTVD;%@^sRAqDJb7*=ICYmo#v=XW-s zah9@?@%dl7Cz7$;(NYhm6takMLuFr4+xh>^{=eQLB0tWKs;Z|n)YR0})YR0})Q}RHLM3?(U{$YG!Bl z%*@v`)YR13YHDg~ZmO!TW@c`hnwpxLnwpxM2xM5U?&fA@X%$sfGcz+YGcz+Nk|vsI zri^14@cna_h)v3bSRv9g{a+0+4jvqzP=hVVW+q_vqnHSRv^#_xm!3AG`8Z{woj7f-wV3VtpSC zR@!wWEndJIPiTDrf2(D}i63die6$jeY5E2fT`lk6qOl3*M98dihq2c}WiSPdrkDZq z9_fM!^=R^4NKCFAIcU=h35*LIOXXoEP^LC4W+13=6ir5KIZ$jz^vjW?Gt@Gi05WH$ zg_kG1`~x_|t*BGNIY;_4u&^`2W`FJa+=_NX-On9}pecfaL7R@wi)0h!-6LLUwQ>&b z`0~S~di_M}$DQ>He1F zzag-!*Mb0)_2VHa{-Iwer%M(>nZeIgj2KSMHZ~_uHqk+F-=9o(T|rjaE-Vhr`|828 z#)U1OeWWm%a+t1_u}h1As8-^UXg)j&ObTx%BFO*S?8N zJQ)?fhb0~ILzB}n7e<97R+dSK=6yWIZ*Wo+?hjNlAIiZx3T_IyaFI&?60uJEE>uotYux{8Su^BZ85rv^k|R zWO8~_q&JQ?Fwo(9Tm_?02Wm>R~GXV-a&XWZoms`-dme_tEwpd;i(xtsG3NO z;D2Rux&tswV^I4*KV(JnKwT5c8snPqFqCkeJ^gzp;YuQ>x zX-Kj~J^NrA{qMiWy0o4|jS~B!R7@0sFi(Y6-HY&np7(m<@YiXx>-l6(W)S>DyEU(c)V<2Q?C_SjK$ik}O>1)M! zY=g;D4*VmSCu*4uT3#^x)6@OowscgC!X6MXnz?b74hrc9G*r+^WwS;{$ep+37u zWQB9MMiy<_Bk3-lYQ!>A-OQ>C7)Ci$rLeNPu=;yzgAE{}{NaQYMB{@eQ4l~zh;4&C zoniL>52MI;q=fg~pbx)PZv~y`J;MYUlRgySJ*A|_+dcFtV_gObBpQ(}GX%^i9C$Y)sy=3wa>Zt(jnp^G{ACjq+$Ws4T z=isIqQ@TGWKg>jYDo-P5q=xVmTCkLqh6`Mi?(xPn<+8#o>Z`v09$ZJ!wjMqmIyo5ePqf==@*hd)`dC`T(x>?8 zZ^Qvh%S5-lIA;#QDuGmt4B+YCDJNlFR|&tn#ykSQ-HHUk z-jr5V@=K5BprD?b9RGMkdf>2xfz<;H^66W2djeyQK~fMt5S;;ebJKlkF+-6!BtU8d zg#A<3_8IiO=El65f6|?=i7o`;%jw0;;fbg~xCZS6E&LeJJ{S!C8f!2dz8r8&Kn|b;RGK2Xbiy|JegW{bOm6sEDOyO1QvoZzvz}q@shT-@G5Ag;kd~rcS9ONP| zd=f~kFboxekU~00189tPBcgSn2Lm~9dlF*QWDFUvr{x~|)#Y=~2GE-Jkst_|ua}n~ zAXlbvupjOtPd$@QdDO&O7vPBmd2dWiG7=EPvn^V8tx*ThZ4j&_6S6ZtjHpT(j#*UD zpL|*{of;M)u`;kJBtUK9b2F6csGRf@B4kw<{1NgjR3^EDz8M5pWkDfSS+RofBomv% zKtXC;dq%_4Tn7>8i~IXOBbxUu!N4(%=k6qE=$Sd^)f>Db(4DZ#x_^r-bj}$B*J^2b z?`Xq?@7IhhiXd#wT4cAJ%K)921&X<9f4lSUIOxKvghBGgf^{baJBI^&aB*XUC=5@) z5vBS*kU+fg4< zBW@BOdZKaw&J19Q{hNgjZ6mKx`~m~=1Ivb+{5?LcI?^M^h{SiIM~VrgY$q@Y2@#-_ zi}zW&!TjDk>1}C*FPmYPLT5PqczPc&W{!}f#Wc47)}l_`;gWx5z2;}3nmUe7l`gLW z?)n)aH>_m+1l@h5MY;~5(ilyH7V>ErhEjIXFpUai9FLxS;DDGFp%z#`^az8vGF7n& zH&|RB0^K@SeN(VBP*;c}GJFAoL5ZeC3+hv7naHp0?k^CJA;Q|v^daA%7_1kx);j8$%DS_BZ0%reSM&#iw9ff_PP+#-k)q!`6A>ut{xqnI8CcxR_JW`VgY9^ezy6Uqw z@aDWt1VW;*n@+&GsO~ifV8X^61pvA_fM^K#6dkjSf86{q6L7R6X}C-b6mn;ZA$r?6 zTDvF(D!atcCRZ@LlYL~!)}%R*FQUf_#GHzUQ`)fB~6Kdyd;;~+8e`C zcx;8H-K_O^R4WZR)G_VDKl)6nkmH8qGHw9^Bi5+4Sh7_5l)9O0CP=ddtSd$Y3E@qg z#$c!wQ>N^uP8jc|#2(IL;Mn;rN~3FF6yyI^&|Epz>0)(T}HY9g+O}0jlXhY!tnk26cvDW2htfJ zD`_&6OPn6c}zWsN|ocE5)w?8Bl1EPtW53>`2m<6b>Y( z_a_8{L^4Wwu*9;rijBP|&hu_xG&1>mqi00B@o5N##$lO&*j6y<#|?$ir$wn0MR9-` zyTzhHHm>xLrv`%DpEGUTq>6(z*M#%+gmc9IAItfg=Dz1{TDS2R#s0k;jS=gFFQML9 z1B(d^!a!_cCXebyaOJ)24>=rZ0H9&9bAa`U1A~M}>lho$_xmEPwG*;)H*kxkf(ZhY zyNAE(&K(dt2}??=`mF3^J*F0yAk?}hdHZMRh>Ae5=0&szWN1SK5j%EGuW>Cm`%NqR47?VNs|#Gr zj2}F~iM&Z8-V+4uMuSXT3oA|C2teWQcHE9B zJ#pnaSp2u$@1{P^!RhV7b%rZ-mIN}vVG=%$6V%;-okg5ub3Z*L4X3KJ`m(N2z)7Et zHFH;5n=R5J8S(nvFhP#=o(4W;S4`$$K)r~^}=tWx1{1uSE-NXue!gEdVbm^W#B z5o_(^o>BS%_E^23T;Y=-;L;umiEQ!qJbNfMDc0j?^1$QbblpYey0^{qlF4=fUf<-a?7vLCzi?G?un z--Kz!NZ(jj!2q3NnYn??6;jBEMP#BC z9W7r-b2}#ozW6yjr}i_^r7oG?c(OOC+Q%*LVY3%j5TS=;4U#=KQ&NhW%EGu3eT{N=VpdiilR+hpQU|%Kk>r`QYIh-8L2BI{`ZD3U#&7;hCk2$oHu=Jd@tc)E-V|hI_ z5_zS5`wL58@${QRL6T0fwDBnl(!a07@RmLIdVbA8>j@T~V5?PYS)#XM7CS*eAV5!; zD#Qqe|Gao}PN)d6Kogx+6`G1HE~jm1SBI6`(aiu`o4FZ^!B`u6sWzp_fShBMAj~zcv03;7ur^q2JcGJtUO;#HXD@5~rKh`?on?6nwDx|EkGn+>I6? z?Mg^w=;*rQG~sc;YRFE(JoL=7PCXD`1CJfkO{MLtUsZyA3{+F;V4wPbY5p^Qqgh-v zn1r%Xa#vbhq0l9jLCr*xP<2jm(7?&L1LLRysO+KKZrj;9ZTX;C7#R7Bf<(Tq-6Xaz z-h4HD#|7{&)tmN9={iWmZVe9kazCxhIm>JN(HzR$-2wW4-$qyOu6V*11)O7!uk!S@ z3r0;6+_QkpD<`cPOA>J4We(Y%Yn65V+;$O}o+V&8y*4;77s?vnK%Y0uLY~QX|utd~MuhzYDMEaecqCgH+N` z-iJK(`msqQO#*x_ZGRY$8|U@H>TAGguV$FonN zN0{dEH@Q0ss*CU-8B@6Mn)?_6wR1mzT*7MZ2nT5h(p(5 z*Z48tI~~Y?5M*;c6sotTHH=8PsQM~=0&wCmM*dH>cwlF(O~J#P1a8FT4EX-q>bS9_ ztz(8F`_?626R(OB+pd-bo~FW({Hz|cvwM! z0Nxd-m%5S|(OG;i)xNcbIVi{cZ`ZXuh? z0OzPvwO`#w-PWNzuBHc=DN>bE)d?;-Gp~!RxVxE&RU6raf3c@NEc!As$_}>@@Wi^H8r%gRUi@`lNS1)R|3mpt~gb_PX zl4N827%zmRr-(3dBP?CwAD!2*Pp@{dbvJ2k&KhQJ8hc$dOmo$WKf_?QtTGLEPp|4; zz}Fl=sjbIRH>H(4iT)qk$wLjyrh+oc#Cup$NVaFEFj^`URI&;am!oPqHY&z}XA#P( z{0G+TKaIo0d#_mho(EIs&u_QL*Hf3yIe*B&y)8fF5LPZh%Lj$mqY<<)8f8DWIZAru zA8a=q12FJva-=uQw{F&Tr0gAv6Yv?NicZszgEpg|e7#s*VNusAU?R6SI?(>w^j%{xqd5G#*Jw=D$KUn3!`VX|G zj}xKbpOBA1;&(p3o6*##S4e!Nb)7L_MppQmYe%_c)H(xjWL(HcxcMN#V#rcKKr}KL zNLK_yI}FkvC>R^B3bu9;45!4gn7rk9UKf6#ZJ^Kwn2=(Qu2)*)x1*3RUK{Rte&#%K z3*ZHZuBoFF;ru92nOK@9eVySuqL@fMbLshOnZlQg1g$9!CaJ|rAMB7!LmlQrh==j1 z5$LID(w!;jOllA^HKfy|XX=^ES4;xEuqv1m$dB%~MJvHB3hdwTj>^ZPwZLg=Gtsd5gM@N}iMS2Gxi3(^Uh)f2M+TR-`Mk<-Z zAR}`y3^GlSA_`A!z~~a151I3Ub|*@7Q7z6kIk|*z5&AHNJ8gM~?hX#GPEj(T>+$Yh*df#7az&!Cz3(#MvS>4p;LAPonsnXi_8)x zxa5MzmITIR$lMtS*o#8c%y{+CHGXXq3+oMv3h$t(p6B6_-LmfNsg2_j-OoXgKTCx5 zewtJ=5&F?rwjWx6I{H?9pi%9DIrEw9s7yqnU>$_Zu)<+gjLI&Q1IQ5$uz&}mh<718GV!)}Z_#;vz4iY=lV{L9}DfyJzw1puW zjaM*LK*|8ee7>@JZH=0O2b=bVjy{I*tRpD$OfRyobMicp^vj6{G9$Ba7&tPqZ7GI5 zWQ_7wAAc$@n&3~i^QEAO$VZpGw~#<$LP|~brm8iKUCmnm8HCX~4q2w!XWi!7K=e)N z6KHXwgx@)a{aNCgJM)Z?ZIT>69Ao1!6pNJMsh9?C_UV1#+=2p>SPm3}0s~k^I9)hH zh6hx|*^BM!E;t~z;0hNyFKDx!0+*5s(v+BJk=H?^tRFfg!W|t=cTWp0Ct~;R#KVb)1)O6qicZ^Y=C+H} z0^7hsL1FNEMN5J*j#E+QbEbv3-dFE*+5JRJE?M>wu58^p_ z29ikOv7|d9G}FF~wiA>Eln}}SE`&ato@0D5)KZ+ z7&O^rOCdB9pYPJ}o;_(-uY+p+?+mx0Fr6dJEN@Qjw8%V{xCbaQ?6-E@Ey0G7I7^$>f#*t1(2M_WjbJq)T(b??{ zT+n)w0qH1n@RTUr8@2oL&r&gZf(1fxE8(c0lYp2>l(lIkOthD2MV3`_Wk`~&O(W&e z2!R7jf${`spKWEl!JhwKttLc+F9^=<#Cww%zIh@f1CP)OJ@St*r;Gx#A|=sUScl8e z)*pj-+KcQ+*-ZUvl=;GdT@3?{p~sp|czhi6>>OX94?gCCq=>s=oHtOcfK#<-V)DA%O1+`cm3r3kmvxB~dAb@KkheSdp_er@!qR`e1IRk|z zJklEg+Yhm=9} zZ>xWjkhu+=%?L${QS>u_%)MM?7qq+?^#!9^^8N++hp9}iIiH4&tBkC2WP3sZ*qVm$ znw8HZ{53(Wwx-zi2aB~11@cCW5o&@ar$LZ8`Ab=(aS7efHD4eN^(p3xPe2Z(gMj01 z{q8H+cvGs734kU<^}*4W3p5iN zG`Qh-I0kg-Gb@^G)1~UKl0arC2!YlG%J_qX5-DLWuw6eSds6Adpr;hx*y%;vQL))Z z6CH7eEKFsYf_mqS^mo9dC!w_>YD(F2kCNAQw4q($PZ1KC-8THk=*0bU=wKKy0XP~W zctG75Ff1v{d7;DfkRDoh4t`)PttGTupPRA>&Tq;fUZz+lM)(IZRfC+UiYQg1ZAcs$ z7A%Au3v!>o*#2)N1{%6kpmpxc>zwLGUiPuSO3wPlZBNIZs8W+}>8RxE@!(%0K>uKI zkIO)Eg7!-dzzx#jKbx7t$ zn4ux}Gm?0=_W_gOr}83`iMAm$4m;yDIh(%Q1F&~(#{h~_;dJyA2)lLE*&uA|YWLSyH29XZ`wAvjGwNU%!_ znC~O5@R*#MAlDRLr%zyJo?0!Ogu$vYqOzIG?ZM~kD++Z5Vb`%4!6mM}QXw^VaUJ$; zgk$`E=oSPqK@_Ln6&S-a=zVk8TjgtBzEoCJc|{1u$4Wp3@5m>0*A`*Yl`Zn#pM~0tr zJvM1DM<_wfMba}_5*PII1lr^z@;nsEAmITGQZr%KKDdL^K6Q%W+Z3Q)kS zUi^5@5Gs&hbTp;_>Vp~f4-R7v*x+IQ>1Jki0N>%5101dpa=T<+bI%qY03FNDv$qF$>=@f_v>24p~ z7hl%4y6k{qfb-W09pi%nGe;&1)=!6uoCr?c)%!*cSD}4UBhoXsv?8)I7}6Q7#=P@%adu?D%Zr0978&&KJ{55`PnB4q1`3TUe;PnrMg5aYp;%aI zrDVNoq>@NUB$8zi#CHbmuQ(x(CqbClcHN&RMwi&nKi~f@>n`s0$RtCvReU6pNhPDf zUY~D+g#3vUKF^DOKLDfMH)el8XH@tDl$R2gbUeAy;ejb3O&Ry40gI-ijOf)ec>@Zi z#Jo_#%7Q|QY-ptwWTCNw7Y}uQs3AemBcwZrt086{yYt+fvFyn6!}9*o;}VVra|&FB z^9x!_kb_-3jC07YbLwVEF%G;%ou4U#uyFwp$kS`W9aAZa(mUlM_;~oRKN_^+A^Bs9 z@moakLGGTdP#v+XvMn$Pt0o7~#ifry^ExQS%ML);EJaC4Fi-`3Bf%lDfp$#26EDcJ z9%K{|Z3bn`>CLuVZgH*Ztp^Jl!C{MmFnklaBQ=b)(U@EWjqA==vt|=_8xqI#zhL%! zds*5}p5(P!@jZ@cgUy4?I?PuH_}`gJjyv!ho!-&PHUj7pa2B+PMzk6V@8t--4BFv~ zXSk>Fgi-#)vkeIv3jxp!z;U|hl9(rCafEOjqm1UU7|Fy;17#xsrMpnwgGiKCFuHMS zo;7$UBNvMD^wC^@Tc9?&@6r%O^UDJ;xdk-fp`9bRE}bLNd-#*VnH#{3;yDM*^o%K; z2WCc7Vo`_k<>jqayZ~*3w6i(j#6mm;W2t*i90pMeS(aez^2Dw22Ve?j3TAXo8OE+` zdu}#CpsY$!ILEc{!HKkU5yhG@7>%~fclM4)93zC5HPlm4<9?8o@pmIR-tkfm-tZa4_f)DEztdhy$L<OExCs7 zrA+&TfET@zR*kJCk{POzY|KA<^K)csm1TD}1#NZ`2?CHK1couOXLt4P0O1_>?7fca zkrwVH)@e>@2dz*;SaWcC216cT$b;da&QU?f6dDr;N%@Dq?2qp+>IBodw)cYQia1|L zSYyTl&~%B_uX7?8ZDtv~(cCnJZ8muG@|EY}qYZ<&zDc|QO~*>Z>dAd1Hr5GPUG>g5 zVhc180mpctTH*rk!V3o+p8oH_9^Nl6=QhX=kvf*_c-Wa>5o7}AS_ zR+^31EK&z#!$f2i+0Zy(4ljNIaHLI(R!Pyphl6>s3t<&FFnzV4i&hq%xZ!T?Ayk79 z#L&#jOiEs;Dq;=w(Nl^O#LwNtY~NHBG-`~dJ?%Cp zZb{n|+{A_hM4*Wh?KA4M#fL1qOphi4ffD9J%#`S9Rho11?JYzn3Q#~SeD!reFIJD1 zMuVtBz%VnorT!xiQWT2_ud2gXMQEXs%DOFxRURQQjL6i$Osf@0!t2@+d^Rpv>V=2I zG)GK16qn-i%F`h09c@mhzzAIG$oF7bRHzv`FfuWo5v!o%Z8k9DK(I^?%rGwO% z7YWj{gzQXkjmAR!_I3e+mXPTb#uF0A?AIMbp@m#HVl`d9f{Yk8?_tN-Y2(pUbke%^ z;J(1z1G!;}DY7vZiw*J=ej;O4tOPRenn$83V@b(q+65q15;9%9^k?~PrCEPkwS&$C zwcs7WM&YQ}O61Q*eT@3M(9f?a>;*Oi&wM6UZ-9Z}s=1KW zW)M8r1xVi&^she)6BPz=F~&Hrax2q5h+_vKOq~blp5fHpRQqWP=G6JOa#{j4q?{Lv(GpbbJwD_~#(|=;l6vC2yqh+#< z5YEO^EX1dTgKLb(P%_kw7!bLKf#8A#kn;90E(BO~url;Wwn%S(*)mnGu7Hqi_XT0s z0Vh$QqMBXbn0U@Ccm}AJ#$c{^Ri=iYOSV`q>xiKwi(T=(}U>{0xOysB6s=mtg($ zFs4JIMA=(p;ux4Q`;Lb-z*rL^C(?`qgv*78w6C>*?Vk+=vP5TyyJrq?>%hovdpaz% zsIzEu-th%<(E{O1laND{h@-z^F0!R_u69!y1qhhIpkfQ{Nf9UpC|>`Y74@#6mp$uf zW#|<#3t(PB^2KF5P*;WE0muvjtSk*q7y)u4wc_mW=KLwB6KO#--kc&Gu04UG_jBpc z`Ht$om=ZwYDh}hsp=W)bbw~#vo|NRI?46Zih(Qr>x1@aZn82;aDSDtqig1iK<^a|K zSsad@ApDj zVKNE`*g=4Gx|lW@)Q_zz9rJYiAsP4thS0&SbcaO)q0na>oMGC9oe+(wbPVmxv0=1O zWvrE;!hP1@)|ezZFuoaA{u*sya8sT-&MIp({QWeS>aIx>glA5OM5593)gs-(;=%b0 z3>+Si!t=&$-wxp-@Y2$KDItMd1EZ9jaK(CJiWnC`5dsYDP;;a_yqKZ_1v_x~u#}@p z$%zRwDiVSob;%*GC{U&`aWs|N8@e?exR5dYgDNLWU#XcxPC3itcRuzm`a{>HCh8kY z9rHep;!Wx|VBXv-<+UNUZ_tX&pNF-=@GGF7^p`$>RrV^XD$ikn3MHo+&1Z&GG;wCy zs?mOAeGVJLUG_51EFuv>kZ7zgju#>UIb^3Di}ch4@lJ~{zm8+vA=oCwS|x$96SRcb zw05xB`Yj$C48fo{!}bl^S?Pu2vwH6XC%{9v~u|v;2VFh4CJfYNs zK>cgOq2e2WqJhZ~Ov*WMO#t~B#!1Z2&}(2Mi>B61ZpzUKCP~|vg#u~;=S{aEP6~la zbDa~C3!H;u3iV*A<3q7X?c*1lW3cdbo5$QgaS=xU+3cSM@5_7tsdHNyB37oe$znCu=6%j!t))3=)v&9g0Ri#!H(6+iU2fdG50$ygr$A zlkWLR(a0tA^?ZC(equ*@&u0R$GH3|pMgiJ_A=fsEf+_>lVtYdL3j_94l5?Qsk4FY* zqA3X0W_bW>1FQ%nkSo~TCqqLUKO5wCn}&(zjpJLr-_A;?_fDRzb7q?Z^1f=LD-Xw^ z*KC=Ck%2P#IzjX=;!os)zIE5^{y*9L^D{FuGcgeoOw7#8%*@Qp%*>>`uW2xk=?}~w z&wgEi?Ct~PKw&0f0OS-E`@KdpjHB0}U=xBxm??YYP^k}pQYz{p@A9wDVN z2%tPPXCd0acTMc0wtUb`Xw3zKAqbU^Ffvj~ZT)H{a>pq^c!Tc+TJH#o>G*>Qs3 z!oeAWa)SV4z|1B*A&5TUc%DOOa(2XeRXTc}xu+I)I-4e%UDj{IT5qWn_>xI21WK={ ze(aNhV1ZA*x~YTtf0+UmfRc1W@LxIpGV-NL&H{3;xAh+r^)vp47oEBO=JmWG{MvfI z8a|K4miN&H`+q4k3mT>>k@(5m_BD3T1}%Tv&h^~n#S`O((qPx%@;=q!=Jzx_OnBSC z-z76n(GO(KkCBQft_5sSH)m2yvA@Uod`JjM5TE>s(vYPvP9AEmr1s{Ir{pBjd}uSq znjY3qQ5=`^BOqmCRx}k20tFu3JFP!_8~RR)b??nhmwPk25WU@cnvgx4;9)B2NgEx}CT>h57t42)9c#_A}kK7u8_vRC6@zF462OVlNw~492 z9tD$8(F&x7e1b{)+o?U9-Av6&&3j#V@}-Tb=&D2y9W(T2qI+hUMu2p}^J?!I|D(so zU{l`jKY5{ORu+fN$8cH{c#fJNQ_;E_c}DHzWb@70=m%BT#%{AU$n+nlkUFTVF`zpD zwCC0l0+4HU26Kq#ZxG1v%?S=0qhqu=02tubUlsH7ZkZiF#pYok{1+f2v`JKv;aHyU zq>kvNYaXZbM^OgX2P{21V;1uHyZ-K{rt-3Y+~q`%f6dg6Aa{b5R1zGijDnzub_P2> z6KJH<$?m*5?{r>n4#r8DA^^fnFvmBfCXa)?)elDR9%!7_`q!B72dBe7IY?;_AZT7a zGBpX03y5H5T@_F=o7N^yXTIz13QIixlU};ku#JY65zKz}!#7 z?U^_?tQo-Y>j!|tGY-ghJPtn@?oFx9n=-sXw})ZMZt$G^KJQN_Dw<|^+r|&OgD;%a zj?B)Gc^K$5>PLxprQq|0nwXIxyfhw!x)7H!DW*PMR+o2@m6N7_EV1(Qn>;g^7-eN# z;BP7Jop$m^)!xYOqrd^mY7u~H{FM;_j6*?QCy?~}>aqB-Pm$dA5t?Z~Goxx~w5G*e z(H@7CW`tR(JJ4jwoMI2I-LjV!*{Lv(+()0JWxwI`^MM_qkIgY0hVGPM5u*oy(1XBe zMqepCx(wNLagvLCm^ivocQ)Mtl;c}pOqX*MVpY_#imGej!#gWv#2;VWL(kpa3Z|*I z{R^xOL3p$CxEk7!J-3r)70|;9?)Xl0#JKqoMJQcu=RqPvrGA%E7=$Fc$QT&C1vLTl zOy&aXBJPG58FV3Vlde4c-+7DzCtmKU{uEa;5yG$3z9yx6Ech} z2&xR%j{#p5@|(KbENIAWGGrs?Q3`?_9jS){MIfb3OgzCV8Nt~UL5JVvLH4FjFP4oL zu-vi`OD?Wni}|H=z`QYHmS9$)c$_9kogyh8T1R;!^(0DCl%+ANu&LtVLjmkJ9FVPq z+i7S+!+ma1UAbqb^*E`?O_a?|g*8(tNI{HZaYj4$qd}&27h|)5Mr%FJ#j+xG^qhIy z%pIMQno~+r(bsN%Cq1z`rI8r3a#d8AW;BAN7D)-ZaO>u@<82`Vf{=|g(-;th+gYcw z%DtVHRaJ0=AfX6WSzM(nddfT0)R4I|=$R)-@uX!0T(JRZ0sDcELjP45JG%|(jp%I@ zZ{jnS$H$aNz+f08V6LYmyX-9Ym4-w9*A(mWfRXt`XRrcRHyjV^@%a3EP#N{RzJW+B z?0>T_>ggSCd-^J7VMIrecjs}~9~j1Zu{d}7;U8DZ2mwmwNWuorOAbuY=F!c~Z#<a;Kc!lxV|z|+FAWl-!*e%)6aX0f1b z!@?h04)P9VtwBLZREt2VA)?C!N8GOVrzs@CB*U=PL{4&gd}tbg@^Ss)BHt}0UTiTk z)J=lQu=votaq7tkICzpt4<4?bo}aMx=$##CpfjN^zQ>4Z_Ui7!yG}_@}j(UfW9z1kH5WK{z%x~5Z zT1mRlTv^n!6-;1xF-H%9a!klz1`xt=(n0^2e!o8P|3x!D=Tk%lwbx)E*=V&R2%13? zX{6FD(^+ViQqPQM>G!V9OIA@&-u!ZRY}m14$$z1zH#8iUhsngf{LWUarrTD?(H1Pr zXt$lpSz2n^th3KJ_~q!SYelx!*t0i`?y8#o+p{65O4Ow-RaFhWn&&RsMW%cn`Ogwn ziUw?TmZKb8McFygnRFRIj znQVz{kgYPrR!Oxiv!kyvZf$EXG&8JZHJY@nrFFvAMAEaHw>6fTX@qI3Vesyr=<3fI z+#xKbDISh9wKmhP!qeM7<>qIWQ*5lYvW@Apu;W^5Wo)fYrta-&rBZ5DB*d#|wpOiG zqGFlJ!d8~1ENZb3?QXlXq|w%HH(C{xk%Rt{HVr4lvdgLbBgJs}50lQlHM z(ewfGfy`(Di2>s#N4*=we2e6L`~cXA?^Q@UqIqC41cV}~n}u$0>lDH@8Ao5bc=x44 zOw&wJqK#u6BDH;@7#tO{+G{2qggf*6{%-=>Xx2n4ecxx|&mBE%mfAxrNHYT|(Yp#Q z)i=xw+u!d5;S=gH3Fi0^sNfC!JSxyF$Vl!6(@rn64{ZX5UP5)pwwPfV;Z~`jq|F(| zbq%xkqI!8D-A!}PI8$|gukoC=MXQq9@2=`@cvI$jDqlO@OWNvb6F}o^iR_iM^>aO0 zzJH#Yd_=)_o~UNsJ;>zG0eB|OTwSds^=8dMO?1OW_3*lceN>{4j?Z?lKB-Dll%*+3 zQkQ9v9TD9daGddAYS{yUh8RRJx~Zm`QkRp-owl|2fi+Oar^+{g%y-QJ0PpBF0epgC zZ6Rk9xQGcu#Hb~E9CS|H@BD#4rekI+L_RPRk6uFmF(;Jq&Wbs_ zUN!xJE}0?rv_Kzt;~c;gq*H>kzQkBZGHSx4%b=w3kt{!_mbzpLUsXS+F#hs{jFs-p zl6$D6=UBwztsv6UNUD+&1S93E{+Dw6iyq1QZ1#rY zDnuk%9YVoU%7FqAl^^i;4q+iW z8jX`L3&Y<%oCV-K>1+*+Bm}`|5p|d-{X@L-!13nd4d;!DQb3Bst9HRagW6I5k|O!# zPaie#H=Z5ka%sDuNKSR)MJdb8i?B`-0|B8!udw50_l^p~q{Hy|Jv;POWkO66Q^fD+9e@iYXrWk^UsamPNCC|;}v8Nj&xVy`uZP1 z=eQE)nUp7#HMr#`Pay9P56qFEQdQ9cnxM<$Bm=<1O2Hcir^r}Tce_Kv1xOyBB%QWv zddr@`5Mx@Mv=Olh0euPQK5*D6=Ydn73b&TC#M?uN9;0CL%fTV!W)jkX$je0RLYx!j zIq(iEbO|Dip-L1yslfvAP~Bs&SCe$^$#BkN9g#^D!KqA3VF`4G#7a@HW4nX3rJ-m; zh?ymmO6KNibIq<>dC4oxtm5Y_VW<S80s#W`re_BoYlUUcqF9q!QM>y6qXwU4xT~ zZYXtdLhKl8dwhexo^K)RT<6zE(0Sz1>fFM3n(%iqIwvIHri;mWF*$>vYR8)NYd%4r z4++u7nY*~6m64c_1Ws=gHc1%q3ijKeQIRBxAQUG+J2b2^Y8~2#(|Mm^=sR9LMs6Zj zPT4Zx?$w*ElsXN5cZu8>E|8(x%H$*m)nFc=H4d#aey8LHkNv(?*&blX zFd)GUNy>=7U|P_Cp`-nj!xxYEm++4#4!{^bPZ28AdzX|xmxE*|fSfKA;hb5X zbnnPwInUOZ)UwKbOg)B-F$*lR%PLlsXlasEqB$${Y`pl>W1);iNy#xQxf*;Pr(=U+ za+rOsD;?51YT{@%t8_2R4h&f3C=XgL4glin=E=_ zhUYfPsEnT@FsOaflCKNzl?8lIRLR6rw)ul|9Tt8Ujxbb9Lb1% zOdll%Nfovy{bENU2$DJQiAfZgOxrIiZYZe`PdS!Hb|BG^c8*1^B!5CjIfV?sX&`w3 zqyj(fiGztF2^CkAR{dDb_+qHZ7xqk7AEF#n?cu`xnB}CICL@q*OFP{8l+n~#l3J-7 z%p>R{=ub`gmZ19*B4FX?GI0k!s>#HrTECHNy)VT`uLi&#ki=$$f|;?l3~Tmw@fDMccX0@{%ve95y!O-gC^Z^e(i^7-eO z=y!HJ^7-eO>D}1r-Pq)Fs2ptx32RF!M3ki|N>Z1ncdfiyNlH!Q$x2>3x!un1jy%JB zP?$dkHn;4fPwqPY&$b`y`kj63d%pAWkIyd6zMo|I=qbXw8}I#gQ}lk>s*x$mQgQmEVKh(FOrEJ_>9dT#sRZzvgg^+!A>*3sBS2um{wNoU0GLRU zAU6KXF$DY=6HDeo5~*dbPdQ3E)N?JGAA=!Pd*E<~Ee#aA8ye21=~YaFp;a)dnE(&u ziHL#71&9=GAXHc1yG$7ThfrABi9Y>hVda4E5XJ!WhwhK=nZjiW2?;Wto!57FcXzhj zPH8^rH9^p1hx>4>B0ADfoC=A+Mu<*B2N)joLp1{m(9=Vgv+!fjoLpaSp{g$G3I<|< zX#yZoz}z?t9%Zghd+g3WX|A;>7y_>)REPq~s;a80uOFx7=a>84@_fTNkLzZN2bkkP zf9fbhQbrlj)ScFsRFJz^)MHDoto7?}9rrdXb&#GzL}J9&%RfgAyB3MI&#{q^jgLuE zlxf}C+jSo<(m&lI{QpT}o59u*Obh_@g?JTE^`@~5lMgslj5_!5DzT2Dy00xn=dLTY8@rKH#AmtD> zcGxkp8M_0ZmFd9OR8lDpQ>^MvxUMLo0TPA5(pZ#Hg}BoB_ZlqRR$6jBk{_AyIK*x@ zg(93dIO4ZXER5ZQrOWbsdxpB-hZ(K|z4j21&G9oMLJVwS;Q%U-51|Tt*i*rULL?8M zd|fu%ZMNIbADQdAs&iFT*433&B0i@fm|A8g=$v5X%OsyL7)K^6ko>4ZCj3SQ(nxMp zFl}Ljq|+S(5x5|LII$yyml2E5P?-#v*b_p$CM;wAdT8TmYT3KnjXZq&?X<=)Rqnr0Gs2Z8P-q(lOZ_7)JVZTqZ~{ht{;aJ;#Ss~O2*2U zW*BK0B0>TQV1_i<-U3EP2-1}a35)<~v?T|`??xNR*VJ;0Jln&}Q{qxWj7$n93^1Ff zM~+H)H3WvD&mg^r69i<0kWYPz5X4x*Acvw6N~DUC3PJ7x%Esg+Rfg{AXnQFn_zk!% zw{s?TdS@BTV*VR$wthbCr)pc^%|97!Vr zLPMe$%CRY9J8ND%YcBr?dXMil9Fby)x@Am--u>W|u`i@swQtVs-Dl4osH&^f#{8p{ z&GQ!Y#?jn^xYKSNp6q!nK1LrRq~B;&?@Z3p+aHY6tW~(flwPbamEh5d)Wx35Ehdc) z@+Fo<+e2DmY)R*q82ng~GKb23Lm;RH@Di1Dhbnfo^GP!yRT7;fu!ux!KMjPZ-EZM9 z*}DkRKM6vlk`fd0Eu3tY)Rg(IHc4C8J|6v^v_R(}6T0YOgCOp=!ZH#YXGuHGB?JFA zG|uZjbNXD~#IV_IdJ~L%AyWBa_`cN2o=GxC+e;L5{Dz}Q;8-?~VMFu@KZC>c+)UFl zZ$$3nSCIP>g%Hl|H6r_Qo{ef95!87&FnSGcY)&hrXt9xxs`oqH>dBeDX@;A5qL#hi zB*W?0hv^<0%X|)RDymggDwW;c-QBsnX8pXi=^(7|_8(y@2*q^5^%!Xe$PNllu4XZ1 z@6$89I}OQanIp8wL8iXXp!wn93CEU!qC=1rDeSsJ)3!`JSZ8pX=+$2FQTU&yo3WVm zz|ub00a8RUts(9zh2DW0U!59}sB3tmn~?3iNs4-+Zclxjv_5i#n%;9VH?>+pk>@qP zt7L53ZsU&b;L$t>#29QuSJQ<0W9>{7!Kpy#8W|w-8ZtiP&!7=$2*r*u={aZx2N2*} zue&X<0t{x%xFL~%YSzj(*2x+^Pce^^taIgOkw$&9*?f*=l@BbeLfdmdeNU%C$qCm9 zO+rF`!$4}=$k55_G;}yPYn8vD=QrQoo|BBRyEJY*h#~q^VdxM!94?}1}97g$V1+v+e(9>iV+f8Iy5eP?HI6!ro&9rAs+l93RQAtup zJH98pdUusa55w+l{o$h(#0dnEMS5e4 z$iD!P7YElo+S&24ba{0WB@p$89I6d+7V>lby0}}JYz^~yc4laU5Fr8| zEC&zD^f%{pe6QlyJzX7|V>WEp7iQZVYS+jg$1+POODKOKPqKT(G^8qU$s`FC`K7|8 zLZxzhe2(n52d?Cj5_In#dbNDsh_)?{N%Wo1bhGL?eP?;dd50pgVy#+uI?|_8Cr-F7 z#Nkjz4ic8tFm@|~u(B&yKmeaWV81T|(m{7H^CtPWFwP=poC_- z06)Xe{UfViKQbYvn36D)5Lm{irsIaRB{0&rraX5>w|BYh z?)?6(Gspnk7>8^tx9!p#-R)#Nq$U{ z7j+#wJway`jNat*CE*XGa)Le-1lAGCVL=Hhj)YRa}_ zlk zpg7h)#X4IZFfjT1$1PFSBSZB(w6SEA|Cxqa9{U=B7zBvNAfVK?jN;HfAMDTwn74w^vdmc)r4Tvf2JoZ5_J+Rxjw z4%yKC?Cjo!^eC7xANBsQe3M+^`>kQF!rF#ytyY&LVCrl|FREJw7j*gxr5Gv!IMx(@54P=gEq zbr%B_zuT?hIuOn|A|3X97UlE0}3V@ztOb z|MQJ2mpGtk*4=UFrxr(g?Q*0)314BicUU7SHda#+&10=YL`CPX&8XtOj@kcZ9tRdG zB_Etzz%R^$f%P)>FoGisTM2tSKd;U8{+@Ckf{#-mre{AkLY!oJe2?m7=*^TdU@@_i zrS>qh|Jdjq+)n)m@W^uiTp9Lo4$T%j^HX>z^* zT&1v1FntaDqcZhP2KzH|Jk`<$iLR7UV76zro-Xzs;+v;<)@CC zGnbzXJav|KS8Q7slfG~5!e6)VyrTmK3#V+h@sT>1{bv4OQ<>Q#Sjh&VyL7YH3ZRAD z$hkD@L#cQjZk@yo${keI72?7ATkJytv&P|#{Hcg_0|8F=1=9cJq3L@-auDiBq3?ll z6x)Y|fsXoL;RKNh7WA(MC-kvT2!U*1#79tLqzM@XasR!3dk+w`&L1BTqn31Yh@9At z>bEVn|B60Da{QbBKk{-J6HQB z&cKtuw@&bV=6c4b|7{(Tl{}f0k>pY2Vxd#%fPG?DqyxDe6Ud36{vcXhG8J~ z2YA<@_|PIxe{tY*5&NM0tR4E$9>4}b!&J#{#3==^JRbT`2~sr2?esxzlytz3aWkHDiNeGnw3i=>FN#8(lTqm8PX^8Vv}30nBX1mW4-E$@(UtcK<0qCW|PV?RUwlkIbU+_jNYW;h;_|A1x|r6+h*s-htVSbKN@>(q%Fh(Sd!e0V|WB>$LrhlKTqN zAm#jO2m0o@M;yuz;GJS%4Wh~Te*GGxFAXS37{7)V5B~5j=0Fsr6Dbn5r3*K1NMA(Z z6wft8#ibd5e!umxM6lZ+e{ezy6?s3y;V>QmWos6uK}XiMKn|fR8_WKP@?LtCr#QGG z0rey79PM(Awb~0?MIPSE+!m-g%zZWQ70>G9p+!^}hQO#OO6C>(KV}DR|A_1~do4j+ zOZYsl$-8?hh^l%k{@oPMbGdp0N~3eDY<>@ez2W4NO!anuke&}%ZEVcnAo{`AO_p|d zcXZzVaMRa|y0*K!y0*K&z85nyV#hJmYYrAJlv11{{Xz*^17=rQusJ3##4xd}Jm<0q zekh`b3mSUEP*xKK0UPQzhTH;hFp%^0V*+ceoUrB?=Xti_K}}M~U|`$~6@%>fik{zKdeej|MEIicM=I zt%_1jEi6gD-}vUj{HgZUne%}F8JOxp+@678V(u~x<*tDZdh9oQw}de!u8-Fj2Q%@Zgi z)PYn^V@Y7tPSzzgT7K;FzndgbpLK4C{@5P}auJGxAulcbZz%U1o z%OqZu*}-FP^C;PEC=d!Ch(rwF=jvX%lFZ=dYD z3hpPh;KpAMpZ5Px?V@R>l%c?FY&fM4iiWD z+bA=#aMa&!v`ZbqjCc^t4ip(g1@S3VE|+!sqhQO=Xue*M@}-5xdPwP|IH$J0AkGGm zh_IPn8EmpD3ccR2u$U$e&T03Qoa`UZK{pI^?$K*bK6F`ZXsNJclv=cJf33$)gq-Il zBkxo9FXZkQjb~}R>x-5Dca+t=YYv0AphpPz(t)%6FfX_#xd|L>B>nerS;R6?3qz4t z259rbpv;L#<@JJeOcKn2T~BXGG8FS!Ui}OPCwM3634*G#ATwkIO6OFj5se@*3|9EN z*`OpbO z0rs|89r|v|y>6aR{}7xFC7fM&$8{d}Z9{VSJl~jm06M_1dh9w#|7{;Vo<`npkq*Y^ zn#jxBq~#W0Fpcjt;l zBEZw%kRD(fbcz)zeKuS8-&<_}$Y10WaHtS*1Mxzb4_#6XJNoUu8q(~!3ZCzv+LeL) zgTZtI25B!0z+P3~{Ex&((5zx90uY3X2e^L-^8KI78$U0F2lIjF@AP{#pkr2m?3HMk z4-xkM&3YlHbh*h`A6O1RZ`;g~{Psk2+fk{1J;JN6{yaE?{kIhp{{X-}|L?%q^QwOh zhv_NmzOhsJYy4W0kUgYSXb#LCdf~tu(lSf zGGxpQ&F7z!$bj~l0KQQp+`Ybb?&Z*x+?vn3-gd5kPDY!D+qYU_f5Y6L)yoeQOwyd^ z_=bt;yv88@kv{$OSK_8xTSu7HvG+95h(;qB@$2vAU48)H?fx`Ax7PwHP^~H{={@3hLZOwcDNhP=pD4nF=$(ED14<3y zP=3qtbQ{BCdF|8?IWABdqavwhL=r$u!=RWF#wWp%%`e6fgp<*aypL?<{RyZY4{;zz zkoh~K>9CN{<;!lDy055Qfd77=E3**=$H*bcO*+<+SIdN>-hxq(MTflvC24H_uM!Hr zd4W;VAOd{h>q3IWI(Qk|+^m4i9E-13H-W3LL_3H*MTIA}4^MmcS)`D@T)P1d0AN?N zmzeW8G@}rnXc|iaEobfvRsuK)NY4UVABRiO3;|+J1Ig$y?{93p+^p)NtjX)oE;_G> z;TY_BlZykZBw-F>ca^)kSK0MYgXKu3gsJ`H(MnVCNLfE^N6z^zihB5KIcYa;aH|7Fyn%hvQ=2$vk^UA=cs7ppI5lC(A(T$m|>YCeCJPh zTkws0t?FQ8euIzU*zkaszR?*APr^1L#^; zwTg;m?L&Cd3Vj8r`K~yY3a$fI^e(KM?({9PS_yKsu zV&TTeLOmhED~Q+Q>g~o$)}uO9a$UzhT!Dc4nAVQTrL0tEIV3)zsU}5-aQ6w%YsDVg z9uRo{xqBV+%|8x7$e!VnL34rYr8{BS61=^T^A)p))38H9IU+%1(0N;ANH~R)+*qAY zsL3`bITV8>15n{D5d5zm8wY(4d}R!uT*drnritj}proOUW;2HShpM5XoxZF&&ky)= z`rZainCE3f{Z_8OvZDug@Yq`A&iUO2X%f2nt3DO4$!U&xW0dDbCVhVEex;?}E7!Rl znyM}*ftjf&^nw3Fc5K-H=lxjGpXRcJ@{F@oM_v1VT8pT@XOChH;Y^(l1a!b(Bv2n0XOu7>t8=C8%%e9^B5L_XCeQL%Ghw* zV;v~pZTJ_lODTd`?&Nj(C7GKS`4Y?h{Flt5!wZk`vol9C-Wk=+E4j7aA0}9PIFcG| zB$~V2+RjMn2x`t7psWg?$%NrzoGT?)J&-UeF%ej@Q>o_0X>z=hQ!PVM#tHSct4 zzJShC&OFz|kqaCSB4I>Z-%EbkqM?-1lSFm<_EqARx(BtB%B|X~jL4!gseNCbk%JGM z#<2E&8jF+fSXfDZe>6HTwo&k8MI9n^UMbNOR*EEuU{(RFu1g*+j{GQqV@PCe8JAPS zAth}M(fLOa_9Cba$}_Z+)Ve4W3*3egXyG4G;TuFFNW9zr7sMvXnqe&|S`(6dayMla zK3mM=Sx5SX4?&e_focyg-%Q4X zi%$`lE-DJj!%z=!GL1?>3Am#u%njhp1h!BTP^JR~MsSElt7Kd)FXe!9jbIp^V64@-2*_5oVK>d5DK60A}3^$OZ)-NR7_= zRIjp~lWon;LKA!{`XO3c^k87=l%cZgD;$8F`&vKCbZ77E|E80T#E^a}kAYx@VgEir zVFc1e-MI%>n0J~?sPI_GIi_^%n!clzR&Li)CZ-nOK^465e?jG7lA105lgTPWGh{7q=g)wAFu@+>$^1yz=$aUgW%k>zU0Et0gXNnuZIsS8z<;OjCM zl$2bCLjTW_5Li7m^W+Le9+83UJy$dG1V_$7kDYm?Rv+b#%}m^kRquWeVT|+4 z-C(~e20dFBsVTJej=}f6DT(7{j{|ah1wGNI@C15TIGI;o($>4bxee!}jz$giX)jAmi zd2kYN9RUP1QV4&V+x4l}fb(ZK&%5J}@*4;74-0ex00N)Q#jq@2Ixt;mNX3ENR8qqv zlX232U!R3PXOFwyFS);FG#>ty{<8i2c*!C{STcDU2nQISD}Em#pn@jvaTpy@h9F_u zINM((=FBi8A+j(G0MoyT#OnwcIvEo!i%}txmJ$d+$TcgkJ?WOr=p_*HgWhQM#9-b@hQNF@YBQwOt!`LAmkL7S?C)}yl_Y(HdrPCxbO1@UKL+{bfa zX~^`m3h@)5c|Tjq_lMJ#Pblk|wl%RE^FJuOdDOZ&Kycs>IKbZBXetW2a!B)J?C!q4 zA#Yk_nWN7ciRand&iM)R&zNcV7rWeXN;oM;1`X6tl&5^<6U!%{e1SW?a(FWLu2i*t zhSS!t_$2)=)cx;%4NVyxPNhxqmaV=G6>mrlJE{P^kU_cF@&6yynj%RTjFJ&W6@3G< za{<3LcToG$_M#!}3LF~r=p>M9Ku?K|LH1ZNL))1SdQkT!ot-sqz~Uv&SNEg-*# z>pYX@{Gsq<;2hJ=_I3u#^o&EPri&n*gbzsow)_%lfWmqlA_f!n1NkhFUV!=QC6Ok} z-TU%FXrU=be|N)5VTf2Cq}Tw%RAyN*xH&Fh5;J?6qhqY=JzZRAt|Bst;$-)2I_^9K`J?ZYsW(ZfeC;enZlc@*V5PrT zo6qq=(vZ9XpV83jz+{isQ}a6BSdYJDh{ZNzdR~Ki?Ie!*0Q|9ZPSX8Qa3lN24d^Nk z;21u6xJ+ai+49s6N!l5BKA~c!} zA3&eWrZ^)YZ*hOg91$ErSQFkDhpB{@{SJOVP>KZ*Bz(;16v>ox*4jUJem)SasM+9= zi$q3Z5QlKUL)g(p=eETh2?S>p`ZP57K%qJ0cGk!22!#U}Mo*dzBmCkkeK;J`*ZkCW zMM{#Adn1RVzr(@*7T>a0E4i z36O=sbhyM*GTc`YFJY(mi2xN70Z5sAQVTfSv`cyKM(6AI9vJg4H;`h$oR8dn(wJeR zxdq7x`0c5S_P2@9rUJg&L$KCJN|58~JfLPg{ooGHhHt&u-Kqp#Uo1nQ1`W{O33=e7 zS49U$I%gAwg`gTj!DHm^36Q4plh;tzgu*{eTuAnX0$Gex_GE`c0|~-2@FxD!9_56H z(DYkz?-v&fM&^tzzeeLoG}8l>-Y9s+3a z65$M+IKVi5n-n=4lkH3@Q~;U8;KP1G$NlOR1=dq6!T-#@)8r|#B=*O+k^N6*h~A51!~Cgio^MlnriRVK zPvTSZelM2N0!70P%GeaBaL87ufx}>bA0RkrmquwHbtgUMpxyZna_xaI%|A!vCRkD_ z2neRAbWpp8qZiGp)-Mg6HUdd}&PUa_4@3oFK9Ju)amu@DNlqp(!4E=$41kHoHZnXw z$SLus#}`jV8Dp8Cz>w6klSYrdG5D{fh1sZHun>o}F>*+i8z@SkmzPRPAVT&Ec8^?x z4FD%0rMThN`gzJ|?A;IS@Mi4TiEy55 zS9m1r6e$VPQXP(Q|Dxnw|J!Ho;^0Gh1|GaU><*FtE(Jdfz9@GPj;5^C{D=s!khBk6GSs8OFG0$ENOo->i-_`I zb_($ioC`I6ro)gBFt1?p=?{0bm@_-J(SL?KFBHSxdPn6?@oqo!EAK1#`Q=U!UD%rb zNyK7vrhlN~G)JS6VhRxi84D2{Loi?i3Dd`O_@uqiM9NU((uy0U8wxtZtyG0M%pbV2 z-WUiQ-$8i0DEC1Qr&m5@GHVqVx{v;^>X?n>-vA~}#@*kD4K2C1B^%sM= zF+Nx<4|x=WA_Oo45#v0sG@#d|%EiadjS@{>{GVyq<@FUG`F^hSG&eXs0%|=nADLys zmfNT0Oa}?ND3=*BjSd86 z0+|B_BM6{3$7+bA7ueR^5M$JUYLUH?GN861Bdvr;X2w1(idAn6rDH-(7_NYKcnEXcm_NT8cnTz|6vMKtuZ^fJ0H9rT7R zFcF{$ivnj(Ir79+Dx-k=~9bApTI|76*)Tc?4c*y-dzfK^5$wcEc(&* znDZXcu`QQva_JO2^xk4Bf@_gCb@Z>ZM(OdT6qIU|_aK=}t>Q1lKaRveZ-8kDB_-bj z0Due=NG1pLJg1;b(A8B{RkDcp?b*9M9(!-nmHAjq6(cgHS+xi!Ml}g4#WzY7qLmGe zn{AGzH`Um96nmX``J_oBcgNURZPhx#Iao>Vf(awUBEMopq{&Lz_PHjV(C7~|4?bs? zDS(4v;n(#{z$9lubw(TffC-Zjz@EtPnfJ6}tMFq9{xp%6H%x{m|D56m{r)-XFi`_& zin|DOyp6T&=OBs&u`q*kh8M91KgaJ|$Lrx7&@7C?8$0l10suK9ftT{=-hv2sl7oQN z?Wd6GSE-x(=ho-HEVJ`=g+8}$wfxCP z@u1+l-QUIw_ytJk^^%}31{JJRdRmN|Gdu-LdOwmby-AhGG$t4GW$wtSV~?f)NAd=A z676n$A7i@cgu?~zLlSZ0sf$|^_`1l5^Q4$R&T0ZGIJw9X3_^@`&1$lEeW3aj^F<}n zl@y$L<6eGelEwAEv*j&u`eS4!`L3D(AoW{c|&bQ& zdMr5~&m>YQ6pBS6kw~Ofve|65TP>E#nrMouq>@P_l1T$0KSvP2hj)|7}RaH_|RG;4Ns*(t&x0rJ_OprM_y>qoX zRFO&P$F0=|NzvFtq4}Jg-j_X`9nA*=j3dH5JuOXGOos@!j)_Uriw>~qt}d!|MI;7A zBvM%yM|9JG_44c?J=@6VWL|RH+<$;C2axD?aYRfN)zZTSLk9ZjoQSEY8}P71PM(03 zRNT%B6eN$5XvveF5<)6K04-ps7lf~jyPW`bNysD#{zUPt79-IHfb>K}Y!*xk6?(q! zk!b#&Z%al?=n_6qwk0+oCSeQ>^8;kaZYeL)3;TkwMsWFirxN+7`QR=>&Ic1DAo_%Q zwDbJ3=48K0TTM_$`+~JE<;(;Ua~jzoFu!S8~P& zI!dioOjsaPZ12(nz$ZwETty0l_pa~@N?!DVg-Bu^8O@;r;?vF>eUz62suuJ`P%%D> z==y`ZeI{c;v}HJ;C3F;)DuR%}I$}oxwL+3oz;WDfdBG+k6eUmCSOu6BOtESC+}-DN z;o#j|EL^u8%F}m)#k6xzZ-Uyk7j)`ve2>#Nrc#upDL~AN_z8uOWD#j;y_o&%e2lma z%EiqyBbE-P!*L0kmS30G{?WR%zJF=-5b+7K^TK)aT1=>NH!ejDkChb{FE-^v!n;98I3(-nr2L$#*2eNKgTg-6E}E&p_Uuo%ZkbPjmP5Fep7F3 zt!eF(bobKYq;4h|n8Oed?ArV|nZpO&85<)6RaD$F56e>}-!MX?#W&?m4GT&R%+1=l z8$CA>^k6rxN|e|b;VIon?4>sJqLkoZ{stDqi3teDsrq#zskI}iw|wE_pSx{-)+$k^ z49Ux4DVdryAK=Z{nNu_a4srvB)Uv5CQrLH!_cn_UhS+i6&5WQdsr~=#gl2)kn$`Zk zXzhTgf4miq%Kzl8*HzfB zoUdY)=a^)(pAYKL-dP`SoBk91gTcV@eeo?sEn6eF#_C!>re~YZe5}K!q4Z65b5Ry3 zfu{sU7_WX$tKcYk#RP(WQ0Ke7h8y^N(ER?Y1WXiA@w4>}uP}o!r2v4u;G`6c3QDQd z9_6FWmxUFAqVdQ#;d$p#ut0$AP!xY=mWUZ0v z$JkB#PCa-NArmA|R_h({@9my+X!R+Q&aoVD1&UNEMluWZVEmcA6*D9^kIx0k4685w z+$*CBlfV66oYNC0N}(iHm^5hKYRn(}Klsh8@;kXaj|G`(mdRwK`qffBGoz~SCLL!@ zTzk8|tg)0Nfgq;vjQly{MUQ2Sjn7+sxo`LlV%zP=jHv|oK3~Oa^24TP5e*_#9_ZA2 zRZY)| zQmF^{e)t4v`~64A)G|214$K|SI%Z*;27$sa$=l~%Z1&{^|Enew?*ASy1~KTLWp#d! z2_eb^kA&q0xWb7M?*o^vw_YrM%IyaBLhhuCm-a6UKI6 zlT1N@m|?^;4>+^*aOQoncyIG}yJ9&@r*fo5fS{A{={uv+q>c4%3?iy zRw}u7cYeM19Ns{`{cytg|yScz-61>>@FF znY)OJi2IztH^*(@HXLvluP;tNqPXRoO@U37Z~}rKHUZKOzJ_#w1?T;D z!~D}-g~ib(@4T~RC_;9gc=#yEgp4zq%;xLUr*~#r=%3~g-|<7L!Q&(bK-c5WeRlIf zXe3|AIOUefirTSTNvWbM5fYNiDUxrd&7Ee=;jHPjTWc+?CALu$D{Pk1HECps5&(oF z7^IR4oxUfQdOaSGc7HFV`Mzfu^+L|uT4{91g0ra8*e`7iSnIecBm@_^e=$0^@jA-; z$ar#kn+9lQg=nnrA%_xP(PuT}37`8CLKrggY(}I0Ca*wBtd)(WnWxPkN(3@Y2+JIA zy2U9*G5zIv4#t|w#FIKEE0ECwagAoDGsUCnn`ig`OzNIHvOEJgf!yItZKYa)j|^Cx za6)5}mW*+b>;CL_Md2qA-ONo_PPrYd>T$`65foO!bS-#`Y~0{}74$*)HkONW1w}*$ zj;6isoVm_$PK1Qs(B;mhRvf!b612&I69FXZjY%(YU1ocv#w1MnoJ$ML-^m5Wf^8qU z89+>!X5!#ptJMZWvCS>8-bZ)!&kKTpxHMy+L89I~apT8@)|5VGGr-Le^O=23hz85o zPS}MSohv~^Ar$qJu$|r9w+{r(S4`#TIv5Udfh)kE94y9uKCBITwQ8SD8pCp}$q$md zJUl!q?#jEe?(XjUfj4`6-aAcaZ3&p(XSb^Tl}}YX$1?#ECq1@9e5~0}e!z*hB911h z^=gD62w^mnmlbZ%fO(mbG|c42Y0GQ<43vZEU7u5=>pp4oq+cqe<@)m2q-_xwKBGvx9= z;=W0g_w@=Q{bxKozjCT{XdQ{wsMCwkyzM9Xcccx(SPQ;10@+3`? z3276#I3^PbxiU)=H0(=F6N0fRT1bQ1kXC}kq@?C?u3m3eIGhu5KuzzZu|^`62&%1? zT?dWxbk>MA=%XCya4-THr<_lgE|5+lGPv5wFq>aC?!IdPvX$9sa#^%!gdqh1pg@`# zMmOWOf_aIQAi~(e7{u4~jCF|4;Amn0O9A_R&zH+>v$or7ZQE_NO}5)@w)+vC-EH4` zJ>A=H#2CgcwXJQo+ikbD*f!SNZcVkfZMNFmcH3=s*4z%-+ik=85%xaDjVbf*e*N2R zw%ctfOKrB4rMBB`w%cvC+ikYnZLi1az1|ybw%cvzA9eg*y?XVwHrs7ow{30toE~>p zwYJ-EZMU0vZMS*dyxSXVZ|pxt-k)D*cXr>zf2vBV+rQEBR&ud-5{V>|A|c(~-QC^Y z-QDfB+qTxpxJWq17TOdjTXx%Rt+lObN^Q12n_GI`Gc%oT1Gc3pcG}x*w%cu`DQzv* z?R?M;=XTp|w%cQEiMIZT?bh3Ew+7nRiepnW?@3WJF7FW$`U9X|r`@9f%mF;;&{R}* zcczj+P6%M$g`VEtUW;h9-wdqll&}JZggd@NvjRMl8fUN)kux~<3M#6+6EmQRkuDgC z=#>;aAqYFdb_N#iJflxM^I%o`(YD9RnLjX4o4}fiak9)K7{{qt27x8KZE$tfPJ;Ci z|3qew$3zCbPMk29mdNSMGYz7JZ-Hs|OzXVuGnySuyi%R64L7;<*>&u;0g7~RNB5Qd zxZLAP3tm9vmJ>=3{G9p@kSOn3?U>O7!Q^y{lXr_J&P_jLkh>B|5$B(|q&@x@fQtS> z4y{aF+7RkNXi7mEi944f>}78aV=dB{yZ;37kIlaJ`RTi%k+W+y4&P+3pX?BH4B(i| z(eo3C2hZl-x{1mU#|Iu{+kq(uA;@*0q0uQ-nPx~|a?RS&=AR*-PI@wnE74_IadJ~C z6LQ;L9!lhIFa1(u@%%63m@$7Td>gST{wDHkLF^0`3;}M*PhQ)L517Jln=Awm$iyu- z!@Jpj_K>ys)i4cy+}-PDMU&bT#VDrmu##2!y;Q?F$QltN$H1Q4zc?HlQ&fy*U|RbY@3PmRG&}{M@9+U}ST~>UyZ2 zd8c=GcXxM(cXx+(cXxMpcX?3}4)#<;yYvNI&AZ#YJN1CMns;}1cXxMpcY6$XX`W&u z1CCV{DpljKbQ=iXF}wx==5TLwG-@J8f1J$D10k?gz~P9-Av?bTfO(nV(06I(C&x|Oj)8!#RfNowiMIH5K@BjIKMo!WC0*HN9!sZ(3VZ=* z1`-^;&}7;*U3Qy;2UE)R%amO9rF8ZYiLEgB+4{=~z4j$Iz!K{0WiW<7$ zaD*XzA+|I$?c1|Uc?GJkFD%5h@y8Vr8C&7F#zGErojcpRhZi%geYox2ah&{Wz~~q_ z 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

~Y+1LUr#b{W7&Ib;1 zq09(IR*HJ1pRqtEHyvqj`5|svDO8%Wk~+GkOdwc#ry^Jydb>^$KHx)KPqNjQDq6F- zeI79UB=6>9GBJu+j6!5M{3J5v*?`Z)BXz$*obGrjmwSS zA^j7TT?3WHvFOQZZHl+RF<6LpObb6tE5Ro^6OK~*Lf*BrC0(T@elS{Nq1s%ndrwj4T+*Nae-wI%ShnzeEF`+ePJ^WQw?ZF3Z==b0bQpA%1sBxh|` zO{lRYO(SQ~6Gn7W2!62^fqFCMuBlxATvBY|J;+%_Ynx4Bo*_NHOQ!k>rxeN+tFFKG zIuW^G5fl%kUILRK(H&6X&l^Xmf+%OeNDUL~D5~rrMTEEwi06N*`{)_8teRahg%gJkjsn-P15OG$DHHWa_<4;do$vc80;{uCHkZsZu!_di9P=8t3qd}+(i0pCz^CSazR zh$q>Zb>;SA{!wzGGJ1Tm!Q*^_t`s0?P0&>`--o}1{yY3-BNMTSYoBgvf2b<4OXbi& zDskPlmnZ@p+0?*N=j>v=j2q3Xn9Y|^NA(;W_?VAi zAg^ftgY~lW7-b-X9cy=(!p|yzy6Y)+pGE7QBnhvVllkXOZvX(5a3`hCVbKZ`RZ@YkVEH&qJbhWTv zexQgzv03#*?=C3DH9U)vH~B-L)s!eZ^4vf}-Q|XR<@Q^y;|HEH;-YMkZJEQ}g0@YO z5*Z_S<0&RQ#%bOQ`-K_eDJJ$;JkMlNM9Z3I{A(>?A|Q=jf@NCEW`Tfo;6Alp{-Av9 zJfOhocnV=sei|&y!b_gGD_KQ_#^6M^+jKhN=M8=I)*@E$ z&pK3zCR^jzE$DI7;Xj=9F!LX-{#<+mWyybw-nC{9|8t!UFXk~^_p@FpdTOs8uuDsW z5}ykmG}EWy3BFFO+W(;w&gN!`R`Dk2NEO^70VaW!7Q?9^nRx$DdHDyPj05oGnwdQo znA67>Kehg6lG)AG|Ff!peVnTQ9SaC`<(8XHIKoJaR(NKnt`J#;!DSCK9>~Ou#_z2t z5`P#4tOe5CjQOuj2p)Fwa3xPV!oV;!U1}J(Vs`yD8+Xzl3JgE`QndLCmUkF_YP6;g z;Nz>ZvFQ~}y%FYLkv^ToXimxBjD$CSaT%fiUQvCcD84)%Dg0dTGpy$#nV;hnanSJh zlAoq%s>}G|bzvC*dR#ezdH4Q440pIm_QHk z+!w1($n5GDKjJ+NK5Y1VI95u1LKOq!0B90~5Z|JjQj#;B1uLi4ht>Q8C1wL9%@%GI z?~2V_0`AfvuKG-xidS2Kk0BCeiv|y@Dl#29X(^@f1FO#uLu`4iFHvxm4`{TQp84w^ za7><0V!Y|?^Ve+#<{tZi%Eue1e9BDX_s3GTNF%Qo7q?IB^M&N5n3J)HFCnZh$4_X^k2*{EOf-q^!NF9Ys^V}l9ojkUZJwJDhC zwNl{Je3Mk)*>j~mA^W4D;NtscCftl~v2skDGqn=j8r$xR6#$)G4U^2P64brFyC z-SZ{D?8w)w&Mo>TtP@I~CF7JyI>hqcyzOC};+Gn_H8Ko&H4k<@O~KXVYeEjnA|jq{ zZmB=YTV<-7bCGE8a&Bn$u3JT=+e74QF_5<)@E5?aTzt=4ASj=EhaIsP91hvq zhaFS2r5fd}OhRj43VFMNI08C}FT^DXUo8unu6zXzd^;Us;+GN2gl;bWeBO#O zK5MqgRPD-};wC$~sY!DxMrqtoX9`?I9UvBBgSD<QYU_gdZorafDOU6CUGe09R6;^QLc!*ZYmzN&5-7;&F*PUb3+Yw+Y&p5{jPC>^f# zKjs)Yg*R1;=x=90nJ+5LHWl)~1QBg#`u!;QJ$8(#@~QQs+4(#nJ!;25CqA~!*tX#} zwB06SH0R@QWbz6s!5k@mKLD?W8_16f0G<)|w(%&(B$tNONdJ(GmXFtos4vQA^Buv$ zW@qzaBQEV-AKhqilmB-5E^8Zm`smjUTzIMAvK_<#SLF2#;<~FjM$iUqc{hd@Eo^0!@odBfA(;`$w#-PFDz}g zL(b*+rP-rckyLsRRlKk3Vk3Zp-((z+Cs~cC()pLloY3>Xfyyf`y^VD_)8s!~CF<1cKU^g#j|niWYiHD_z@#WX`*z+dBU71fbhMo8^bBu} z9j(8g*&Rgo-++az#CLe*st-7ZN<(uX2BaZvt{VN#I)y2z4~|AL73c&VJ3w5L81iif5*5X;FFjkdBl z_mY`Znrq1~gl}1FlQB}jl8FY)QF6n|=H~Vj4jPx8WA6XjsXH$F5q4EJ>;ly)vmmql zu1<0}8zzp^VQVga^jLx*W`(uCqf2soi8}x8sXVFFfZ8svJ~Lb>#o(~KHmMYeje7)x(;OFSH zK&LPVpwd{n`!wyZN5X8px?JG31JNfxSyGm$Tr%rGq$GzG7_IdI&Jg5=nrRnD`s+~; zYJ*;^yqOIi0`SCJl+U*#-FvkmN*SF3JjoPQeuD?rg3e@lQ(>Al4CQ$B1Cj+3TBu)9 zzaE14;Y+Bh?;hzd#U!F!mtS&I=pO2}DQYyicE98@%IBN~<$u}8$A?Mh-o$@Zu9VCz z-EFC4Ey3?q%qWbZP&%D==~u1<<^BQp4~-C8yE$+sZ(}zf*J9)~Lt(WkW-E{z6WOA17zTiDTClj54em=2GA4pXPopGg%%@**F46xM2qz4t^llJf?nf~FO&p@UjT($e%mIB|>G%bbg zIW7Z2XtVrhP{8kUe*J2El)s?cco9X&>dz1T5+J25=AU(Sj_24>e@_FF(&d#`vY!0} z8Gm8yASd9Jisdlf)gPaoiio^=b{+ii*8>afIJKv)FMh>am%%v*Irs zP#uIsd-gx|FH|nQ{#OF9>)!+*!#@eYwl8Zqy0)G}-%uV1hh0YGN6!ASOQg(7)#inp zYjue{YMmg*S{oa6=8KLrZ*+ze9A$^Q2==l0jIm|>2Ng^m)`ni2O*#3QflwimA2Cov zKS19-d!EKX&CE3tOmF;Srx4{3{;t0n@z`}l%tmbwvRQbTwUay};=W;DKb)YvLtY*& z%M@DN(*&zbA-R0Ts2M_Vg#<>qS+d)=W}~$>;5rr)G*wyjmqW{!MtFq{vmR}Th`bSu zs5%tLC%{A%dEyn{#}?TVJEv}jq8H8=`|Wh~YL3Bj36g$k`!MW0XED78h3D8dFo8$b zFYjFSqp|Ui{B#!BK-`sR_2Reua=}bH!r;s+Ch$lC))ka4o}cZFd+h)0KcZQqyH~^PwPw{-cija!KN*FRiVAcexc9oy87zT- z7_Nc;`Y)D%G2Jgqkq}P>+Qf-M_=tuj%TgSI|7#R?~J&dQ^E~V;Ea*NI`{e4$R6P;J!OPpnv5fRd>o=u1i|8tVtYSI?c8( zcA|~4yV`Z)fhcOzGFOd1X)9ZdTN{)z_cH5==+GJUx(k=9KI6{T$ZD6kt1PJ3tSu7F!F;+g{YYQ2fnO)M}9CmOYkFArWlr*b9;?c4k zC%>rVZlvTcat0&SLvMGA1?#sk>l5zu&w_+wYJI%CrA^4?#$2o8Ad>usc)NMAnXndl}NTuylz68;qV?n~^$K#Q5<=Mv&tMPSmb4Yi&mk;zZLDw{iFN{j>T{gp`?n-v~oTRDkkOOl{Gw7$s&J0c~0s7>eYM zM6<+>hO~>4RUpQ}c^5hW_{%c$E+55OkwXPUP6rK{k}f4K(7ppsd5JhU!CD(NwoxOL z)w&)v7SEEg`sq4>#R^F}z0m_vqlyVABBTOEQ9!Ea0;GC^T(|$Z;4sY{!O8d>DY;#FcFFk0vv*vV znIAH83aJ!X6Sk-y?<$g9O^g9pjhIoYaC+Vj`EU;V?i!K_z{>$vDstzbs{|E$SkV-= zQh$~Yr_eF@^Ctqu)^pO$RXB=JYf`9wU@@*yHN(Q$MGsqJO*o(RQr?$pQ85%9y%31? zdfrWdSPwuw1~jtMo9#2pKQd+T(uo#?V+ zkg^*AqwD*~RmHfG_xs*_c#_*LdOB6bJtLL?^Z$0v-k3kuL+SZg&8H{W~~DOoMatJIrkUzgz-EFtNkpo2nkzs3-~G4w9H-4 zGG6YSDS5#(5f3%{PW1`87cTcB3!@>226=sl^KuXG z%TGGc!Lqmpl7hHoXc|F>_3O9e`|sZ|^gFJvR_=j{!E4vOgyj7{aiRspI@dmC3_tJ+ z@;C=vir2=+gSvI9j0~y%8Xh{lg_jALL=%ZMRsP_0hkN2a9Ew0&;Gdg}YKySA?2OU)htp0VIr#bR`C^(shwH1H>(FJo&c;?A!#Z?AZ z)k_sKq#*Qp-7lGl`uFGyxk&?}@jctUMGF|Tm8&Y0eus(yS`P|bh}*O+S42d%yz zBL9ehp8YVPf2NdAwO}PO@!v=kzxguTKc}I5o3b<#HFWo1Zu+?*5T;y#l4`gp@;gwB zF4iA!#g>6YWWxFA7^_x5n}?RNP3T+?Jr0gZiRi*`{cL`z28#B8rUNtjp?~VkfgU1giv5`XOErO(UA9$hHSnWNqXOy+irjI%|iC}kb z{3-r0op1eXI&atF)%d67m9AW?o!?GAZSJ5YU>*fw4+BRcIR&{gh61F*{<^Pf)VGhb zHp_Dw{;Q!tdLiIq1eb$maRd+PnAbX9$MDDWgq1RMFN8T`lvGPn&Td~gb8B^j&%dpf zX2_GurkLuKsVnEGW9NPyy4juP07hq(KRNN&8bvayJC^}uQ>^hjsGy#sDLv-^bi$-Tm#bUg)M#CO#9BH-V-P#tu2?y<@jeUhfK5 z-X89Ee2R`n$|-;a#wFs?9l*qZg;%Gj0#pc~*M)Chov)aCtRH3QQ`ATK` zu|O|azGd?A{fEy6cqxpkNI%`Q5?7&!lbZ%t?ULz|DQM$pUnqIB!|)g8C=UuZhyF+4%{TBA%VM=kvnQ zD;x~;&B_M*S7h3DJdzr!(c~!^N@tsRsS_B<4L-ajkQ2|!;r#W2)nat?Ee6`GY5+BW zN*AZ6z&S9JJUbkYbWlSw{e_+EbQz9Ti$Bs2qk(i9zzuFBO4_KS`!1lIoD$eOfVm^Q zYLiE-TbbZe63&_#9O)9mTNfOu;qJCK)rb=o2|gc0sSw{UC>kimVFO2vtdOwtO##U+ zLR7bdc|t~J{tx2kdNf)2S+Ff9;09VibOX;mArXq%e$7~>9%l{E0`bmou6 z`q+|mZXEsNwJH4g{?>M3v`kc1lx~-rW6_yTO=@wZscH6RS<5Mxv`iy7{?U^U5GL1=cSU4FF8V;@ zjSLSORwm3^|7U9 zb5++urxVYgrx@+S3GI$k_9~?Jx=cdJf8+t)FA!|pKKqa!fA(teI=IZHJ`AkMtF~qt zFV^Zw9*&v?@BZUaB=F%;M15t=)5`G(VZ8kxZjSjs+?=amEiH6y{GKHGP;G(D2fjEU zo#>;{sNlkHLH2g;a`LD+mjF1W?mg%2x5E4HtKSDa2nT+-Ilf-~Uq2d-g6z%v&OCt) zM{d2xc-7sasxNK5&^)_{CoJeO3l|ydt^Yq5-EfV#LPx<)a?9wC_I3|8u<3|}@vbQh zwnPq}awqN@V?vaG@H6<_vQ%&)+Fs3((EIOdzs+*ayt<4Qv4rzu<3o9jlkJqNM|u2(p*?N#&MEV5BR^QQLax8|>+>&!GCWcNx)|0;Z~ zW`7=w9fDHyQyYEDb#QL3@3WGCA6~>xWyGJLZe=>fQ2vL|3e|UmUt7yl8l+p`!Q&ENt5;Tr$soopASE z#~}&E{5Fwmmp`%Hn*-ySR`myL+L=$#}x zXGb;YPeb2WiVvWhBcAdtkOy$5{r|Epvg^HTza(jz^Y^tUzrdLW3Mg%_0ISxJ_aEaQ zUWe|y61z^*d@p&VW&EUoo<%^p!HSbacQIxd^zma?Yw(@%F0I91^`se4J!va;7j-(z zQd!?d&$onjw1m^4$*|p#b#3+v%N}`BtQg*^XO%zu5J< zdCN*jh|7~Df3_n~K>vKnpHU2j!`pwJA-Zf3pWzWzqpD*?o#ydu?_S8FG2)B>JUqke zdhZ~*j5*l}h4XSvNtst&+(2woV}Mw4^&EcD3Vb>KQ`R5UC0nXKNa>u?Ep&LXvmEcJ zn%=D@nHr;d(PbCWhWItwr}&cl+L=gMG{Yc)PH;M-Ky(Xj$JKKNi&{m@-3g&6$~ohx zGjVn^%_$RUZeb*L4GzLDxMt#G^}w^nEHMA6hEnElj-MmPcrBJeG(BTykwET%DwdW5 zenO;IoTd24nqK2zhI*(dmx+F|&3_qkz;~tSF8m|lM?2uq$5!kaRy+;L6`p3$0wM6* zcT>(Umnb{;F^-d0P%&y-!mS-vWH(c<{YQ%jbN-xGm2RADAMjbI+Sma&tl&{IJ^Evh z`>VSf`>k=H-3fuNk#a&uV2sgJQXw*D3_hb1?n6%vGT<&Zx4x7#pv#+Fa`a3eYcSzF zL`hT7|Jee#12S@pV4^via@KQji$yPpSM@_$V^i<^(;?+hReHNym$((H(<$dFK1P|B zbnc=`g>i#q8g#-VW_wVGfCIeof@l<=W9anIp)=f&P$Vzpoc4S=C|&}Oh7v8g$NSL) ziCN0m6NdJQr1A3=A`E7_WEnRW(al~bA#r0i1aUqGG*T%M!?k;CpA%xd7Do7p0dI;frz*;o1j zXRSSejycQ}NWGsQxf{^7==W^s;n&L>?^dJj(cQX<0xwQTH>*cRy%v{Q(V`bhXifTWRA`+Yu<0)yFV*r|Z#EL=J8llt$ zfP8~dXIH<01QQ!VWK)crXIpmU!Kwu5PT5rPjMYqy>a7P7MaWCIVBj#X;!n1;cKsV3 zFmU_KyjjJBV-G*a&m@S=45v)gxot?tvK|N`nBR6w_HGdkJ|&=xPKrT~KdENZ#0o~6 zS%5<4fCrT|M;@Qs#Zwwfk&f}i7_P$~cw<=sm7=fN3`BCF{n-ra(Eu!uEs3NZfb-x? z9^TJI+67`%wGa~ejFzDWe7xax;F9i)L zkHO_QTb62EDSi(Gz~};USoJbr_wK68jS8q88?AW%pe*vdF(Nf!?|%8R!(Qkx(N`O9 z|Cj&jifsPV5qEjbyGOFQL)72Er)Rk0v(fq2A{Jw#T34XpFhOxzc4u6IeB&z^$zKBO z@;?OlQ;8ty(8?TEuY8>B(d~-Xz7SenbXvLL*Zdpen*g`xcC0d6CsUa<80!k&>(f;B z#rckdd+UJfn%S_@BII%-t_*1j#~;}mu)r>1GzvhOf|7QfZi>PwxLGaeA4XzV`x@av;*?gL5?`Q}L7`&DkG+>6+Y>3e@vh zE!OoW9x6TXQ!KzwmJQ2TwstTQ>}B;!3WX0Nj-9_o9B~dZTTV|&N4I;b5?elw%A9`0@3)AhJqWHqOd=E(tR|p`z`74Y4EU# z6{)y^@Dx!0C`OJsb;M4uCAsyC|BXVG>@mG7wJ!Sm9@4U2y!7a>wXf&fo!8~|C7)LG zAQdEooQ_h*CDg)YYa&_!dJ`wqEBGQUcpDlUVeg`C`O)p)&&;0%wLanTp|9r zXj!#I^w6KcYNfqx9dWcVh#@dttdxc6OA-|Rmes`5+%#>34h+a(fSk87$SLoyRn}`O z4mQv#%YOMU=2gn0f3L``PI+kb`KY0GEM(I~-`af$ZgjsSWMt@S>8MN37)gx^fhD$% z7Ou-FjxGWP9PUFW2Rs_~HurjH(cbk9%Wb=Tj<)-S)b#J%4v zS9C`az_el4w>aoj(BaeU%G%*M=xY&k0jFnOM567CA(JN^UDUBvKs^fLtMx=We3>Oe zq{&Z5+x3L&awAHsWm(ABEB4MK?#O|l&S!^4+xew52rDA`q!F+iBrN*G9B~Ul4Jw^u znLr#jnX&arC3r8pDh!w-y7KKr*rKyZ0+YZmA4y=xJZOaEFOk2cZ*QQ2oT^apufUpl z^d@Pj;xzqCGE6kefl?p8p3D}CuFrvtY}*5h@zaoms43w-F$$Q0Fv?IdmzG_~)Brg0 z3lv-#KT{_deGG=7vfSO?j%bTP~MCM`42F#5GU~4D_&_N^Md7q(;!d zfi$yD%`3wyTgCjK(wkK`VDeULINO5-2@<&la)iFv$Ta3QW--4!U*cetxYkbqTT0#mKu}Zo|g=mV=^rm2953ss!_6PHXKmnMqo&5 zA1tNzhZw|5n~hwM#Z>b_#)Xax2uju&Z($$cH5)#aLr^I zw49Rva1Dwn)a^vx1NDcEkM4AFp}9`oPMo0Iu{`Uy)z`*mu3y&-%IhAQ|BA|yvup)l z=T&|cHZ=$Tg3+#vs@05gi=h(+%i4CeMRf!9Ssw=buwH`KK2=Htql|o~y79k5f8zn# zhp#jb=lva*L>+5qrJM^`sH}hSUJn#Q#n_I6EQJu9=LPyMamN6Cmso+mOVYS;a;c)!KUQW{%Rd1!YmFyh+Xn>*vj_~&>Bz()wC;D%mkX3kIvC)ME|b9 zs8g_@&(A#`ecSsvR|0OnBfaJnD z+1LOY`xxte|1)^{G)N7+Xj<9rA0%?MOju)G((Z+u7NnvRmnEn~pcHFLk}{Dn@xwO9 z&}Tz5y0k0~D0sSBu#Lquo`uZ2lFRf7PAmH+#mWQCq-r>5E){;fHpBQsMfGsA8&CjE zM_IpuI5+Ayo|co$s2rhMOFLN@oVKX~)wXlSGvLy@@ZseX)P zX4uQ#lrefwJ6Dz=1uy?!70@9J!20mVo`)d^?B~i4m_H2My_SXk@%DPV*X`H=F=^^8 zuGcIH5at{qlB}r_VY|ciA#?!k|0ZOS3m+_P>rSi;&z$9>hMKZWuSS=b zj(wu0S?Op*E%=A%Ekreo_nA#29flrSi-NyPZ8(m4OG>Wwij>rC5x9RA?~%R5N~fLdO)bt9*EtCX9IOws6@ ziWI5nq=CO<1aYFt6{2-zxNRM>aejQ6Mb65;NpW?dpz5C*V`7drf1hI& zL_{_$kaV2_i=y={!onI3xDZ~PHGG4L+kwOrN18FII3wP?-$n{=BG~#9Oj_V3W+%g$ zl7zt``J0s}L&PpQfRDkZy+x=PC%^5^BXibaNDJ9xCg-^Lx)0%IWC|08h>2lHT8&OVvVLl5*4~8Euds2f2{m{vv-+y z9g#mR6VK^}Et(flZZ3@)vH?)E&_S(@5LM)?`k^Vy78xj*;r!_eB~OdNW|qL`zU+8d zfwL-elL#XoXI=$z&?u<|B12BXE=*TkfwNB;5PT*!V6GZxBC=}xDTIWTO81czTX3gE zPMBK?vA|N!Zt5-DHP^6|3y#J z~O% z7m^$ZvjB<~)5{BWWFtoyCL)%NRq)xsI$Bx!ZMT!0qcyeDWc%XJERs%FJ5D@ockArE z-=Ge{6|>9@QtIO5Wt#@`iO^ojo)Te?89LE1FqaSMP~*WJcfUC+YgC+;aU*#)+3G-# z^Kr9fkM!n$T^6Kps-eWwaV3tNyY+)G)L^DY)h|hARmvL)pd~^@QcVz!2je^&85550 zN6l(i&XedwuyIz&N?oToW(qZW=YZ5rl2*6k?pfEKml$h9!MMaz@$ zduvfxZ7+rr-So7>%lAf#oM_}*gdYVYhuKI#1D~fEOniGz2tz`oTOTZD^a+GMSPQ^_ zS~|&JF@CYpsqn*XFCev`uzcYQ%#eEvoF+sT^d=3IXmkX-dHu!P*)=gLR_qmf-n27X zWH^ju3Y8UpUF-nPXP^9DGQ>YqUCvqxcV_dh_We=7)(PSG(NT0MU3p!~{AQvW>A;2o zk0QKj?CV=4r3zc#6=CSJV;Ippv4;CtoS|TXMjkg28t}Q&(Zk3i7kN8jB=|71q2yqV zEWtE|?tRBvZQQCWkFBbgr<2+>ot}FY9#PT2dC!B>(wwOHySE)DzK@lm@{TwI#hT{5 zH#a58&9Eurl-9%XP>l2!Xw6ds^iQ+f7eZl#OB!kdJZU9h;cwcMkcto&nd_5?SM%MM z1*!Atw8AKrA}w%Bl>q9}l%gdPN>urB@zkR8Nd*?gQb>&m_Fa^JSE8WATk;l~QgohM zXgx~Fr0%>{&T|Xu;+RG>DO0&&`gf$#4*@?N&hriBBw~BMW&~y6>ke1(PeV<1$3)nF z1Sb(kViblK9;cB|5%zv31}Y{nK%?}i@+}l2HNs|Mp!8x>s?-E1G522!_lHCp|7wkCIRy#D z0G6qeh!Yd(lG=0HlmK@92I{DzQl?VHgP2IMuf95mhv-s<^6J#Y9K==Dp)RA8%xB3R zl@n+`k8{?8iIHO`qG_OOIYKxmRUM}`wyI~ezn>n z|C+spN1#bLDg)kjOGnLM>i2;qj%=upYXZ=d+nQ#&(WbS9_kQ`>Uz7j%m49Pvqj9+S zIqXeJfGuRzEZXYHuL4`Iliu$~?R5~w<~!&~w)7}u+q>`5L)TfOxiZ}ewm?7MK$E%G z*%Slg-RrrnPm3Q&u5Y`SBJ|75&&x>+`2HceP!8~>qX$%|&du}JgYzx=x6-ZlFcblS zqpk08VNy9)rO)uQP}uKIU-hEf-XEuZTi?rHpDJ5h-(9?J@8A7e-hoi-b?@Qux)|!9 z`|(k~?JHB++e|J}(*|_i?aEfbS@3Q9rs)}?$L3yIj)H}*RBKu%*It`v=*^Ps^Xutr z|6H=CNgei+-Ejj;#!)J?YF9)0xNMDiT=ir(Bh%H;XE2o`;Dm=Qqha}8iji>o-bdJ2w!p|UAb+&cFffHo9U98X=rxOcpcstu(k&dJgPz84#51kI!2=DxtO9e3l z>)468^G9-@yZgDaiFRJV%@dIs!DqDXt=pY@wmPe()exi7;bE3p865H|aTwU#1rQZb z?V-rL+um;)ecdzsFWFU|)BO&)XDN0|yg@s<5#~~8db|lxBSS24*x!8$<+I_vJFL0; zJUTKcZsq9{CjgMYbD^4Bn~RJaL9E$3J4OU= z=G?&2*Ew%2&x~&!ZBlT>Qx!>%;R_@aa7G#NQ*gz22s7R^7S#!)`-`ksWr`ndk9a;c z^W^!|c;Pd+#Pv1=x;S_tzyR;q>s^I1$k$WK&ZuEx4Z}?&D=|;{0z9-|*K_)D7rI*b ziozvKXM{xqH>4vmNqGD(xaMoK*j=WUA`+9ST^Lvm+P;jL1gtwJhPjW0Bz$(7+Q2P_ zX#L6>FVu>Ol+2jucpo+dvW_8s@KQp5T9VaW1h*-7#qQ%XH3Hdue9E{3Od~u_Pg!$O zLgDn}j>IOLjQaNW@_?gl*Kt?o%lK=`fXxC;DeKkq6?7_3MJ5rVe>#VH>(7n!5D!{1{dt4OiRRW?%EnxJO~{I|{#v-GcGG&x)02 zG&Nk*B=@(;xNl*h7c`!IgR;*N)9ml@&!gjTV6T@XUU(=|C){V5Wo=rE$q>{${+qfVdU z@bloLlDD}=(xQ@oVJekL+uA-n?Lv+8z}>GFP54u0-bh}5GHN7r@U$fwr~2#9DOPjI zCL#u-q`z$3BdYJBrgm#&v6pom$%-M271*tHN)aYMX*-ZTQ8@P}Q|cnCXT&`-x^s2@ zlA-||XcB1T521P+=c!OacV=TyUUt1BUjQ-SVm?$NYVt;W)=fUj{v0bHJGG= zWN3d&H<7&Zpuy?NrLF?V81=q5kbx@irfVk%R0Tsc$v+yV;{uPMow>^6w;%^ZJx9G24B+^!?R7dsv`B{TmS-34#txO3XEQ_kH#leBfqaOx6+GpYL zHLAx$0Rz;4OhHh=B80wX*8Z#fd4DN?6A1$d3OrHSEwaSmmrBH`1Tqv5*Yzz3E$ry( zOt|IsI#4-)FEi(|*O*%?f|tU6mNY5MGp6sSMnwghfH+(jOy;Zg(AA!zE4 z<7qhdW?zcVtyHg)rmcgD-@Tk4DQI(vh}uKsprb=C;IpkR93sCbuOss>fE${QQ!Imh zPwA6?KPuuUVCm|3FA96EKJTB4D@}iWKHVbP^WsN-S$X@V_Zw)tYx~^kYauW{`P#3m zz7W=&yxl*kJNIVWVfCWA3o~9InOxUWZ0dbtQGTmOw`S!_$UtLQpY|4$ZbwsE*mtyg~I+rSZHo0h?{cl<%Kdc zUo}1Q^km8U%~6{}Rqkrcx9?OGocU5?5L_(vPWFA3cDld2tLaOlBN-#}P4r6p@N1{B zSdNFcbWPX_y$k%qHZp;g0=t`-UJo(o5W)9kP>h7fDR1wmm-F2odoEQK$_trE-1E5sdWTV7suXGFzHxLw>`EIk>bQn0&!FPRq>{BrTAAh{GV-K8c5NIZ3@F&_qe|dxXB6j2 zwiNeA%;qco%Zzi5D`LS$D1~;_d(jxqieInUd3W zuOJ36>-cV!C6tqw=#`tElMYJFyL@*e7l5SmQB)}Bm;Tq-MLXiL2UfgtE@vcDuRz0@ zE@CNSM&e{?1NFAT*aQ_ANn4S|s{8^S#mvQ=-T9)%;(XatSMiym$wuSU)rNmxi#d^;lTi|IjY)>BP#yz@Da!MfK}`PGo7^X?C-pzX z>+sH1vKMpe)QcO7ljkjA9Cb!X%>`1>h$F$mt&x7de_9ecyJ>h(*|%&GvWeoIJXL{a z|83X{6_@-bEr^rHI~g9z&Mqk#UyL=}JThn2J{{jwz=RCvFvNs9ncg(l}fr+u1 zSNxUx1)kP`c*xE;1e=3tPG^qDRbKDxp~-bTZoZnNXVtx!=q@v{HZyY|oJtFIDJbGF zOJY>*SatN=mIk)THm6aYG+t=MHx(Wktj@OlJdWtfZ)TMhr8q{9lZJj6bpQc8%%%@JYFoXe#JDVZ=^Mgs;OXEaT2svdMnW5Drf|JGv`sENQAxCs4}OryBR}&SzistKI6i7 zWCw6jg+R5IXoLb_j5AXRjrm!F$ zaG8mtz%c1sk_$%{WGk`ihINO8ObjenRv>aw6s_h_GR3Z$lo{b7iQb~}GX?%Y7mZ*_ zvnax}Orgf$!t3@Ml8taw5skRsbd{rt#G#$5?)MW_JbErJbCN{`za__s9P0WWY`a|r zCHI)d;ShDYGA+uKj*I&ZYYB-|?@%Fb>bu1qy7;%*y0e`i56FClb`{S9zI8x7zEAVn z&R%TLFgDH-()S`#xLTRpr4(u4`m;bV+^+UVWgx$dhRi4N)4;;%-KO|4hL$wpCNtb) ztP8t$l>Gs7jtLjR4+U=^_#9PY=yN{YOKj$_;H$EG!!&H|U}ua%3-Q~5jBaG7B^dpO zNZ8z5Ag&C;uBB0*mDV>A-3G$cjamebE(;-G-kuoYeswT7Tn)k1!&lKhA7~Jn)F9~} zW=d>G5IX6B;b)_Zs@ zSK6m8&jh}w-#f)5Ut<6^zjTF8o{=_{9N zTL$pN7(=iC8q-XVeMEY%o>tva4XKiYJ{gN{QH!y(ePt zD6QHX&a}d#+f*qhyCM%z9>}y(mfL{3Dq7`j@EXiKaoyEN?HFCZ;q1g~wBL_ zBhasNN0|v1sT%|Q+J?%!=|bq*-zmbrcw}j|$c+X0*p&{B&>6Wte?3CKs^Ni`Pr#`| zVTyy`OX#$yHb`VA>zRbLnZ3fTAxg}3RzW)B3?WW`1%f*@*2(&`?k&O0*(Nav_T$!u zDF_?S3*u%8xC5DEtDB&}m2B!ps=mGpxn$S?+3hKv=%<^A-6xHi!}m(Vv*Gbv_j`cj z!ytUechhf_aytoev}0yannXf}A@8O(DYionc#(waS&)S>54;ir7(qvobL1mSM!9?5 zibs~Fi-1FJ-+~sNuvcxM-*QqKeq&qV&40gQ1AY}y7!|twg&;w@&emTTe?0}55%JS_l4j26LF0^Z z@Jn+C!#B!hq5p+(z7x7_Bh4AiRMqdt23^~>td1&!SSu!yMve13 z64`|%m40MoZB9huFQ6;vUK`$ftYzc$X0GbrS_Fhp5>ZQQE5kX)TXJVJYC8v*Z06A3 zbVzYX6zPX`C%ZxuC;eoX*BNCp&a$ooj_fo^`K8*Im*$8^^iYI|!aQXgV>RG@kUGfj z7IfR4B!%d)S~z>ECsoK*w7A`Vpu~N_iOIL7Bi@scPdclStaA?R(C`+8UhDIaL}}*U zGj8w6Mux2Npb?-Bq%2AaUrlWy`<*iO#e@Bvx*Fg(n{T0^|3pM51$oqyeZy-_O z9rw3}mM}x*%|X13WCTD9mk_LZ^)Ersx#5udO+L}jH>-}oj4lenr0P80POOVddTu5l z-1P>6v;vF>j)Yz#gUSo+1+pj$)i&j z-5Z@HpWZC;+UvNiu{!W-Hkv3Hf8E<>6VnUCTdo*-mhe>R!H_*44& z+Vtk=b^D~OakKUO%)k&Cb3*VcX|NVU$dmnwH}aFCdtA4zkyQw-mOTW?%Xo|RJUUBU$L1Kj9((*6kS?*(x7Yhv3^3=Q5lYkBL%Y8JTUYwCg-2Zt5`nkJ? z3lD1t9QjCcctnh;G&{uEVtgDfq4xhg((6X+6|IOfC&*jQ~bzOBlvTtdbj{TXfyjAph zKYI)zyu@Fxf5fubkbF<-GF)V0-(lM#SmTW>IGZ4YL($wkns zU}DOKbUg5Z&NLz1FDIjblQo~OX~Xq}bKmRrtY%%v>-*+3M#C^FQt7tWK}t{Ok8mcV z8Jr{kwIEYJ%e@B#>~6l@2Vtyu?v}K^u}HGz*rxp9OA> zkE6=ZxRbirvESBX+viT1v3u-3c-S5LNczQGqFKjSWilBYCzTdgPwo~cW&9lC?2Tn# zDo#|a=22VhDb%erY<{kLT%|ciWy8agdgZc*%uQVJ!+)V}9e!rLFdEl7dM;6b#IQ1h z0Z)Gn$!I(fK6lPjlYmuozk;_;=unu_hOuN7n7(DOZ78#pK1I+j-SL2$2--EH>SCc4 zvtA+kvdJ4Fg9ZD22$}E8=1byn+X+%2<{m3-ITH3x`YFysmcF#riMnmB5a86bG=zLw0a z`}c1HX&VHllj_ru(%%nF0#yTo$GcTgH1S&5P=*^Rq_QB+j{!7H%h}Ty>Piw4c3j}1 zpmbD$;L1D(R?KsB^a3Uky_YOrfRrDgGLJ&(KxUKrERNrU9P%0GBi!gg=BvI!W008) zZ5tpx%`pie>#Qn#`dLF+S@=nsL78$uV-`H+t_|cxBeh>~AIOU$Y6yGIbmKE)1ZsW= zjmcVs?DQl^POp>>z*g{tuo5VFUpaY>%--L+(T3B$!hn$uxc2P`ITng4 z7G6*kT;9i3KXQDPkDE)59lF|0vd!#Em6Me|^cuO${mt7!m{eKJh zkOu~cM^V;@J{HdzKbu%0CnR^h#8II|isOuWW$@bphj(!4 z!L_KBYsP4g&cNMe6mc^!q;vQ7O{xQ8I8+1%Ag|R!Pej7Nr$s=3f6>h#u3qz;zJB!V z2xLA5*8gQbF5s=#E?2$IWA8I>N7`PS{eG|QG;i+o8JN1CmqM!c0t$uUO%-UxDA^_) zToP=uLw2AE+Lcck#eCH6B-lwPM=9DTNA~T5Y{U?SYgV(4L3abWDTh?bB=zLDDTHLMzMAo*+?Bn123hFgg;O0=L&Yx6M&t z-3Ka)E4w4SejE;bwZ8qXZVa+wcN((P%`Y0jC_z0Du{_F0v=djnFaU?Z9Y*ic z*wijurW?VJrXNj2#*6;BHWN!!N0?!;-*olxBo3HVUAMe7KhzlzR zQZpU#@XqYGZ^&RM5(qHEcJ^m4YYk&_+b;}-XyFp)O2^3zg=YBs|HPXuwyY&-u)!fe zZ`HJ#u7KKuG7+DxKEF=urmdbR{Dpk+bF~Ew$K8+mSE!UqW{(rDMbEP~0KSWDo+T!O z-+kwXp;JH*ko-VtBdTKQyOg3pZ#Sc31VldVS_z1UGbGO_s%k|&X?p}0Uz^-eRn_Kd zGo3M1)fgF9)m0)|h0|0Kghe|Fs}j_}sqESXNsG!W%0^t0hvzI6b;*h%p(nQ9)#>L( z*flgf@N^HZ=V|lH=b=xi<0u@IvQ%Ax&&&Ho&Cm`OyMwBGAP0P1BJ6TPQq_&SmiS~s zMU|4WiX+qn0a3bu&Ch2mO(hI9e0hh6C}8M7+8ab?sz5J>;GK4mmc;1%^LKuQ_c^CV zWcph(-vjYkeUW$_!MTc-2d~iFjEj82?AV@VwhF7Rj)7ddjME?EK}0g%$y*Ko+n%Ht zGv8ZnbsZ1hbUd5X>~?3zgIZk<93T3l|Ku(;clw}O%EW)tPXbc|9_3}CXkzr97l-)P zI$Lh|s9!;HF=qn5W~iKycd|EEgwrrsA|(hiFQvnX%kemm=gnrC{zSIbE>tJ0!(XFv z$$#ANLD8H9>x@z389B?>SB~s(GO9~wU1KkoRo1h7c^x=6*#h#V<)0`@ED$ZDIKVG} zO<;Bmd`7qJG7}dL4wEjpPBa~aPvP%Wj5gvR9bU)=O+DJfmE>z~7H z&t$WwzR}8im@+j-l&WFS&7UBi3u{plsB^-d+>qPTgw*t;WUiWmSnW{gCU?jNi$zkW zpm;nlYdMuv$Zy)^xj12ZWZv+5d12kS85^eAi*MS|HhdiWk%oG-oVF`2yBA&_-<)Yo zWUucAbWGM7S@R;Y=b#rKZx~sNq2E7WaZ`xETucdCs8Jxb$*Ym9ei+-dGcjCwsl%mAf?jZ973 zcN|9(z^ZDAE$IK;6XDtj;nSWz96Z!)hpK3XRXR_sCB2&EBU0gd{Hp;;_Ve$N{xuSKvHkD))~isc!}@3H%)0z=;uX zw3mmMRaFS{#w?M2rr$d|Eyw7$AE>|V@seUT7NNu!Jcy{8*fXs2SesE>)(-U%!l;K` zpS05#C8(!pWov;Gz7phQ*f7p+&m~jaY%jn#P#g5c!(ZZvsTt`W9>!zOCeawrbNV)7 z1KZ)>CI(5h`Qsq)oXtDC$$q7H(4Jv}xTjAN#zCl0Niv%=Y;;#dsh|(MWq2@^_V_d6&T9p{Pl+q%M z7u6Xg(DX7HC(ol{m~lrq14TXOwe+<%GM9v`S3*=034QCQ6dXrFvGz=^QJnHg( z7z7Eg>K_IW*I+8z{|yO3NNkQ$0(0^70181Mn_^Ah%Aq2uR4kJz_GteF1T=wV(lAlE zxsIr31x zTV@N2WbKCR(zOO$Ew2U zXW{q;W(T^*qwQ^%)C1FD zg3WvHR~kr(<6uXhvI=L|)x1YcGMvk7FbyL(9WK5VaD1O@pdG{YwCIlts+v#>SW0E$ zRH;{A9$^hQCP)SmD>K=2s_op;y-qQ1K+NieR)@Z_DxNwbi)wPJLDu86F`{DJ!c*t} zIF!zok8zc3PBDq$lUbz-$;s}<$k_BXqI@Wls12%asPzqar z?{{vWRs_x=l6|=GU&rSL$~bR84MIDxVqK%51@)|S;zWGzZyi1lcLwO_PKB~Wj_g7d zJst``$tjQrYL!^E2&8{N{LPtVN%pQ;ws>)EpgqD>__y8Cz%WUxJOX?4{C$ngqp_=G zPf^lG;F(RQi10kweyfN0yen}elUoc6SLZn{j{p8M#d)W?q!wS?Vsa2$KwS$-0ajv= zLsWy2FF!&n9U(=0kOL+YJmAy|BkV^Vh^s|K=VPH6%sN^{>}^%NXFlaELaq#t6<0{CQ-G^ylY<0PFL0m z7v1m2YpOWpwIr=*w6C#q-wK0BtZG3R=Ej3>ZVFwf$gA|Nej`f~G)f8(;6|GMHmT~+ ztg>Qod0K;)8?He#s<4!>2|5`1%>pm`A(0e!;?(d^X8-G@VLQp*fMJo7!GyH&Kt!ks zAC8XOk4gyzHM$}#v#k~?IDU3qqTPXmg7{euDKyIIKsgjvNDjm-ijjc|K5-f^2C`W* z_bTkW0)IKcl|0n3O2hEG3`vFkDwFHsnRk>1D2m!$-*bH9IqhSTU)=Pm4}74#sL zWC@bTC$PojpL^Flp?px#b3%D6S+QQrdQq)R>toU!fw+0(gCqK|`{5>^S@=wgN%obf zW=TJWAh<@S;f_Aux|1lWVl9?I&Fwf%gP|-5vkieIviz!pqa3z2g|L}YjWFMfEF%rE z`G*jB65c>&vUHe`s2D+J0-pNpytwXam{owhDK)%7g(3F5RM7T&$%A!-%&YFxuH7#* zP`AI+b($1gA-=1?{b+DT#z?exaJPdb?bo60AiLF?F2z)>P+sEbHj`v_c0-Rlr@$I55mZJ@wYZ@Xcc)fAH-#+KN3oOqP$ z)f(4p7k}18<)A*~o}Qg9@7xzn8}QJEHf@;{^!#ZJO&??RE2uyGi@0UV9>A~p^?dX; zKwCMh<6f^Getp|eySA~u5cZIo1a>p?Q2m;E+gd#E7Z+SDf=yaP!{g+Szw^v$Fl^>iIL%^$pSYcVce~ zrWgUlfl&X?EBJJ9# z)RlR53y~a)lRlri5(r3YP1q>)!exBn7dVv+%X`WTf$JyIR~A|GyVn*Ka-Emc9&gbN zSfA2;pC&_`uiE=i>2Zu;{FwCIQQ4$?R$Z3ppjzcPQ+wl8RRdiXrNRVHwN zvrmoHbPolr-B#QWy6*124NPAsOm-wJ&dwIH`FeQ&OkF0FfIwAz!iVx}75z8jH(b?z z(YQKOll|w_TGTYR+J3pEl<3K;#yPDd(w?$#~ z?1Lq`ZuqFj%~m8i`j^>paWQKNXF>PxQ0}+e3BPo_)Ag{2mPz!5?QH#T*lmA-_%`a6 zhmEOMkOlg!B!frA5;MDjG^R;QuQ|V1H|m^UF3;{t6(zdjtIJn}Y-{jl4Prh-1|c4w z!|fYu-izQ3;Mq_Br=Gx0zueGU!*yXtvhKlQZqW*3Wzxk*ZnJZ@cKKn)%$Cxpi*|Y0 zR~N1sQ;0}#th6qLJQu$g+m!z|=m!1%P|5GAak!yJrC%a>Pa*#lYI$k}pxqj7tt@S( z2hL{eFmm=%cKvdPP@wk!R}>A;TGg(mlXY$wi@f((qBzz%8*4ff_vk-}sW@D7Gy}mr2Db7V; zFC7k?t9WWoEnfp0HzmbtO&l}Hi3BOBO+>(9ybD^$XS5b7K^rR?T}RNj8O$Uxd*+6c zGzGdu!3LLL*tM^(wXl5F$3o9ak(fyG6Pjk>QeuxKXBBWYvA&C}g_$|^CdZa&E~oFv z)SZ8v{TCAZ+P{xy$^mc5)!Is{r7O){sU7(r<514(_0>@FoRMB7zd@KZO@ilV9T=cv zbQ7Ji+>7!5>Kd9_;TvxNh?o|Dh_Q^!=;D2b+jrFB3N>qdm!c+~g4D1Z!9+3#8UZ<> zOeVf=b9ovOLJpMe>0^ty5hy3k`!-Y1JL5c-`+r!5d8lcFsWp@LcPe=-Y4@Fzl6gUKw&2gJ2N>poBqh%?xT58ml=b-6ItPmo9_wc&=^K9Lv*;t^;Ia@GjyQ%|J%n+7}Zdxcc}17>8S6zcV{Bn3fl^Sh;Rb)I!Ckfwq97*Sl)-4Ps zY$%p6DJHubuP&1BJ*ZwCNmu$`9}&Cfhh~1Mf5f^w^dj~#udc=I%!Fjzyk!4>Yf!^L z1S7Gtg*uyEMwxGux*cSc_KN7_f4xL>Kd9mxpR)zP{ZQ)laudS}In5VhN})SI7Qi7frD*fxl?^Mci5%*DyXlr=?zsA*|U4YG__sZ9;zA@xN~4M)P} z`jO5=D~47-l9Q74a0VUBs8i_~7-P2nOt|Mjuxwv7&q-^QqrKJgTq1G6DWzk)EvQms zagfy>lWC64DW+qjU3q<&bo;82so!)3K>*}r6{jy`73+IzP zo>_7Ap_a|NZxdW=i6spx)rrY8W@gk22+k;EpWpI5fd}MGT;Kuun2ecQwVvDQdUEm% zbBGZ|_GqYMasI5W8j#454#wx-rrKN;>dq1S; z`?6)ti*!_AW}6?sG=dDcX#KQJULw zY=wpxpfSU!P06@MVRWFfWsag2!f!RI;Dd(78D6c5hCYl^?ol{eF50~1S!ZQlT5N$Q1I;t-+{iSnWnoY8M4 z>l+9Q`}zLRQe3k6>#tH6#J3P=y9lMC`TL`~ODd!2M5GarcOB?=^lsb;t!LWaAA%fs zKfCj5{(bG>$Ni~$(}#V1xx>rzOEqxW!>5iM=#1mrSzKU887149S(YW2zAIn)zlA}0 zBgWXpau%xi1-t7EcYU&Lr-i&MOjGYCqYP${++?#-px3rBMmMT_Hs*kO4hpXvJ(lL~ zXa;Iyvr>jv1Mn~8{Cbr_+#f=u!Nvt<7GPYU^lcfw7#FirGImBB3OKQA>oTVnJ95rQ zt}tNabEdub{n-X{>WuO*d#eKgHb4!K?d#AN<`7nWPfcnFQJmmbJ*TQ=?hF_2&DE7c zf%K;O;dM@!$6G{2f-D%v%r`mMj(JSl5Z=a{MsZ(I zEg285(JUE*oqnANesLA-Fe)7h`*c%e#sRk0Iu>lz4-Eo5uGF*0m5ixY$&u=cqq`Jd zGC2h~pa{O}q-Z?hAAk}}T+KhAp9EmEu_>Qffq~jmQ$~7Cm3h@MBg-Js4a z&=+;)J=~MTYqXXmAdet@CZ6&}ekPUQ-bY!r+fBFQKdfOSefj7(+)~U8rs~Yj3u`Eu zp)Dha&?k4s+=weYP*YswI<2w{r<|%nUhvsr&+%8Z3; z{99T6#gJHH&KIuG=cY>9d@fjG;zLFRVbG;5m*QVfLhi+rzz>>v@gyuu1`a`K{an*h z+S(|QQMfx`+7pLY6JUt`L>AzKl70}7K^)2R;KcZfBQEzwFb2*F@1d@4d-1p^OVYgG z^aoyEh(y(JL&a&MUo;;I9@A(D!zBR=(UsTHm_j?QTZiYuao84{6UD@}yAms7AEZ(P zeio5P_L`&c#KF%ZB7<)VE`IM`HN>Gm-6WHnTltqwQ(4&XKB=tKt|}a|fdU&%14s#` zNVpHM;T(+@*_qUV)MTVJMUdn^n5YQS%Fq&Wv0GLWeb$5+5>arw4T1|>19+(6?LQnj zFd|qKsUXCNp7JKIo{`(a;5w|2qU2)4L~wKV#r>R9S&oAIPHGXElLT+b z>lWwL$j9O8{-EJG3*|V|_sf+iFqvuR@lSLlz*GDo;~7gGAG*NtJ>L_%iIkdpMuo25 zE#yM|u~;2H<)hjDsUCdbTH5*#Lx8L+3~VQ1(xYG1dd<{`w7L}QyR^Px9ct%w)|;Kz z-7e|#?di6o<@QJK)7K;cVo^jpCd;)-xh>$g8g*hHra(7!fAQ(2_J-MyDMOXZAlrU<&={*nS zofr}AYek>xtvrQbkm+Znx!Hx_X6Y)hEZ0_>Yjfe*D{aq1`QJirFo(B|xBuTDej{&>nvD(g7zL2Uh(%W%YGF}G!^iHO!? zpBA?tFyyvtj|!@OM_wEu_!9$=r3~?V=`X5u>`23{{2O)30vNq{H!5;iUibLa&EnVu zXVM}6^@r|`Wjh$Z;g3SD{1!a!2s5*sT=otAr?2lBELZh=#vLv>K|#-vtl6t4StYaW zC8^>jlCXfB2XSCuqOtYeK4zND&(++AX4ttJIdSLzQJPxJ{3&iQ=9*;9^)?E#cf&&_ zOIhY$5Ekp3>`txF3#GAo0Q6?z62NRk43AS?)2eVyR z;Y=@mr)v^16xJimG!IBqT}(;_-pc@KDgp12R(|oPTj@95lZdCC8L%Mao>{ZDbyBo+|soh{oh{_>FiKg=P5c@O;+y0+E{kP&c-5kY~=B8k>yA zaEn$Vv~)m%q-)G^Hhj7Idh&Bv{ScI>o67T z+*OJM;UxO6M_Hn3>*blx{Tg$hziWjh)3!tm@{YnV#QG5+SBMRm(PQK%9BpyT&yHmjUUv| z&Q>;gHG#`G@atcV+4--=YJV*Xj@7o4g?gtf-M>KD-A@ta;JToK29t7je`C?J)g9}Cr|66dv;mmTu zynWip><|^tm(4U!dwpz?`y)1=hwU_rHFT_g$1%{U-7E*YFM$kaef4T;1w|IMPB@-# zK_h_~^60Ai;Bareb;Z68qfg#MAmi!hyExb0QASK6jMXY=7@Y$MKpC z0tpiI;?X7i_w^+RjOly7Zf}W*-Mb;)iGO%h_4R(ZxYNZO339+$U>={%+?uct zzmaRNNfAlq{Ac{24vZf%5fA@dH~W@-Vf-R3e~-y(1Rd4%Avg)t zsRtf4?MFwSX+^pl;*#6RIRMh68ig@{K_*~1ABgr$MpLjvB@+PS#{Z8f5N`}j&83h8 zu6JhIN0x72S4^5(4bJ42lxYM?%N%)Bc3f^R@$`mXU=IOe+06!X6w$j+m9p(mf8?Jf zO=jU)b)SoG;ib^vJJ`Gwy|84Va@RY8ORI3CstBM~8sk#ywOR-;Bc;(8UbByipK8cC z`Tv;zg`3D0SXR_Hv@Tk0-IbpftP;z>%&OP4fH5p>C$^?4)@$htHO>X|B~xcyXz zQ_mE#i=PB8G-{}d^X;kxIMu)giBf{7jSYLHOe}}50RKLochv4s`xfqc_3e#|+!gck zemZao4GLt>VE`_nN@#SJAs>>&Nz@a>@2k-2=2Whj89B;wE8z-saS7%OK>^^mojK2l;M>^KL|9XiU=m1Z_yf?g=To} zH2-l6#t>>SXoaSjt4ChO*ueWLeKe1YIO1iBjj|O95wwm1=8LF#!W>Hi%H~*-^>0-w z7EtWBEkR z>PE$D!u7O9)Y(&~a~u4T9`;>-^#rAadNJJKZ{7Fm<%f3a$%LVAA1WBw7p1Iqv@d0y zYwuF%Ki5g1TrsP-=qaj~JK9vp=rLDR>?Wrt>@737MygAdFH;96NtV(Tsg*c5>QISG2`j?d=Kp82%M-8Loaz3=u$N{9ZPx(Z0T3bKb-N}i#_Q}Wx!Lk=yT1(9vCUr z?Ua9Ep^x-BV^o-bgt*^3T1tBREU5788T$7>vuKZfxwA`5qxry0-7lrl7YEAZ9+x}i zp^sUmp_d<#i(VT;N_IA`NY3H{K0}MT6Hce|>o}reIx`c@9rQ4}0nJbZnOHNL6}r1F zkIw|W%%M%NM4r!f)5g()Ur|$lq+w41T_}}VyEVJvy6Kzg?|4adsH?BO9KODSvvU+C z`bNAVcW; zlz6!3xT(oB)xt5Y`6a1oATe>x`hR0#7%6kL$%vhEU|~$d$cl;RN<&k`Mp4aHsLc5z zB${|+#MfoONzT262HOD++fi^}JAeSN1JFr(-~c;dfLsf8L_g6A5s%kW0}Eqo?~ch- zm=}D=Bvjy;^Rd`mpVA}6FUIPGK^uUqCYyz4CPyR#!))Fi(uu*aj5aZykYQO-Lw++1 zo)zu2R~lr2*ea!fs7Il2FZ4*|EUpA%Dtm4fyEUsPOp3``AwPv;h6n!Wy!jF1KBAzs zp(`PL@cf{+^5FFS)37{0Dl-*2sHqi0=INU!`oO=ZBD zs=~v}Kr{!5BJ1R?6XlWC=En!tDx^-#FA6r!rCe8Wl1HG3*>=K0C@#LkYWqv4!(C{)Yk=bc#ETc(CD=V$uV_=z9kj{G z^B6AVd~~s~rDzU!FB@L9?yBUsYzqz>H{s!J8L#hcXK;_bA|P>jkK@+A&`cD{23>JV z$xEbbB*~B-wiV0=cc3xdB(k;;XQI;5o*W}@+V-HNja}FgGsL#2scjcEROdhg)gO_L zTfr7hnXyol6e7}lcI?dxVJ)mpR7$>bzoa_JFSa2H>k^=ynxOB-Q1=1z8;WYCXq=dt z$uKbd@(WxU`f9C66PQq+t*V}>uWw4WGFwHv;!1X6DF;``j~ZelnlViMewGHxt$qt1 z-f1K}+=}dY63z*YD#n%Sdj9=P-E~IG+~L~FJ*pk(}0E%Ws|D2JE)drY$bxje;`)Oh>^|-+X{snB+eCUMp=`CciCPkMI}0 zac`Kb5IDIz@pPuT#~ag2e8qd!%ihbC#7xp=!~58G9CUb;Ls*tvHK)^jb&uPvO(@3& zpJc~ffniu=cg?Xk3vZid>tg=scpB@1j{+};2Y-HtYX^b+^Z!Z*7-Cw>NcAL+yRP75 zJYFe>>o5Tkh^0)|k01eak48K6ALf61ABN(PemFGS9Y5(+>v#l9J14q%H3Q)QOXKjW z+J$OauCddI9cy8G#-iy*v8kS>>53BO>J9^jEut__HR7f2995=w&P(L7Ktw>-E$vh~ zlFI&h^w^FKL^j07*7a^zgOaQ7m1G@wQo7{d3AKl4x@>4(api^)Ey6CI!226XA%x;j z)YMU(JVTc*!KK1WOaR97N(gzf@Wb83xuSU(XLH;6j)}3FeE`Rjv%r0xTr`VZ0@KgQ zB_kV!6-v1x4O)rsS1qP84Ncg=J1z0FPF$eoq7#!w=Lm9E6{94OtxMN&1cZP+B`h&=ZPLYr!2X03 z!vv(+uyF>pa16W@u73S@MFN@rSJ{<;P6wN>ipJmmh31E<)@|?X2-42Ybu%`a^r}&c zGH~Yi)_Sp}UgU_;h1E*QGHbL~(;49&O>ZpLZYPqgJOXjnoX;D&WWx}Aw_e|RO(a?0 zNwS;gOaL}-L01$lDY-qX^@ERbe26o6w()a0^AYiTXaVLJO{7PA&s#N>$NejT=UaO< zR)2Wb1%TL8kFX+oV)-3cIV8{F-+Q911kLMU#md;L>WVXwjg~9hFX7`d*5VQI8T8Bp z67qr*;K`RXB>#p$!SpX}`0M~MEpO+@b@+M$@2wx{!Z^wEUrp3IvUf6#^YPpw&dWwm zL80j&9QnP+LKen$U`Q`O%nNL5j@xailYLs~o2GvCwOH|Zr@#N{_QxHPn_}W{bl843 zV)_No*M&AQDpmcQDZfZ);_f9!*H{(;TNaC_zZ0Qv$4)Wc(bg|=0bS@CqeQlWk zqa?Fws-JrG2n<^4g;qh8@VRnc!`8x_<=!nW-sJPJz|r)rmm7uD?Kg|G4Qg@lR#tn(MqynhdGuWuMk9WOr5cNfKrya*i6Cs~y-FlGro;>GlpY70V%?4QFz7LYET8 zZK^o^=~H*>C#&4$FwvYN_{3-T0>1)|Hd`nX_So=(-mI;lhH0X#f37i6$o!<45+qtj zy1UVj&*^dKxjlMJXbXak>5uGp4x3s_zhkKIUh$@t099-SU~3hUwE*~jRt7YV8S&}w zi%GqDtFNYkOAQMeMjG00I)*}L*?04`RJ{i{6!?T_9!fl3g_RgTX6(fy){Z3HoG^x$ zix)ng?V39sZuXnelHTf~nmA@MUKpscY3%DTLRv4uhZGv9kA?UERQ3#$r|plP_4Ght zg8gnl-b!#%m5i5}*WHec}Qz=jpQ?vBNDf(bRGQHS>wB(rO%wu7wR20o` zFE$x4%RSDt$`V}bjCcE+sVJNEB{*i@rpYUDs08&t*D?{5nkmPQFxd{#GIQiB{%r zXy;UxsxuMyBo4Mq;Uc(8;jZ|L@;#Z8_gFU9{Xnvr)m7?d&E{(=5tK6Fkiacm0nEva zL0|xhbqt%QIw+_?s>?>VlyBCSBanz9)GkgSjrh~6EX zBV^u;E$*j^pcQY{hyh2%5iJDKc%7l!Cn(rSm4_SCL)!C(F4xO-Z6T zZjarUk0Z2b8xN@ziVr81yT+64s$iBy$*_jfyZ1oICGrkOCLQ#BC`5u@U5W0P?em}` zU8(H*Leiul{O8T#flqB*Ar{})ww%Z@kO1J5{4Aw1Rn0EZV}Z>zmzs2~oY1=kC}7M9 zCGB`j7#c#?Z+nzILytf7Z1_0X`%xQC`oMJ571x5ZEh*fIr=u_lETsEG=t6~D#)>%E zgA^C1-jvE=iu$5`J%?_bO+gnW^CpfyRBtEALZV_1O%$waIcKSrJtf1jisZy5V8kNn zc(WDqcBpHZ_{(Bff_jtH;jR^C47)sNm0Ui6tway`I6-h%O*1ANB)BWkCNYhl3A}sq z$b2C~VA@EWsL9CHW9r2+&Nvvexwa7ErE^6Z-}EIWW@I)gZU}-~7cX~QrBb;{))I@4 z*TydwA}%C+G_Iw1iq>WXitLM0gDpv%vcp-E$llFnJ!f~s97-yhlC!|5_NLyS*xPD{ zQH3lRk-XE5O%Z8AtD6T0yuqb?6?aZETYpQTRQ{Gi6*4rnV65eDwLeKXdxs&q84&+2 z&O;9VP9x^tB7KNc(KN=%=iVzo(d!S>w7~fO5wGQLV~P|_SEXvhA$x;e@)6HL%0&0S zOBnIb**KVp?hCNo-s7=IjRHaM|7l_zezCM!a@2h(qxp75$t~C5BUcs9;TRc`e4ezToxd2X!&A5&hPZWulV)C6B-lYI|IDePel? z)U>XrTK@48Z$@TM$5xc8NoGVRqvi2ayR^I;P$q~yja38^WpIDIJo5&0T+sFN8lHHD zetCS&lC>TA29$OKsx5Sr*6=Qe-IkoCDt``WT>o$k>b?W@Q?u>SoFtN?znoBrmjNw1 zAi{R<$lsUM`wP;xf%Q|LUytTA>D*J_$~%DKA3?Rr>uGrvGqH#&lC6X~-DjzS$ zfyze)HEF$1qb-=_QUNe{V*AH=Hoq1$q^Z=m5;M&+k!7xKcJq5o?dartKp1O7o(3j! zSlNCB4nI>gT!>T?CxJ60XZ2Sq3ffn2`5@3j03|Mj5@OQIcRA5^wbE+B+a7;RA8vc1 za@<^7+G1!jMar@`>o_%S+ZU4{Ls?TPr@m%Jnww@*Qf8w6;4y6w2%zK7GanrT0&I`N z-#VlUTJ{U+VIhLjHG{Re(22s|mc2dNq{B7(rNYpMHxv0yK))JcUT`5&=~cN#aE3+B zpL`z2Y6QJ7euE~8y_EMd%0=B(_b^QqF4+?pqt0LLdL?(NY>(#4;SFp19hrIoy4ppF<_#9)@+1gbKwHSP8b--iS35Afs9D(9EbIm!StL~{csJI5 zRy=9v<+5|W|A%GS3|&~%QPGDIZ>8t*w+Bw1iTlk7lT0yP3ju@{HS@OR$ldpuSTWJ4 z(}|z2eELNnAB5`PFFvGjNDqiAPAU@@w^nX_1XUL{&Z~aYmgfK;-B_$7O|g<=it-FH zAWNI{S(A#?osN6prk5S!16oL6sqxbZ7miFb8iuY!KKLSpq4?aXLrfq@hMdnaO26OQ(;Sqi=Ij!N1@oggZdK(e z>7|MGpF>S{&9f5pH=Dcb;| z-K)#Gu5N4Cq<%}|Ut1CoT=Lh`Z*+f~@HSy-T3I)Q9Kmpen=U}KeVqk*X;<&b=pA$F zp_lGkt&&Se?>7`OvH2YFn--4O6*6blB{btr7%)*8n^Bt5D^|Ij=%kW`qb#siBXif=MeqQV8QtZ3}0)kKEjH7x`z$z{_AgT z&f2@PBC7te{NjD3WVQVnz5ix4wN{>NeA$B^`iTKhgjYK` zsk-v`N#{>nm*-=8^zBQtX(}7I*%Z0O7qMX<+-w?f^{{4UXtEm8Hix|!FkX1A=0Cn< zTWLY@e;8YdvOgnQqHR+j45n}lR{V_gHigmQO1!dYPNe62ezoyP?+#{~o}|@EW}Rq% zEe@0BIQTf5p^_7Wj`!(91)f9@|G}}Ov)rc{--B0~xS>`a$FHy>e#`JRYcA)BH5eIW z;vz8>k=!&}ZP7_!tO!ll)dpMjMuVG4t%)olSy=uEZFlojXNCa}?gj=@bY8gOE+FbN z9VaVag&mEKtF2yIhGazU;{aKBH~bq{W2E+yVHt+g;{kiO@z7UxJSbKgkf3a!+SrmW zjXk&=q?M)+ZUTWbgrHp*1+_hE`-Bi(>11si?vNmw_I@#^d33#r!tY#%>s^R5T#$~c zM)|$A36&x)hDX$9t$b7}%JUIcoh_OX{x4;!F9w-z0%nAD)*sJ5oCVk@$f6aI#7O&b zWm?ghK1>6Bqw+RHBy4TC$4Y3NE<;>NVJD#+UlNE_B2q}D`}dBC42ZmlENie09{L|m zzvD~|qurY&LS7MJ1>MEy*6*{`c4?*tZ zO%Pp$m<*TW|4&-)+f$juL&-C zH}QJ@cUfYm_S8xw|KQE%46F@$+`{&s@$^8oD0u_uAmVZ_x3i{G5*UA%YH7xNL-@di z-U#UlJApkyuN7Y12P<{?&fp6jS5!MN`v&o%*JMTxtv2)}+-kGKnK|c=WbUUUTmQbn z3HAAsu7Ao`#I|d)t!D4fL2{w4L?e?=ht2wPvbFUMMv1j|@IN)9)K+60t=Peb5VCvQ zQEc>7RIORT6p-mS;(_JDb-d``vKS&v3rPG<&r(?#il>%$~1EYnNwk#DV7V2!=fCCJtGCCOtX73?U8!Mvipi-_ zFiE|}`~yWs6aN81+lX(#6y(M8sD?okHyB`_$jS2|_@BlJqwV}dW8^-VKc;R7vjHp- zY?DT?g{i91*C4at_#k$61-=28A;&U(5))8%JbgznDZDC02DcK8Ni+sK^TRl)X+sqB zBrwbvqPpwMM%_@vHL8%u>O;XSAuO5V&>9$Y%X0WO^&1WG3$)Bl!E zh|_#{0!k<1%l+k8TZvn!Mz}~xZO@$o@n^5E5ShXO`%IE%`50zAh(a!ETXxO<-G5K? zQMW@nRKC;f4R&0K(H{V3f+G-pZlyP_Q{3XX@lfCwa;-3P` zxT6h@kqdGb4a;p$W5=<(ONb=OcYSz`zKd&x52|P${aKycZyZX!-T3A3r`gxzH#>KS zpWl<9W%$&7py&$enqcnKMz?LxBKk?#=XSrg@4m1Z;UOSpOC6!))+ zi(PRFt-29h;JhUMKxT&U@E1?EO8UVsjKluxpZ#o)5t%3`e=V4r2+u6A9T*Cqg+k7v zi2#PjC3Rom@y9CI6RfwFGx^sSTU*Z$PCl?5nWH8{mFni5F^${+S&)>vf0erpAuaBv zOTsMt|K^)D(It_f^S!cR1cDrW3AvR&Mb3Za%ZRg`?Fw8;ND0dix{pH?PqRuXf(`b-6ze0Avc+JK`wv*~E!WVkR?n@r)VV)B9s6WU zrQND~d~0U@uVn^T1vN(XBd46zgWBWIz~8n}b~gG41yn{G;o9pjF);Ra+WE&_v&rnB ztyz<~5K|9s4sApF}rw zdYXVPTvEmBAn8AX)1t}*t31RmLzv2HdsYsF?E3dlE#H}0c71G&^L75WRn{Wd2*OSL z^!)$JD+_|=0&WS>Kr}KRkrv*pkoPl^GRqTg()Vf>Q(AcCDn0A28wI-pqc{;=H>WpK z?Xc3PAGUkSTvQZT5ZSaZ^BjIv%CyHT%JHa*nbiU=XNUQNyw3+O_1wX?`n;*wmGNc4 zKVE+-pN{vD4MD(@VlXo5E-JxDz}@PHL&CJe6l!CTWLWpcwccgdWV_tbj>PoTlw|Kq zREw5!kV{E^MX7=}C{-)Eur-A@2#|>h9IuL5-9;b=!-Ku`+{^I~Rc0A#W{POx6uj|h zt@J^dhkLlpRU#iu2ymn0=kY9sSbpA|(q|;J=IDfR`qg|hF^V(&uv~2^nW1?VFHBE9 z9Ue>#Vv7rkf<%xk|7g7{g#s~)#7+Z=U>r(f;n|krwWQlLSWe(cREr3anZY0RcQfyM0!eSiz&a@JZ5ABbns_~lh(d7vu&sbpJ z@&-~2R!)0c{!9tW(P}pS7lpreP3PhdcZ^7`!SoBk;KAT*1lQ=uL9v1i}k?#(^RhN+Yu!q1LkQh@lk*j+FiT*Q= z*K}btwWm3qBP7H*Q_HJGz5*NhB^*HO)^T=6QP*h>lirzr3cO+tNdpmPuDUP?)v9#@ z?G%J3sB8{zKuZou9X`!f>bGxaA~21u<&PYY3BsDN_xpGy(8kb-cFZ>B)bwl1)xR3t z^a)S_`usRFBo6{XA}}mI0l?hG|Kq9?lPG5X}x$*YiU@T zkjT2vr+2}vaZTH1whnw|y1=zN0!dlo5+$_+e_H}djV`poQ-{boz;ZoDh{B7LH@w6^ zS`3DLD1Ih+V}=x1qJ>}#b_J#YS3tsxlaGtDhH79N#~7;OfB+|UeOpG(en$=3u^MDuu@4gqJr>>Oe@3%DxLKVA$W!|?BK;(jW98kNJu9qw5@3qE1!F{P28Q`k*K2~~U; zV`XMMKDTA!odfJ242?ObneNCNC-rN>DD|$PNU!P*(zjhai?P`ii<(16+!}Kq8&AGh zd&Qi7=z16BRb93yAy-l(h%dpJaBGopcd(2>(p?f*ZHm$vlb9RNRCJZ zV?%bfS>zP>^b0&0Hl{t>+zkmH)!>5UVo_i*N6~HhsK&s@eTDB*of_HbAgq0Qea3wC z2~}q93qtzs=3L+XmI@mx{T(Qy{HxBK6ki|fhF2Hbn6=j%j`NxGHqsZ%4p`NU`i-in zksgzecGET0izu`wgiGMxbH_X5nVJNWkBcMC%^z3AJ3`BUw0WtY5a#1c_qBej(POtK zGn)Q^O64-$8L)$$Wl$;QP|%CMIEEv2j+G9@uE?QER!%Xmy=_z#`6=#H;bX)WzQVNj z>AQ~+dc7$FO(`BEuCfi8MCJ$ucdlLr5s8TR}unOF;J~zr(uXQZ$47 z1T#^Hr)%8Edfedc&e}H6M9k_7lWJHA=1_bH8j#}eU{YTus;JfIsHxEx7GHiOxdU~Z zZyorF4Rv8soqZ1~Vk!`}3+kp&uqT6MCl)iJvV(09(!Ae)Z*Rhq1o&U85%{)MxTEzFW7Jau^u zvgB`DTd%jCe?;D|tRa&h#Nje{R)m6R7mulb3M^3)U3<0OrndTZ+?9Sh>o!OyqA_(Y zShMFtEY$py+Hqz4OD6lsZu8`<^*Zj)?58fjJ89+zFd|_Qi38S>2rcr64O@VgwDG^n zT%!h!Oz9A1UMd)z`Uh&iFcPF-DcO_dROzG2E4I&+Q_glTymlq3Lauu$W!MQk z_xUF-mmA-IR$_#QHj(EpK5}lUoMJF#^EnYgp4CDXV#h*W`6|)j;tSh6cZ}48y|gCY zQC)xtCq>&O@2{b=r{1#$1}t?_!e{r}4B_m%e`UvoFP$D%TZLK=&4|1Obf|vb>VOfc zsReV1LyOYKfN!th!OJnKWIrColW1Yy-W{`NpqisNBEg1I@@7HA^_tI>D7IejXmVTG zn3~{XqCa>IH_=>u$JLkx45fyQERAU8Eun7)SCZpF^J-!S$OqusM3GGMD_76?de)0^aCGx)6H-EzZ&U2eGs_-wk4ZXy~AJ5XyM|wd& zW|S2w!b3XL59+sspP3<*Roz@P8=k4t%*5R~yk5WmIr1~shjb#19L1f*4$+Q~fAVtNGq1MfDzA@xt|Goj0A=rP98 z7AquE=`kK-4Q}J*&KqU!+O+p|y)Xw0maMLbs(?alYR&7KN-WjK(#v>{4aZsv&!k6s ztcRgVSeljbTbX)i?gvV!#btWPz~>w2Pk$!%Zxfad2%+EX&8nKsP->NCaoB5=}{qefrNP?7d+oNEG}W!*Y7;ZWS|qTFtJO<_4`$K1H2*=v z)nv~Mt+~5YWCA_C|6+yycchcHeblk7G%6V}<><^N6wvkpD>p^1H;4iazRqCvA_;!} z!}qU_N=i6pV)t78qcXE_nJ%vSRm-jg>YZ7*46TZc()JUd>&=138+Dd7j3pQ+f{|3M z2ff3WXjEx6yY!zQT@7OQ>d0KxS}-+>{o&#O1j0a%-bos1_R@UeDV*!DWoHd)`WJ?R zm8M1r-H+WS-m>}&vvI=oors#2*`uQ+{AC3Y%$IX$_7M2`JxbYAuh6w8kw8abj`IFp z=%#Dj`W}jp`%Ayk=Z9&&=k7p1f$tcvEP&4Kh5!k(=cMI?HMS+18m&>;fCVA>;|WLR zb}BwI5sV{*GcsJe;HLZt6?Zr0+Q{eFFHf60Jo>{njt=WFJ+NTA_*cNjy>R>*Qmc*xX_|+x9o85C!5`<+n~i zed*+_U>)IbUr85kS(<9{@hE;DXT0NI&S{Dpot+>rwD4p^Z!q1&v`2#{>&YbfePtJJ z35C(wufrkocy6q9$|Iek&(6kSH6Lh9|58sgyRYmw%E0oQ)c=*e=)icsahyhtA@a+- zyy|6~TJ`MzL!T;yP;HcMwSAD;C>7`f@DH4@zKE5g;?aA>V>nx1kLLcBYu^sxs5dFt>^ zSCE%|%1&31t^PSx2O2xgZLRV!KY>e3vcPIY;s>QtGQa~Px3aY>?b*82A#)z%guCvB z>Qydt$U0p-URNw2C1mY{oz*xx*>&Cn*PAeYvd>ZSK;@KQIGCIE7!VEo4g0B4Y|1)5 z3)Gvot#Z)zsF|`4BwmCtd&UCTqNBBrR5aRDQ+fqfL&iw|=P{KlB*Nf1W8glORRLzR z%~?V|Vltn{eVC8rU->`E2cAyW`|uQ2;upFpmfICqwtCx{HBrCwD$}#uHG#i{$s89J z-|p>6#Kl)mHI+hJ97^cgpPJ4$IadQiH*v&N?yWF#vCI<)y=XjkFU_o6xzc$oNq@$H zz^GVhgl>AHk)tyr*)Uj``K#mt&0M}M1Te|&0P zv#joy1|ovWjC%?DMz5s1#iRXY$(z8ErOBC;?P+Q6v-ipu!tFdYxGR%R z2o;meN1uxwOXX+!t0!Qh?FJQH1Iq7Q@m9w(s#D%}OdH6#oOi-AlwDZDM zi%LA#bwA6 zZ=mT*oW|y;9yv(`&0_e&?sQr~)1kl`lO6T^U@R)h0@Wit@VRd}GLhPajD~z7ugla2 z7Lcmg&`ZYetyGBczd;9opSx8hutgdA$!ATH)^Gb`foeU~@iSx(ubADe5|po4N$b>t zcmG5}1Rz*Kjbg~d(;RHy$x)JbOr;l?ko-@W#A1E_2Cjkj5TFD5#0OqFieH$^`_42s z!Trgp>$7jvBlG!;Qpf&^J-Eggj8Z)IM;PfTFeO2@1w4hvOa>Fg3V+w%ScN|HU?Z<_ z{@HopH?8)B75~r}*)jTb>PWOybndojAA1YjpvLZ7?QD8?YE z5F=?y7H4F-{SM;-VO~@K_OHlfju|n665GAmlkoWiny9UjuFZFWg|4&<$V527eL!dP z*4wvyL47SdboT0Qto=&0NXlUtIfTLV(t$;Q`HOGh1y9@y&wZ zJdQ0kgwd~D&=Om`pQ7u+ZF_%zZK_RjGb6*2F8Osv+}FF0U7GikJvS@2kFMZpH@T<7 zbPD3L-O9+0Sd<~5&jZ#$96w39r|(>_p@Jvk;-Lugz5q6V+tMOQkZd@x`VL2|zTcyn zjX6>nemy?yVMge2-sNu|GZ)=tP}53L0oogfH;ft$n?dpG3&JWz;mm>nB2gS@$Y8qk zImQ?QuzOg)1|*1|rIiAgk_F(cA!|R(8@F~{bff%>L$wbt=I&`$r6XzWK{r)bkakGd zs0n19XRAi=_B0TQ`QBTbs$`JP`6f`5($x3|@IJi>0N&lDdfu(^x|BvDJ9aV=>ZT>nL_pL4cAq-A!S6rVeGKJx0K0Ed^Xe~l zzXo9Iq5hb0cc3E&E)&3wIXR)0>34<*li)`ivwO?;QWJ7>K(mVe&T~d#vX&wHCPt_Q z1W!<{X_Up_|2fISO9Aw4cV<^d3Wn`W`qJrX0Wwv54JS1snI193YE5>bxlAP`OaE`U zX%Vvac-0sH-SxIm0rCFv%fDb-4$kEAR&ounwkdi65LOpjPg&(2hsD&_t!BZZJ)b!_ zOD`&7e;XN-`@-K5=?Jsk`d*f9^(V4W}lm9^Xkr8CQYducq zhO_-sxaQ#>$I}%bmgbbBnxj=&5yp)Xf1v=GP-IlmFMK-RW~#lt?X-PoWYs93xBJ4YYYUABQSIk^sRd>=An)&3ZXAM2XcxhG8neW*f{RZ%Qa{1ZSWuB) zd&p2lhg&&z3KC9I_eR$)8D(1*9L5R~R`3@nC!3AP7d@G-{e-7%3`3v@Mq?(02f}gE zATvSiC7v{pT7s{Ax#1waaVE5U6Vf+o^reK#^(<)izC(ijH!NrZ&C*&-1(%S4AwIN} zu_8-t#pLNGRmt7piyBvRET*;I_c0CW;h@~Z9Ytf;JQg(n;}%HSnL3u>{FOKbvlUaH z5_#bFz^z=}GJIIt|Dvb4hG zja2j{&&{XJOsIU(-LhW3)FUJqvW^6%oY^X-$CnuNBPm7wpVRwY+@7Rv|q(d`U^Shd)q6A3Q=*kneRBC?NJn)_zi!an7n%Q-`aQK&ZRwr?yRS zBdUwEANf9(A=}bT@$% z$fbZ}#ei!-zT;2|x>C3%#2JsF-S?$O$G423E{2Lz3*N<2sh`8IM9$D>JO!LSbD2z) zb)0#R15`4eSrk4W{x76WQBDu!c8^fQuH%n`=PvQJj!`)?{Ycs{8%}RmL@HKOGQcUn zSFqn$0+oaBO^z2v>MP9Hqex%;#{=_ubADepscC;;I9|x`@t2JfzsaAl-^AKyY{{Mr zcGdq#FZAVf#(;;>7Olre4oX7P7#q<^B}af z6$uh;E&Kq87np2~XTF+zoV+&AHym!Ty4YkDpK1VUPW0n$-#HN41KdP8kc}) zV6znW8EW;|rz95Jzoi~A-20fw>g!&+N~5Z;5#c{HU3-$XFneCSdP^yPZ1sxaGGs;L z1^THwhV!aVav+X|iW}zF&H})*nbgMJUrzc=SEP#L%qk@i2lv?>({%a+-OI8`>dFRM{Qy^2{$B4tuXcZw+IukYelj3p_`5D4vR6CZJ&OSXOm{l8|rzQhI9H= zAOPY!5zd|;(@H`@|9hk(UlWa;ElBz3kgT@&NY)?Dl0l$OF$A}L%L7)^5X0u#l4Pqd z877G1-r{7`Oi06)b%s1#H{)<`{UGcnj)XiCYW|AU4eh=<+~E6&X^O3s8ZYu$){XTD zzA3$>A$O&Rcgnm+0hDXh$Hd~ewji@9w+QPb>lVT~$-=lS>dyMf$xhHmih!gZx3Fh| z1Laf+myi(0t@DpJui;_(g}!&yMFF)kcE)3DT`)|ZGo&KiPX+F$2oJh{Yl0){IYwOn zbyxTo5*yMYsvK89#*F=p=B<7tb5`l7{=G* zqH{NAC$AgasQ zZRbKws(bQn<^oMU*KMUB63v0pa1;!@E4a0rmOMdkF0{&Q4@ZT6y{OCWbAsqeQ_2^ zn@_d$jc=xVd?mi=Heq$X;LP4`=4Ey|iuTRrV$_AjdlUT1qZZ%Cwm$ilt?1qTZOzAR zbE4GF?V;pc+ofn+{k5n|aa&c5NM(O6k~e**-)+90{rRJ~P4+=Xv=!L&ZV!$g`_;sC zQ~9gie|PqHHfjF)-Z*%8Z0zTn!OyJ;svtk{^!eBELkX|}@302k-9>>#|&^R7~yka5ci`p4v0+*&7M0*Zd) zZ%+%z?BnrrXF}?2)R*#W(9L zxM6XIH(OfO+Q8#leF=LyZ+ zK~&ad9(a>P!F|f=0J`ua4KI%3c;ht^bP3 z)!lK+uhxKy>ete{FH%>0ivq0$#hR7F)+JH?(ty`WTkZS(_O4g0o0~&(>o|b(dDO^f z2nZ`3{yH=n6Ix0fwc~sO$UL)czl${;=q~8iBT}&47cXm^F6jppgjcwz+m*0Qx|IgF z<;dMavlQgA()9P;1j!A@U8E<|zns3q_rkn z9jUryg>9eTX{KFS!M7NRV|_a>rgGnb6F6`lKYO1JMO1G{tD^vr@3G`B0_X1EQa-4u z&WFO-sHJUXRuVCaLf0{^=+V;;`3Q@v5BHffe`nZ53t)$0G7BU9Ia9D|6SEFDH!(!h zdx}1iiuJWMZtc~Ey$yiud3Y1JYDivve{AN$y@;BLLm9V5VN2ZXy^L;KkZDe2TVTjs zL7UZ%o?Jdv7xpwFi_F%#rgiYE<4K*re5s-et|XZ?!Ib&|&l@fDo4o^wLaFsrHovD+ z<%Vn*Pf&6J*sjoq?#O&HwBbP(5 z%-oH;qM;%AYIxmpL2iO(GBjidUV`h9bH{6iZ?)K)4eGE;g<72VTU! z=(*7<{h|}AQVLOA7bl?-_6dL%x%#l*=53CallgEtx|qm|_3>F1YMyN`CQpzSey-2k zC|Q5_f}P4vR>K3=liOC5ZR=%FEdAte|zPsL)xZs8uA?o977 zx|Jg58J9>!6`HM4^W}sIwUtBGuVpwiX_v=y0+cVSB?BcpEKAlu30(c+11b&5WWf!0 z=&xJZd#0V?Sk%B}P7W~7q8@qZS45P7O4r6STzpTa8B24D6N(>wMH9UZ=~;K?wqG%v z#E=M+o25Pp8qp@&wogtWH|Et zSa79Ayp*p%M|>nx_VHW71r5Mi`83lret*tx5B6GGNe0_Qz2B5O2eiwHQ+U;`?G~cJ zZ!~O#T!nsx3_BUSa5)}CQo~GEJ((X&j}YG#-Blm4fBjq*>}wv?s+0+GJnCePgmhl9 zy1R`KlJNFp)t7i>5Qd?_-4;g3{b<_~6Nd6D{V!&%b2tiW2Mvbfvq+*Oo2Q}k6x};5 zBne6;^>@9mXtP{X2J*o%Y=eE+adqNed4{ydCx#fRYTN|C{~wL8fiIL$E>4LLmDUM9 zz?i(ZMsymDCWx>~VrPkc-kNe*+%DE>&(6P$J>~_rh-=zbA@70e3|xI#F-SUqC2m?5 zn|4Laear`oHXsv?7udpR26!fRSX@EE1GS>Nu9@by${P8&7q}|3qn&Auc87v=Gw~z@&ms#&0 z?+SRGROg%Ee4}5hH_SHK3yG=hlljoO8?-i1i%WOvx=RI(HLgEMge5$nEF$rtV1VAI zZCq=-62W-t)k$-pjY!$76PaRHeIXpIC3x+MkR1mCHbq7}%JpyQ32TLDx#MZLfZfp&sx~i~a>z^K9TzL-=QV_ePCFUP>I!~ZO{R3$W#yYfO zMn=~_nJ#p{pGRgYo8o*q|M)^2a2_|m!vOz~JV=)Tq{kt%(#~9WGF=--N9Aq5&tVo~ zZ56F%i_2Ba-5cU68MDE>jt0zwAH5zQPY4sH1FA(S291gGrhrXw)Qr_o&(g}CB#LS5 zWb$w*#lh96%Bk)Qj!TY1eV!xwpId2fRGS*l6NppdINm|&j=}Q)KXUB8g-_m~r_3A; zeYs9+)~469XZtyTH1xiK@JL#Puda7vY0Z!DETUtTF z))Cu0y&(?Nls)zRuFQ47w!o_tr~R*OLE|6W0(Md@8`W@A8KMltO5Mgq73~!l#x`mW z4f85V!i9ABL-D>g?!Xy)*{OyNR+-J>gK7lV6Y-R}J!85fA)s)pest6`C8nI;zui%- z+SDuqc1;X1m`bd7)iHjoJ#mpfZ7B5;xi#;h^i4zN?au7(2*oQhV4eS2Rjd)qU8%M_ zEFa4>A|JG-lxGXlH#>+<(hOQRX#he=?8p0#1qchpf9AlZS55T7GVHSS6PeYDuVqqyl*a?WLhwuA zptbHQd|TK$)dM!FxXP~%^=61&@*GP(sGDp0Ata2gd3fP{wIZ%m(XeQ)EjPO8deGi= zT9{=-+0wE%Xbli#nq&6zXhc$aflP-gP+K3msk}h(F1nb#kQ_-u7kcAA$45=xpdc#q zpqVg4Ir>q`9dvtVG3*Qit!1YheznS+`=gU;NvsBS%SCspe_2y9dGgYI>w}o~OxPzc zT9ZiZcU~ZU=Oj-7Yc^hKTY;5Cg7D=UWd?=_r33leZME4xGtA!DC2!CX%nMP&Vg9#< zgSdVXH5|N?yYKQq4X29gJ{7NDypwZ8zNBr6h~Xuv{Z`Dw5J57gI1&GEq^iqK7>#J8 zrdMb7W3fH}T9HMMxb|Qys8rdG`Qw)fWAaOq_g=h&3%2jn6Um-r%mi0&ST&K4>TG_% z39stcETz_kx}Z{Bj#XEUlXcqXwLxveDqBqaOa+_=0?)|(9*6+5oQYFD8&}ejo!O_ z6yep=zt8g>x25ZP8gHnMaT_bwW8d!5EM>WEZQ)`HRe?Z)(2pJ|FYe)&+i%>K<;6ly z=H|AoZ2!^+G}>IB&FVfvdkbe)5+9q>6Yp|UU6U9Q1;c5PlOC!+GqJHk1BNv)$`$`4#<(Iqz)YdNGo*eI6(7LVucR#-HWo6 zBAt(oZyi~v&{E^ve%%e>t6k!VKuH}I6rSRU@I_EBeZ50xUVDbo5{gCU@Dvta_IeJ& zNGA78QQE>lINS&PkP8fYj(9a*ui}%(Fo?97!Cba2jXq-JyJ>H&4O_Yh<9}*(iq1~e zbf)<#&-Kb6(K>3NVL(oAvV%v|b8o9~*VNd@IXA3<(-_ZKBC{THWCy=FX7=RanA7+K zRpe=RW@O!X2}Sj}b2dH(q+pMV{cLbVa!4KI+9pSeKNRUWdPrb(eAc%&?p570hL*9$ z7+=$=8d0$cY0SlnusTSp&qd3zh~%zi~doYH?=34AYp9e(DYHDJ@R|LCK{$!(u) z-1WT`b!qI3oAs;f{b>UjW#SSG*{-eu3?O_g!(#g!wUQNF2 z98H@Tdo0xQeqgP@MsK4BKEp-9ydyL2@w6?yTqkHox6>y_hG+R~mEMu)>ijU}gQ_Z- zo?Quu##Uk_FHB9CmLQJpz43 z1aRG$EC~T^ZLm@0GNm|BaJ8-?01B>K2)PhYaD{mQ1y>yHCZ1yMZ{Eu6dZ596SrPU? z^A07asxmX3%;uMm^hOJOlpt;1Xb1d;k>NV(Q3C&b@x7UqzJuzKi_pdcSFE+G*y88# z&7!AQ3xAwx>clAA_K(%uN*{Y^%T}Xfc=-!8awr+_V_pd@aCtOxz}0jJUcy~NKbXyN z3fBARDjn|d*NgUPOe!w&I^f0yiM09XnnZu)Z);isnY5RI5Az4Z`ihrUo`6YA+Sln= z>KfTs+|`2~{1S+o zS7Hn03Z6H%128OUKZhdz-ijpsB-+gsb=FvwPVbDjy$BdG9rMMWurWqUUCN{)oIwjL*?&-S zoYa!9ev==+yI+x;K189_*=%5?I{5Km>fK4(WSq{{N1YhELr3(v`(pQ8K+epZu+(Cb zFE&(;^PnO=;V(w0@wg0MGI;fN?4qkfe9_L&+#%ri>FS?9aypurSiTWC6d|D~NdB|( zNIIIxD5OZFNLav4FFH~Hv|KHDhm3?Ii-v?mg7n`%`Zlj1w%$$<53s8(#EI9 ${USR_ETC_DIR}/odbc_template - ${CAT} ${ETC_DIR}/campcaster-scheduler.xml.template \ - | ${SED} -e ${REPLACE_SED_STRING} \ - > ${USR_ETC_DIR}/campcaster-scheduler.xml - -create_database: -ifeq (@CREATE_LS_DATABASE@,yes) - ${BIN_DIR}/createDatabase.sh --database=${DATABASE} \ - --dbserver=${DB_SERVER} \ - --dbuser=${DB_USER} \ - --dbpassword=${DB_PASSWORD} -endif - -create_odbc_datasource: -ifeq (@CREATE_ODBC_DATA_SOURCE@,yes) - ${BIN_DIR}/createOdbcDataSource.sh --database=${DATABASE} \ - --dbserver=${DB_SERVER} -endif - -check_local: all ${TEST_RUNNER} kill start_local run_tests stop_local - -run_tests: ${TEST_RUNNER} - ${TEST_RUNNER_SH} -o ${TEST_RESULTS} -s ${TEST_XSLT} - -start: ${SCHEDULER_EXE} - ${SCHEDULER_SH} start - sleep 2 - -run: ${SCHEDULER_EXE} - ${SCHEDULER_SH} run - -stop: ${SCHEDULER_EXE} - ${SCHEDULER_SH} stop - sleep 2 - -status: ${SCHEDULER_EXE} - ${SCHEDULER_SH} status - -start_local: ${SCHEDULER_EXE} - ${SCHEDULER_EXE} -c ${SCHEDULER_LOCAL_CFG} start - sleep 2 - -stop_local: ${SCHEDULER_EXE} - ${SCHEDULER_EXE} -c ${SCHEDULER_LOCAL_CFG} stop - sleep 2 - -status_local: ${SCHEDULER_EXE} - ${SCHEDULER_EXE} -c ${SCHEDULER_LOCAL_CFG} status - -run_local: ${SCHEDULER_EXE} - ${SCHEDULER_EXE} -c ${SCHEDULER_LOCAL_CFG} --debug start - sleep 2 - -storage_server_init: - ${MAKE} -C ${STORAGE_SERVER_DIR} - -kill: - ${KILLALL} campcaster-scheduler || true - sleep 2 - ${KILLALL} -9 campcaster-scheduler || true - - -#------------------------------------------------------------------------------- -# Specific targets -#------------------------------------------------------------------------------- -${SCHEDULER_EXE}: ${CORE_LIB_FILE} ${AUTHENTICATION_LIB_FILE} ${DB_LIB_FILE} \ - ${STORAGE_CLIENT_LIB_FILE} \ - ${PLAYLIST_EXECUTOR_LIB_FILE} ${EVENT_SCHEDULER_LIB_FILE} \ - ${SCHEDULER_EXE_OBJS} - ${CXX} ${LDFLAGS} -o $@ $^ ${SCHEDULER_EXE_LIBS} - -${TMP_DIR}: - ${MKDIR} ${TMP_DIR} - -${DOXYGEN_DIR}: - ${MKDIR} ${DOXYGEN_DIR} - -${TEST_RUNNER}: ${CORE_LIB_FILE} ${AUTHENTICATION_LIB_FILE} ${DB_LIB_FILE} \ - ${STORAGE_CLIENT_LIB_FILE} \ - ${PLAYLIST_EXECUTOR_LIB_FILE} ${EVENT_SCHEDULER_LIB_FILE} \ - ${TEST_RUNNER_OBJS} - ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} - -${CORE_LIB_FILE}: - ${MAKE} -C ${CORE_DIR} - -${AUTHENTICATION_LIB_FILE} : - ${MAKE} -C ${AUTHENTICATION_DIR} - -${DB_LIB_FILE}: - ${MAKE} -C ${DB_DIR} - -${STORAGE_CLIENT_LIB_FILE}: - ${MAKE} -C ${STORAGE_CLIENT_DIR} - -${PLAYLIST_EXECUTOR_LIB_FILE}: - ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} - -${EVENT_SCHEDULER_LIB_FILE}: - ${MAKE} -C ${EVENT_SCHEDULER_DIR} - - -#------------------------------------------------------------------------------- -# Pattern rules -#------------------------------------------------------------------------------- -${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx - ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< - diff --git a/src/products/scheduler/etc/acinclude.m4 b/src/products/scheduler/etc/acinclude.m4 deleted file mode 100644 index 20cd235ab..000000000 --- a/src/products/scheduler/etc/acinclude.m4 +++ /dev/null @@ -1,575 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl Macro to check for available modules using pkg-conf -dnl -dnl usage: -dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) -dnl -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -dnl -dnl This function was taken from the glade-- project -dnl----------------------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for taglib of sufficient version by looking at taglib-config -dnl -dnl usage: -dnl AC_CHECK_TAGLIB(version, action-if, action-not) -dnl -dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_TAGLIB], [ - succeeded=no - - if test -z "$TAGLIB_CONFIG"; then - AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) - fi - - if test "$TAGLIB_CONFIG" = "no" ; then - echo "*** The taglib-config script could not be found. Make sure it is" - echo "*** in your path, and that taglib is properly installed." - echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" - else - TAGLIB_VERSION=`$TAGLIB_CONFIG --version` - AC_MSG_CHECKING(for taglib >= $1) - VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(TAGLIB_CFLAGS) - TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` - AC_MSG_RESULT($TAGLIB_CFLAGS) - - AC_MSG_CHECKING(TAGLIB_LIBS) - TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` - AC_MSG_RESULT($TAGLIB_LIBS) - else - TAGLIB_CFLAGS="" - TAGLIB_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find taglib >= $1",) - fi - - AC_SUBST(TAGLIB_CFLAGS) - AC_SUBST(TAGLIB_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for ICU of sufficient version by looking at icu-config -dnl -dnl usage: -dnl AC_CHECK_ICU(version, action-if, action-not) -dnl -dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_ICU], [ - succeeded=no - - if test -z "$ICU_CONFIG"; then - AC_PATH_PROG(ICU_CONFIG, icu-config, no) - fi - - if test "$ICU_CONFIG" = "no" ; then - echo "*** The icu-config script could not be found. Make sure it is" - echo "*** in your path, and that taglib is properly installed." - echo "*** Or see http://ibm.com/software/globalization/icu/" - else - ICU_VERSION=`$ICU_CONFIG --version` - AC_MSG_CHECKING(for ICU >= $1) - VERSION_CHECK=`expr $ICU_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(ICU_CFLAGS) - ICU_CFLAGS=`$ICU_CONFIG --cflags` - AC_MSG_RESULT($ICU_CFLAGS) - - AC_MSG_CHECKING(ICU_CXXFLAGS) - ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` - AC_MSG_RESULT($ICU_CXXFLAGS) - - AC_MSG_CHECKING(ICU_LIBS) - ICU_LIBS=`$ICU_CONFIG --ldflags` - AC_MSG_RESULT($ICU_LIBS) - else - ICU_CFLAGS="" - ICU_CXXFLAGS="" - ICU_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find ICU >= $1",) - fi - - AC_SUBST(ICU_CFLAGS) - AC_SUBST(ICU_CXXFLAGS) - AC_SUBST(ICU_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for curl of sufficient version by looking at curl-config -dnl -dnl usage: -dnl AC_CHECK_CURL(version, action-if, action-not) -dnl -dnl defines CURL_LIBS, CURL_CFLAGS, see curl-config man page -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CHECK_CURL], [ - succeeded=no - - if test -z "$CURL_CONFIG"; then - AC_PATH_PROG(CURL_CONFIG, curl-config, no) - fi - - if test "$CURL_CONFIG" = "no" ; then - echo "*** The curl-config script could not be found. Make sure it is" - echo "*** in your path, and that curl is properly installed." - echo "*** Or see http://curl.haxx.se/" - else - dnl curl-config --version returns "libcurl ", thus cut the number - CURL_VERSION=`$CURL_CONFIG --version | cut -d" " -f2` - AC_MSG_CHECKING(for curl >= $1) - VERSION_CHECK=`expr $CURL_VERSION \>\= $1` - if test "$VERSION_CHECK" = "1" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING(CURL_CFLAGS) - CURL_CFLAGS=`$CURL_CONFIG --cflags` - AC_MSG_RESULT($CURL_CFLAGS) - - AC_MSG_CHECKING(CURL_LIBS) - CURL_LIBS=`$CURL_CONFIG --libs` - AC_MSG_RESULT($CURL_LIBS) - else - CURL_CFLAGS="" - CURL_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - ifelse([$3], ,echo "can't find curl >= $1",) - fi - - AC_SUBST(CURL_CFLAGS) - AC_SUBST(CURL_LIBS) - fi - - if test $succeeded = yes; then - ifelse([$2], , :, [$2]) - else - ifelse([$3], , AC_MSG_ERROR([Library requirements (curl) not met.]), [$3]) - fi -]) - - - -dnl----------------------------------------------------------------------------- -dnl Macro to check for C++ namespaces -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html -dnl -dnl usage: -dnl If the compiler can prevent names clashes using namespaces, -dnl define HAVE_NAMESPACES. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AC_CXX_NAMESPACES], -[AC_CACHE_CHECK(whether the compiler implements namespaces, -ac_cv_cxx_namespaces, -[AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], - [using namespace Outer::Inner; return i;], - ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) - AC_LANG_RESTORE -]) -if test "$ac_cv_cxx_namespaces" = yes; then - AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) -fi -]) - - -dnl----------------------------------------------------------------------------- -dnl Test for the Boost C++ libraries of a particular version (or newer). -dnl for more information on boost, see http://www.boost.org/ -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ax_boost_base.html -dnl -dnl usage: -dnl If no path to the installed boost library is given the macro searches -dnl under ${prefix}, /usr, /usr/local, and /opt, and evaluates the $BOOST_ROOT -dnl environment variable. Further documentation is available at -dnl http://randspringer.de/boost/index.html -dnl -dnl This macro calls: AC_SUBST(BOOST_CPPFLAGS) and AC_SUBST(BOOST_LDFLAGS) -dnl and sets: HAVE_BOOST -dnl -dnl Modified for Campcaster: -dnl * --with-boost default changed to Yes; -dnl * if the library is not found, it does not die, just prints "no", leaves -dnl HAVE_BOOST undefined, and sets the BOOST_CPPFLAGS and BOOST_LDFLAGS -dnl variables to ""; -dnl * ${prefix} is prepended to the search path. -dnl -dnl Author: Thomas Porschberg -dnl -dnl License: -dnl Copyright © 2006 Thomas Porschberg -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AX_BOOST_BASE], -[ -AC_ARG_WITH([boost], - AS_HELP_STRING([--with-boost@<:@=DIR@:>@], [use boost (default is Yes) - it is possible to specify the root directory for boost (optional)]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ac_boost_path="" - else - want_boost="yes" - ac_boost_path="$withval" - fi - ], - [want_boost="yes"]) - -if test "x$want_boost" = "xyes"; then - boost_lib_version_req=ifelse([$1], ,1.20.0,$1) - boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` - boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` - boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$boost_lib_version_req_sub_minor" = "x" ; then - boost_lib_version_req_sub_minor="0" - fi - WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` - AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) - succeeded=no - - dnl first we check the system location for boost libraries - dnl this location ist chosen if boost libraries are installed with the --layout=system option - dnl or if you install boost with RPM - if test "$ac_boost_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_path/lib" - BOOST_CPPFLAGS="-I$ac_boost_path/include" - else - for ac_boost_path_tmp in ${prefix} /usr /usr/local /opt ; do - if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then - BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib" - BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" - break; - fi - done - fi - - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - - - - dnl if we found no boost with system layout we search for boost libraries - dnl built and installed without the --layout=system option or for a staged(not installed) version - if test "x$succeeded" != "xyes"; then - _version=0 - if test "$ac_boost_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_path/lib" - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - fi - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" - done - fi - else - for ac_boost_path in /usr /usr/local /opt ; do - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then - _version=$_version_tmp - best_path=$ac_boost_path - fi - done - fi - done - - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - BOOST_LDFLAGS="-L$best_path/lib" - - if test "x$BOOST_ROOT" != "x"; then - if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/lib" && test -r "$BOOST_ROOT/stage/lib"; then - version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` - stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` - stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` - V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "$V_CHECK" = "1" ; then - AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) - BOOST_CPPFLAGS="-I$BOOST_ROOT" - BOOST_LDFLAGS="-L$BOOST_ROOT/stage/lib" - fi - fi - fi - fi - - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - fi - - if test "$succeeded" != "yes" ; then - BOOST_CPPFLAGS="" - BOOST_LDFLAGS="" - AC_MSG_RESULT(no) - else - AC_SUBST(BOOST_CPPFLAGS) - AC_SUBST(BOOST_LDFLAGS) - AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" -fi - -]) - - -dnl----------------------------------------------------------------------------- -dnl Test for Date_Time library from the Boost C++ libraries. -dnl for more information on boost, see http://www.boost.org/ -dnl for more information on this macro, see -dnl http://autoconf-archive.cryp.to/ax_boost_date_time.html -dnl -dnl usage: -dnl The macro requires a preceding call to AX_BOOST_BASE. -dnl Further documentation is available at -dnl . -dnl -dnl This macro calls: AC_SUBST(BOOST_DATE_TIME_LIB) -dnl and sets: HAVE_BOOST_DATE_TIME -dnl -dnl Modified for Campcaster: -dnl * --with-boost-date-time default changed to Yes. -dnl * added some more recognized suffixes to the library's name, incl. "-st". -dnl -dnl Authors: -dnl Thomas Porschberg -dnl Michael Tindal -dnl -dnl License: -dnl Copyright © 2006 Thomas Porschberg -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. -dnl----------------------------------------------------------------------------- -AC_DEFUN([AX_BOOST_DATE_TIME], -[ - AC_ARG_WITH([boost-date-time], - AS_HELP_STRING([--with-boost-date-time@<:@=special-lib@:>@], - [use the Date_Time library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-date-time=boost_date_time-gcc-mt-d-1_33_1 ]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ax_boost_user_date_time_lib="" - else - want_boost="yes" - ax_boost_user_date_time_lib="$withval" - fi - ], - [want_boost="yes"] - ) - - if test "x$want_boost" = "xyes"; then - AC_REQUIRE([AC_PROG_CC]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_CACHE_CHECK(whether the Boost::Date_Time library is available, - ax_cv_boost_date_time, - [AC_LANG_PUSH([C++]) - AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[@%:@include ]], - [[using namespace boost::gregorian; date d(2002,Jan,10); - return 0; - ]]), - ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) - AC_LANG_POP([C++]) - ]) - if test "x$ax_cv_boost_date_time" = "xyes"; then - AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::Date_Time library is available]) - BN=boost_date_time - if test "x$ax_boost_user_date_time_lib" = "x"; then - for ax_lib in $BN $BN-st $BN-mt $BN-mt-s $BN-s \ - $BN-$CC $BN-$CC-st $BN-$CC-mt $BN-$CC-mt-s $BN-$CC-s \ - lib$BN lib$BN-st lib$BN-mt lib$BN-mt-s lib$BN-s \ - lib$BN-$CC lib$BN-$CC-st lib$BN-$CC-mt lib$BN-$CC-mt-s lib$BN-$CC-s \ - $BN-mgw $BN-mgw $BN-mgw-st $BN-mgw-mt $BN-mgw-mt-s $BN-mgw-s ; do - AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB="-l$ax_lib" AC_SUBST(BOOST_DATE_TIME_LIB) link_date_time="yes" break], - [link_date_time="no"]) - done - else - for ax_lib in $ax_boost_user_date_time_lib $BN-$ax_boost_user_date_time_lib; do - AC_CHECK_LIB($ax_lib, main, - [BOOST_DATE_TIME_LIB="-l$ax_lib" AC_SUBST(BOOST_DATE_TIME_LIB) link_date_time="yes" break], - [link_date_time="no"]) - done - - fi - if test "x$link_date_time" = "xno"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - fi - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - fi -]) - diff --git a/src/products/scheduler/etc/authenticationClient.xml b/src/products/scheduler/etc/authenticationClient.xml deleted file mode 100644 index 7a1580f07..000000000 --- a/src/products/scheduler/etc/authenticationClient.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - -]> - - - - - diff --git a/src/products/scheduler/etc/campcaster-scheduler-local.xml b/src/products/scheduler/etc/campcaster-scheduler-local.xml deleted file mode 100644 index b641f828b..000000000 --- a/src/products/scheduler/etc/campcaster-scheduler-local.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/products/scheduler/etc/campcaster-scheduler.xml b/src/products/scheduler/etc/campcaster-scheduler.xml deleted file mode 100644 index 46c89727c..000000000 --- a/src/products/scheduler/etc/campcaster-scheduler.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/products/scheduler/etc/campcaster-scheduler.xml.template b/src/products/scheduler/etc/campcaster-scheduler.xml.template deleted file mode 100644 index 0ea00e188..000000000 --- a/src/products/scheduler/etc/campcaster-scheduler.xml.template +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/products/scheduler/etc/configure.ac b/src/products/scheduler/etc/configure.ac deleted file mode 100644 index d5bbf1257..000000000 --- a/src/products/scheduler/etc/configure.ac +++ /dev/null @@ -1,312 +0,0 @@ -dnl----------------------------------------------------------------------------- -dnl Copyright (c) 2010 Sourcefabric O.P.S. -dnl -dnl This file is part of the Campcaster project. -dnl http://campcaster.sourcefabric.org/ -dnl -dnl Campcaster is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl Campcaster is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with Campcaster; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -dnl -dnl----------------------------------------------------------------------------- - -dnl----------------------------------------------------------------------------- -dnl NOTE: Run all configure related scripts from the tmp directory of the -dnl project. -dnl This is due to the fact that configure spreads a lot of trash around, -dnl like atom4te cache directories, config.* files, etc. into the directory -dnl it is being run from. We clearly don't want these in our base directory. -dnl----------------------------------------------------------------------------- -AC_INIT(Campcaster-Scheduler, 0.0, bugs@campware.org) -AC_PREREQ(2.59) -AC_COPYRIGHT([Copyright (c) 2010 Sourcefabric O.P.S. under the GNU GPL]) -AC_REVISION($Revision$) - -AC_CONFIG_SRCDIR(../src/main.cxx) - -AC_CONFIG_HEADERS(configure.h) -AC_PROG_CXX() - -AC_CHECK_HEADERS(sys/types.h unistd.h getopt.h signal.h sys/stat.h time.h) -AC_CHECK_HEADERS(stdio.h fcntl.h sys/time.h) - -AC_CHECK_HEADERS(libtar.h) - - -dnl----------------------------------------------------------------------------- -dnl specify whether debug info should be compiled into the executable -dnl----------------------------------------------------------------------------- -AC_SUBST(CXXFLAGS) - -AC_ARG_ENABLE([debug], - AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), - [], - [enable_debug=no]) - -if test "x${enable_debug}" = "xyes"; then - CXXFLAGS="-g -O0" - AC_DEFINE( YDEBUG, 1, [Debug is on] ) -else - CXXFLAGS="-O3" -fi - -AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the pkg-config path -dnl----------------------------------------------------------------------------- -AC_ARG_WITH([pkg-config-path], - AC_HELP_STRING([--with-pkg-config-path], - [use the pkg-config path (prefix/lib/pkgconfig)]), - [PKG_CONFIG_PATH=${withval}], - [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig:$PKG_CONFIG_PATH]) - -AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) - -export PKG_CONFIG_PATH - -export PATH=${prefix}/bin:${PATH} - - -AX_BOOST_BASE([1.33.1]) -if test "x${BOOST_CPPFLAGS}" != "x"; then - AX_BOOST_DATE_TIME - if test "x${BOOST_DATE_TIME_LIB}" = "x"; then - AC_MSG_ERROR([Boost date-time library not found]) - fi -else - AC_MSG_ERROR([Boost library >= 1.33.1 not found]) -fi - -PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) -AC_SUBST(LIBXMLPP_CFLAGS) -AC_SUBST(LIBXMLPP_LIBS) - -PKG_CHECK_MODULES(LIBODBCXX,[libodbc++]) - -PKG_CHECK_MODULES(GSTREAMER,[gstreamer-0.10 >= 0.10]) -AC_SUBST(GSTREAMER_CFLAGS) -AC_SUBST(GSTREAMER_LIBS) - -PKG_CHECK_MODULES(GSTCONTROLLER,[gstreamer-controller-0.10 >= 0.10]) -AC_SUBST(GSTCONTROLLER_CFLAGS) -AC_SUBST(GSTCONTROLLER_LIBS) - -AC_CHECK_CURL(7.12.3) -AC_SUBST(CURL_CFLAGS) -AC_SUBST(CURL_LIBS) - -AC_CHECK_TAGLIB(1.3.1) -AC_SUBST(TAGLIB_CFLAGS) -AC_SUBST(TAGLIB_LIBS) - -AC_CHECK_ICU(3.0) -AC_SUBST(ICU_CFLAGS) -AC_SUBST(ICU_CXXFLAGS) -AC_SUBST(ICU_LIBS) - -AC_PATH_PROG(GENRB, genrb) -AC_SUBST(GENRB) - - -dnl----------------------------------------------------------------------------- -dnl enable compilaton for code coverage data -dnl----------------------------------------------------------------------------- -AC_SUBST(COVERAGE_CXXFLAGS) - -AC_ARG_ENABLE( coverage, -[ --enable-coverage enable code coverage data generaton (no) ], - ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) - -if test "x${ENABLE_COVERAGE}" == "xyes" ; then - COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" - AC_MSG_RESULT([compiling in code coverage mode]) -else - AC_MSG_RESULT([not compiling in code coverage mode]) -fi - - -dnl----------------------------------------------------------------------------- -dnl specify wether the Campcaster database and user should be created -dnl----------------------------------------------------------------------------- -AC_SUBST(CREATE_LS_DATABASE) - -AC_ARG_WITH([create-database], - AC_HELP_STRING([--with-create-database], - [specify wether the Campcaster database and database user - should be created (no)]), - [CREATE_LS_DATABASE=${withval}], - [CREATE_LS_DATABASE=no]) - -AC_MSG_RESULT([creating Campcaster database: ${CREATE_LS_DATABASE}]) - - -dnl----------------------------------------------------------------------------- -dnl specify wether the ODBC data source should be created -dnl----------------------------------------------------------------------------- -AC_SUBST(CREATE_ODBC_DATA_SOURCE) - -AC_ARG_WITH([create-odbc-data-source], - AC_HELP_STRING([--with-create-odbc-data-source], - [specify wether the ODBC data source for Campcaster should be - created (no)]), - [CREATE_ODBC_DATA_SOURCE=${withval}], - [CREATE_ODBC_DATA_SOURCE=no]) - -AC_MSG_RESULT([creating ODBC data source: ${CREATE_ODBC_DATA_SOURCE}]) - - -dnl----------------------------------------------------------------------------- -dnl specify wether the Campcaster database tables should be initialized -dnl----------------------------------------------------------------------------- -AC_SUBST(INIT_LS_DATABASE) - -AC_ARG_WITH([init-database], - AC_HELP_STRING([--with-init-database], - [specify wether the Campcaster database tables should be - initialized (no)]), - [INIT_LS_DATABASE=${withval}], - [INIT_LS_DATABASE=no]) - -AC_MSG_RESULT([initializing Campcaster database: ${INIT_LS_DATABASE}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the FQDN -dnl----------------------------------------------------------------------------- -AC_SUBST(HOSTNAME) - -AC_ARG_WITH([hostname], - AC_HELP_STRING([--with-hostname], - [use the specified hostname (guess)]), - [HOSTNAME=${withval}], [HOSTNAME=`hostname -f`]) - -AC_MSG_RESULT([using hostname: ${HOSTNAME}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the web server port -dnl----------------------------------------------------------------------------- -AC_SUBST(WWW_PORT) - -AC_ARG_WITH([www-port], - AC_HELP_STRING([--with-www-port], - [use the specified www port (80)]), - [WWW_PORT=${withval}], [WWW_PORT=80]) - -AC_MSG_RESULT([using www port: ${WWW_PORT}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the scheduler server port -dnl----------------------------------------------------------------------------- -AC_SUBST(SCHEDULER_PORT) - -AC_ARG_WITH([scheduler-port], - AC_HELP_STRING([--with-scheduler-port], - [use the specified scheduler port (3344)]), - [SCHEDULER_PORT=${withval}], [SCHEDULER_PORT=3344]) - -AC_MSG_RESULT([using scheduler port: ${SCHEDULER_PORT}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the database server name -dnl----------------------------------------------------------------------------- -AC_SUBST(DB_SERVER) - -AC_ARG_WITH([database-server], - AC_HELP_STRING([--with-database-server], - [use the specified database server (localhost)]), - [DB_SERVER=${withval}], [DB_SERVER=localhost]) - -AC_MSG_RESULT([using database server: ${DB_SERVER}]) - - -dnl----------------------------------------------------------------------------- -dnl get the name of the Campcaster database -dnl----------------------------------------------------------------------------- -AC_SUBST(DATABASE) - -AC_ARG_WITH([database], - AC_HELP_STRING([--with-database], - [the name of the postgresql database to use (Campcaster)]), - [DATABASE=${withval}], [DATABASE=Campcaster]) - -AC_MSG_RESULT([using database: ${DATABASE}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the database server user -dnl----------------------------------------------------------------------------- -AC_SUBST(DB_USER) - -AC_ARG_WITH([database-user], - AC_HELP_STRING([--with-database-user], - [use the specified database server user (campcaster)]), - [DB_USER=${withval}], [DB_USER=campcaster]) - -AC_MSG_RESULT([using database server user: ${DB_USER}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the database server user password -dnl----------------------------------------------------------------------------- -AC_SUBST(DB_PASSWORD) - -AC_ARG_WITH([database-password], - AC_HELP_STRING([--with-database-password], - [use the specified database server user password (campcaster)]), - [DB_PASSWORD=${withval}], [DB_PASSWORD=campcaster]) - -AC_MSG_RESULT([using database server user password: ${DB_PASSWORD}]) - - -dnl----------------------------------------------------------------------------- -dnl specify the audio output device -dnl----------------------------------------------------------------------------- -AC_SUBST(AUDIO_OUT) - -AC_ARG_WITH([audio-out], - AC_HELP_STRING([--with-audio-out], - [use the specified audio output device, either ALSA or OSS - (default)]), - [AUDIO_OUT=${withval}], [AUDIO_OUT=default]) - -AC_MSG_RESULT([using audio output device: ${AUDIO_OUT}]) - - -dnl display status info on what libraries will get compiled - -AC_MSG_NOTICE( -[using the following configuration settings: - - hostname: ${HOSTNAME} - www port: ${WWW_PORT} - scheduler port: ${SCHEDULER_PORT} - database server: ${DB_SERVER} - database name: ${DATABASE} - database user: ${DB_USER} - database user password: ${DB_PASSWORD} - audio output device: ${AUDIO_OUT} - creating Campcaster database: ${CREATE_LS_DATABASE} - creating ODBC data source: ${CREATE_ODBC_DATA_SOURCE} - initialize Campcaster database: ${INIT_LS_DATABASE} - -]) - - -AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) - -AC_OUTPUT() diff --git a/src/products/scheduler/etc/connectionManagerFactory.xml b/src/products/scheduler/etc/connectionManagerFactory.xml deleted file mode 100644 index 9e7c74905..000000000 --- a/src/products/scheduler/etc/connectionManagerFactory.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - -]> - - - diff --git a/src/products/scheduler/etc/doxygen.config b/src/products/scheduler/etc/doxygen.config deleted file mode 100644 index 9c076c81e..000000000 --- a/src/products/scheduler/etc/doxygen.config +++ /dev/null @@ -1,1140 +0,0 @@ -#------------------------------------------------------------------------------- -# Copyright (c) 2010 Sourcefabric O.P.S. -# -# This file is part of the Campcaster project. -# http://campcaster.sourcefabric.org/ -# -# Campcaster is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Campcaster is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Campcaster; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- - -# Doxyfile 1.3.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Campcaster - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/doxygen - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is used -# as the annotated text. Otherwise, the brief description is used as-is. If left -# blank, the following values are used ("$name" is automatically replaced with the -# name of the entity): "The $name class" "The $name widget" "The $name file" -# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = YES - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = src - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - -INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = \ -../../doc/doxygen/xmlrpc++.tag=../../../../../usr/share/doc/xmlrpc++ - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = YES - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superseded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/src/products/scheduler/etc/odbc_template b/src/products/scheduler/etc/odbc_template deleted file mode 100644 index 60e80415d..000000000 --- a/src/products/scheduler/etc/odbc_template +++ /dev/null @@ -1,18 +0,0 @@ -[ls_database] -Description = the Campcaster database at PostgreSQL -Driver = PostgreSQL_Campcaster -Trace = No -TraceFile = /tmp/sql.log -Database = ls_database -Servername = ls_dbserver -Username = -Password = -Port = 5432 -Protocol = 6.4 -ReadOnly = No -RowVersioning = No -ShowSystemTables = No -ShowOidColumn = No -FakeOidIndex = No -ConnSettings = - diff --git a/src/products/scheduler/etc/odbc_test_template b/src/products/scheduler/etc/odbc_test_template deleted file mode 100644 index a2de7cc58..000000000 --- a/src/products/scheduler/etc/odbc_test_template +++ /dev/null @@ -1,18 +0,0 @@ -[LiveSupport-test] -Description = the Campcaster database at PostgreSQL -Driver = PostgreSQL -Trace = No -TraceFile = /tmp/sql.log -Database = Campcaster-test -Servername = localhost -Username = -Password = -Port = 5432 -Protocol = 6.4 -ReadOnly = No -RowVersioning = No -ShowSystemTables = No -ShowOidColumn = No -FakeOidIndex = No -ConnSettings = - diff --git a/src/products/scheduler/etc/odbcinst_new_debian_template b/src/products/scheduler/etc/odbcinst_new_debian_template deleted file mode 100644 index eb4b77764..000000000 --- a/src/products/scheduler/etc/odbcinst_new_debian_template +++ /dev/null @@ -1,5 +0,0 @@ -[PostgreSQL_Campcaster] -Description = PostgreSQL driver for Campcaster -Driver = /usr/lib/odbc/psqlodbcw.so -Setup = /usr/lib/odbc/libodbcpsqlS.so - diff --git a/src/products/scheduler/etc/odbcinst_old_debian_template b/src/products/scheduler/etc/odbcinst_old_debian_template deleted file mode 100644 index b21c5e27c..000000000 --- a/src/products/scheduler/etc/odbcinst_old_debian_template +++ /dev/null @@ -1,5 +0,0 @@ -[PostgreSQL_Campcaster] -Description = PostgreSQL driver for Campcaster -Driver = /usr/lib/odbc/psqlodbc.so -Setup = /usr/lib/odbc/libodbcpsqlS.so - diff --git a/src/products/scheduler/etc/odbcinst_template b/src/products/scheduler/etc/odbcinst_template deleted file mode 100644 index dfd9d84d6..000000000 --- a/src/products/scheduler/etc/odbcinst_template +++ /dev/null @@ -1,5 +0,0 @@ -[PostgreSQL_Campcaster] -Description = PostgreSQL driver for Campcaster -Driver = /usr/lib/libodbcpsql.so -Setup = /usr/lib/libodbcpsqlS.so - diff --git a/src/products/scheduler/etc/playLogFactory.xml b/src/products/scheduler/etc/playLogFactory.xml deleted file mode 100644 index 2fd65fe9a..000000000 --- a/src/products/scheduler/etc/playLogFactory.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - -]> - - - diff --git a/src/products/scheduler/etc/playlist.xml b/src/products/scheduler/etc/playlist.xml deleted file mode 100644 index 7a4a3ef41..000000000 --- a/src/products/scheduler/etc/playlist.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - diff --git a/src/products/scheduler/etc/scheduleFactory.xml b/src/products/scheduler/etc/scheduleFactory.xml deleted file mode 100644 index a89f05373..000000000 --- a/src/products/scheduler/etc/scheduleFactory.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - -]> - - - diff --git a/src/products/scheduler/etc/storageClient.xml b/src/products/scheduler/etc/storageClient.xml deleted file mode 100644 index 9ad61269a..000000000 --- a/src/products/scheduler/etc/storageClient.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - diff --git a/src/products/scheduler/etc/testAuthenticationClient.xml b/src/products/scheduler/etc/testAuthenticationClient.xml deleted file mode 100644 index 7a1580f07..000000000 --- a/src/products/scheduler/etc/testAuthenticationClient.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - -]> - - - - - diff --git a/src/products/scheduler/etc/testResultToHtml.xsl b/src/products/scheduler/etc/testResultToHtml.xsl deleted file mode 100644 index f9e893521..000000000 --- a/src/products/scheduler/etc/testResultToHtml.xsl +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - Campcaster unit test results - - -