From 1e44ec84bd90ec9078027d1d9d78e83c7d305f2a Mon Sep 17 00:00:00 2001 From: BlueWall Date: Tue, 31 Aug 2010 17:02:36 -0400 Subject: [PATCH 01/35] Build system upgrade: Upgrading Prebuild.exe to correctly construct build solutions for crossplatform tools such as xbuild, monodevelop and nant. NOTE: Module prebuild files will need modification to work, as the prebuild must correctly define the reference path for all assemblies shipped in the OpenSimulator ./bin directory. These include assemblies such as XMLRPC.dll, OpenMetaverse.dll, Nini.dll, etc. . The entries should follow the form: See the distributed prebuild.xml for further examples. Crossplatform tools: xbuild and monodevelop use the vs2008 OpenSim.sln and the .csproj files in each namespace. Changes to the Prebuild.exe are against svn 322 and are included in a patch attached to the mantis. And the dnpb source are available@ svn co https://dnpb.svn.sourceforge.net/svnroot/dnpb dnpb The patches are pending application by the dnpb team. After which, the un-modified upstream Prebuild.exe will work as expected. --- Prebuild/clean.bat | 1 - Prebuild/clean.sh | 1 - Prebuild/doc/prebuild-example1.xml | 300 --- Prebuild/doc/prebuild-example2.xml | 72 - Prebuild/doc/prebuild-example3.xml | 113 -- Prebuild/doc/prebuild-example4.xml | 715 ------- Prebuild/doc/prebuild-example5.xml | 187 -- Prebuild/prebuild.xml | 73 - Prebuild/scripts/Clean.bat | 2 - Prebuild/scripts/Clean.sh | 4 - Prebuild/scripts/Help.bat | 2 - Prebuild/scripts/MonoDevelop.sh | 2 - Prebuild/scripts/Prebuild.nsi | 231 --- Prebuild/scripts/SharpDevelop.bat | 4 - Prebuild/scripts/SharpDevelop2.bat | 4 - Prebuild/scripts/VS2002.bat | 4 - Prebuild/scripts/VS2003.bat | 4 - Prebuild/scripts/VS2005.bat | 4 - Prebuild/scripts/VS2008.bat | 4 - Prebuild/scripts/autotools.bat | 4 - Prebuild/scripts/autotools.sh | 5 - Prebuild/scripts/makefile.bat | 4 - Prebuild/scripts/makefile.sh | 10 - Prebuild/scripts/nant.bat | 4 - Prebuild/scripts/nant.sh | 2 - Prebuild/scripts/xcode.bat | 4 - Prebuild/scripts/xcode.sh | 2 - Prebuild/src/App.ico | Bin 4286 -> 0 bytes .../src/Core/Attributes/DataNodeAttribute.cs | 72 - .../Core/Attributes/OptionNodeAttribute.cs | 71 - .../src/Core/Attributes/TargetAttribute.cs | 71 - Prebuild/src/Core/FatalException.cs | 85 - Prebuild/src/Core/Interfaces/IDataNode.cs | 47 - Prebuild/src/Core/Interfaces/ITarget.cs | 51 - Prebuild/src/Core/Kernel.cs | 831 -------- Prebuild/src/Core/Nodes/AuthorNode.cs | 89 - Prebuild/src/Core/Nodes/ConfigurationNode.cs | 178 -- Prebuild/src/Core/Nodes/DataNode.cs | 117 -- .../src/Core/Nodes/DatabaseProjectNode.cs | 94 - .../src/Core/Nodes/DatabaseReferenceNode.cs | 63 - Prebuild/src/Core/Nodes/DescriptionNode.cs | 89 - Prebuild/src/Core/Nodes/ExcludeNode.cs | 89 - Prebuild/src/Core/Nodes/FileNode.cs | 271 --- Prebuild/src/Core/Nodes/FilesNode.cs | 247 --- Prebuild/src/Core/Nodes/MatchNode.cs | 330 --- Prebuild/src/Core/Nodes/OptionsNode.cs | 644 ------ Prebuild/src/Core/Nodes/ProcessNode.cs | 110 - Prebuild/src/Core/Nodes/ProjectNode.cs | 580 ------ Prebuild/src/Core/Nodes/ReferenceNode.cs | 144 -- Prebuild/src/Core/Nodes/ReferencePathNode.cs | 99 - Prebuild/src/Core/Nodes/SolutionNode.cs | 358 ---- Prebuild/src/Core/Parse/IfContext.cs | 154 -- Prebuild/src/Core/Parse/Preprocessor.cs | 663 ------ Prebuild/src/Core/Targets/AutotoolsTarget.cs | 1782 ----------------- Prebuild/src/Core/Targets/DebugTarget.cs | 102 - Prebuild/src/Core/Targets/MakefileTarget.cs | 471 ----- .../src/Core/Targets/MonoDevelopTarget.cs | 464 ----- Prebuild/src/Core/Targets/NAntTarget.cs | 738 ------- .../src/Core/Targets/SharpDevelop2Target.cs | 82 - .../src/Core/Targets/SharpDevelopTarget.cs | 428 ---- Prebuild/src/Core/Targets/ToolInfo.cs | 197 -- Prebuild/src/Core/Targets/VS2002Target.cs | 87 - Prebuild/src/Core/Targets/VS2003Target.cs | 602 ------ Prebuild/src/Core/Targets/VS2005Target.cs | 149 -- Prebuild/src/Core/Targets/VS2008Target.cs | 132 -- Prebuild/src/Core/Targets/VS2010Target.cs | 134 -- Prebuild/src/Core/Targets/VSGenericTarget.cs | 887 -------- Prebuild/src/Core/Targets/VSVersion.cs | 54 - Prebuild/src/Core/Targets/XcodeTarget.cs | 596 ------ Prebuild/src/Core/UnknownLanguageException.cs | 63 - .../Core/Utilities/CommandLineCollection.cs | 153 -- .../src/Core/Utilities/CurrentDirectory.cs | 80 - Prebuild/src/Core/Utilities/Helper.cs | 654 ------ Prebuild/src/Core/Utilities/Log.cs | 270 --- Prebuild/src/Core/WarningException.cs | 84 - Prebuild/src/Prebuild.cs | 165 -- Prebuild/src/Prebuild.snk | Bin 596 -> 0 bytes Prebuild/src/Properties/AssemblyInfo.cs | 112 -- Prebuild/src/data/autotools.xml | 790 -------- Prebuild/src/data/dnpb-1.0.xsd | 183 -- Prebuild/src/data/dnpb-1.1.xsd | 184 -- Prebuild/src/data/dnpb-1.2.xsd | 198 -- Prebuild/src/data/dnpb-1.3.xsd | 206 -- Prebuild/src/data/dnpb-1.4.xsd | 212 -- Prebuild/src/data/dnpb-1.5.xsd | 215 -- Prebuild/src/data/prebuild-1.6.xsd | 231 --- Prebuild/src/data/prebuild-1.7.xsd | 331 --- Prebuild/tests/Makefile | 24 - Prebuild/tests/README.txt | 5 - Prebuild/tests/include-001.expected | 46 - Prebuild/tests/include-001.include | 33 - Prebuild/tests/include-001.prebuild | 22 - Prebuild/tests/include-002-2.include | 8 - Prebuild/tests/include-002.expected | 26 - Prebuild/tests/include-002.include | 14 - Prebuild/tests/include-002.prebuild | 7 - bin/Prebuild.exe | Bin 237568 -> 227840 bytes prebuild.xml | 1176 ++++++----- runprebuild.sh | 3 - 99 files changed, 560 insertions(+), 19149 deletions(-) delete mode 100755 Prebuild/clean.bat delete mode 100755 Prebuild/clean.sh delete mode 100644 Prebuild/doc/prebuild-example1.xml delete mode 100644 Prebuild/doc/prebuild-example2.xml delete mode 100644 Prebuild/doc/prebuild-example3.xml delete mode 100644 Prebuild/doc/prebuild-example4.xml delete mode 100644 Prebuild/doc/prebuild-example5.xml delete mode 100644 Prebuild/prebuild.xml delete mode 100755 Prebuild/scripts/Clean.bat delete mode 100755 Prebuild/scripts/Clean.sh delete mode 100755 Prebuild/scripts/Help.bat delete mode 100755 Prebuild/scripts/MonoDevelop.sh delete mode 100644 Prebuild/scripts/Prebuild.nsi delete mode 100755 Prebuild/scripts/SharpDevelop.bat delete mode 100755 Prebuild/scripts/SharpDevelop2.bat delete mode 100755 Prebuild/scripts/VS2002.bat delete mode 100755 Prebuild/scripts/VS2003.bat delete mode 100755 Prebuild/scripts/VS2005.bat delete mode 100755 Prebuild/scripts/VS2008.bat delete mode 100755 Prebuild/scripts/autotools.bat delete mode 100755 Prebuild/scripts/autotools.sh delete mode 100755 Prebuild/scripts/makefile.bat delete mode 100755 Prebuild/scripts/makefile.sh delete mode 100755 Prebuild/scripts/nant.bat delete mode 100755 Prebuild/scripts/nant.sh delete mode 100755 Prebuild/scripts/xcode.bat delete mode 100755 Prebuild/scripts/xcode.sh delete mode 100644 Prebuild/src/App.ico delete mode 100644 Prebuild/src/Core/Attributes/DataNodeAttribute.cs delete mode 100644 Prebuild/src/Core/Attributes/OptionNodeAttribute.cs delete mode 100644 Prebuild/src/Core/Attributes/TargetAttribute.cs delete mode 100644 Prebuild/src/Core/FatalException.cs delete mode 100644 Prebuild/src/Core/Interfaces/IDataNode.cs delete mode 100644 Prebuild/src/Core/Interfaces/ITarget.cs delete mode 100644 Prebuild/src/Core/Kernel.cs delete mode 100644 Prebuild/src/Core/Nodes/AuthorNode.cs delete mode 100644 Prebuild/src/Core/Nodes/ConfigurationNode.cs delete mode 100644 Prebuild/src/Core/Nodes/DataNode.cs delete mode 100644 Prebuild/src/Core/Nodes/DatabaseProjectNode.cs delete mode 100644 Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs delete mode 100644 Prebuild/src/Core/Nodes/DescriptionNode.cs delete mode 100644 Prebuild/src/Core/Nodes/ExcludeNode.cs delete mode 100644 Prebuild/src/Core/Nodes/FileNode.cs delete mode 100644 Prebuild/src/Core/Nodes/FilesNode.cs delete mode 100644 Prebuild/src/Core/Nodes/MatchNode.cs delete mode 100644 Prebuild/src/Core/Nodes/OptionsNode.cs delete mode 100644 Prebuild/src/Core/Nodes/ProcessNode.cs delete mode 100644 Prebuild/src/Core/Nodes/ProjectNode.cs delete mode 100644 Prebuild/src/Core/Nodes/ReferenceNode.cs delete mode 100644 Prebuild/src/Core/Nodes/ReferencePathNode.cs delete mode 100644 Prebuild/src/Core/Nodes/SolutionNode.cs delete mode 100644 Prebuild/src/Core/Parse/IfContext.cs delete mode 100644 Prebuild/src/Core/Parse/Preprocessor.cs delete mode 100644 Prebuild/src/Core/Targets/AutotoolsTarget.cs delete mode 100644 Prebuild/src/Core/Targets/DebugTarget.cs delete mode 100644 Prebuild/src/Core/Targets/MakefileTarget.cs delete mode 100644 Prebuild/src/Core/Targets/MonoDevelopTarget.cs delete mode 100644 Prebuild/src/Core/Targets/NAntTarget.cs delete mode 100644 Prebuild/src/Core/Targets/SharpDevelop2Target.cs delete mode 100644 Prebuild/src/Core/Targets/SharpDevelopTarget.cs delete mode 100644 Prebuild/src/Core/Targets/ToolInfo.cs delete mode 100644 Prebuild/src/Core/Targets/VS2002Target.cs delete mode 100644 Prebuild/src/Core/Targets/VS2003Target.cs delete mode 100644 Prebuild/src/Core/Targets/VS2005Target.cs delete mode 100644 Prebuild/src/Core/Targets/VS2008Target.cs delete mode 100644 Prebuild/src/Core/Targets/VS2010Target.cs delete mode 100644 Prebuild/src/Core/Targets/VSGenericTarget.cs delete mode 100644 Prebuild/src/Core/Targets/VSVersion.cs delete mode 100644 Prebuild/src/Core/Targets/XcodeTarget.cs delete mode 100644 Prebuild/src/Core/UnknownLanguageException.cs delete mode 100644 Prebuild/src/Core/Utilities/CommandLineCollection.cs delete mode 100644 Prebuild/src/Core/Utilities/CurrentDirectory.cs delete mode 100644 Prebuild/src/Core/Utilities/Helper.cs delete mode 100644 Prebuild/src/Core/Utilities/Log.cs delete mode 100644 Prebuild/src/Core/WarningException.cs delete mode 100644 Prebuild/src/Prebuild.cs delete mode 100644 Prebuild/src/Prebuild.snk delete mode 100644 Prebuild/src/Properties/AssemblyInfo.cs delete mode 100644 Prebuild/src/data/autotools.xml delete mode 100644 Prebuild/src/data/dnpb-1.0.xsd delete mode 100644 Prebuild/src/data/dnpb-1.1.xsd delete mode 100644 Prebuild/src/data/dnpb-1.2.xsd delete mode 100644 Prebuild/src/data/dnpb-1.3.xsd delete mode 100644 Prebuild/src/data/dnpb-1.4.xsd delete mode 100644 Prebuild/src/data/dnpb-1.5.xsd delete mode 100644 Prebuild/src/data/prebuild-1.6.xsd delete mode 100644 Prebuild/src/data/prebuild-1.7.xsd delete mode 100644 Prebuild/tests/Makefile delete mode 100644 Prebuild/tests/README.txt delete mode 100644 Prebuild/tests/include-001.expected delete mode 100644 Prebuild/tests/include-001.include delete mode 100644 Prebuild/tests/include-001.prebuild delete mode 100644 Prebuild/tests/include-002-2.include delete mode 100644 Prebuild/tests/include-002.expected delete mode 100644 Prebuild/tests/include-002.include delete mode 100644 Prebuild/tests/include-002.prebuild diff --git a/Prebuild/clean.bat b/Prebuild/clean.bat deleted file mode 100755 index 1d71cbffe5..0000000000 --- a/Prebuild/clean.bat +++ /dev/null @@ -1 +0,0 @@ -NAnt.exe clean \ No newline at end of file diff --git a/Prebuild/clean.sh b/Prebuild/clean.sh deleted file mode 100755 index 900b6edd2d..0000000000 --- a/Prebuild/clean.sh +++ /dev/null @@ -1 +0,0 @@ -nant clean diff --git a/Prebuild/doc/prebuild-example1.xml b/Prebuild/doc/prebuild-example1.xml deleted file mode 100644 index a2cee42cd3..0000000000 --- a/Prebuild/doc/prebuild-example1.xml +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - TRACE;DEBUG - false - false - false - 4 - false - 1591;219;1573;1572;168 - ..\bin - true - false - true - 285212672 - 4096 - false - Docs.xml - - - - - TRACE - true - false - false - 4 - false - 1591;219;1573;1572;168 - ..\bin - false - false - true - 285212672 - 4096 - false - Docs.xml - - - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - ../bin - - - - - - - - - - - - - - - ..\bin\lib\Framework - RealmForge.Framework.xml - - - - - ..\bin\lib\Framework - RealmForge.Framework.xml - - - ../bin - - - - - - - - - - - - - - - - - - - - - ..\bin\lib\Genres - RealmForge.Genres.xml - - - - - ..\bin\lib\Genres - RealmForge.Genres.xml - - - ../bin - - - - - - - - - - - - - - - - - ..\bin\lib\Forms - RealmForge.UI.Forms.xml - true - - - - - ..\bin\lib\Forms - RealmForge.UI.Forms.xml - true - - - ../bin - - - - - - - - - - - - IDE\Resources\ImagesCaptionIDE.bmp - IDE\Resources\ImagesCaptionPlain.bmp - IDE\Resources\ImagesMenuControl.bmp - IDE\Resources\ImagesPopupMenu.bmp - IDE\Resources\ImagesTabbedGroups.bmp - IDE\Resources\ImagesTabControl.bmp - IDE\Resources\LibraryIcon.ico - IDE\Resources\TabbedInvalid.cur - IDE\Resources\TabbedValid.cur - IDE\Resources\WizardPicture.bmp - Controls\Trees\tv_minus.bmp - Controls\Trees\tv_plus.bmp - Controls\Trees\treeview.bmp - Controls\Trees\listview.bmp - IDE\Menus\MenuControl.bmp - IDE\Controls\InertButton.bmp - IDE\Controls\TabbedGroups.bmp - IDE\Controls\TabCOntrol.bmp - IDE\Controls\WizardControl.bmp - Forms\IDETest.resx - Forms\IDEWindow.resx - Forms\Launcher.resx - Forms\MainRenderFrame.resx - - - - - - - - ..\bin\lib\RAGE - RealmForge.RAGE.xml - - - - - ..\bin\lib\RAGE - RealmForge.RAGE.xml - - - ../bin - ../bin - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\bin\ScriptLibrary - RealmForge.ScriptLibrary.xml - - - - - ..\bin\ScriptLibrary - RealmForge.ScriptLibrary.xml - - - ../bin - - - - - - - - - - - - - - - - - - - - ..\bin\lib\Updater - Updater.xml - - - - - ..\bin\lib\Updater - Updater.xml - - - ../bin - - - - - - - - - - - - - - ..\bin - DemoGame.xml - - - - - ..\bin - DemoGame.xml - - - ../bin - - - - - - - - - - - - - - - diff --git a/Prebuild/doc/prebuild-example2.xml b/Prebuild/doc/prebuild-example2.xml deleted file mode 100644 index bd23c4fab2..0000000000 --- a/Prebuild/doc/prebuild-example2.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - DEBUG;TRACE;WIN32;NET - - DEBUG;TRACE;POSIX - - false - bin\Debug - true - 1595 - - - - - - TRACE;WIN32;NET - - TRACE;POSIX - - bin\Release - true - false - 1595 - - - - prebuild.xml - - - - - - - DEBUG;TRACE;WIN32;NET - - DEBUG;TRACE;POSIX - - false - bin\Debug - true - Prebuild.xml - 1595 - - - - - - TRACE;WIN32;NET - - TRACE;POSIX - - bin\Release - true - false - Prebuild.xml - 1595 - - - - - - - - - - - - diff --git a/Prebuild/doc/prebuild-example3.xml b/Prebuild/doc/prebuild-example3.xml deleted file mode 100644 index 0111562fd7..0000000000 --- a/Prebuild/doc/prebuild-example3.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - DEBUG;TRACE;WIN32 - - DEBUG;TRACE;POSIX - - false - false - false - 4 - - - false - 1591;219;1573;1572;168 - - - ..\bin - true - false - true - 285212672 - 4096 - false - Docs.xml - - - - - TRACE - true - false - false - 4 - false - 1591;219;1573;1572;168 - ..\bin - false - false - true - 285212672 - 4096 - false - Docs.xml - - - - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - ../bin - - - - - - - - - - - - - - - - - - - ..\bin - DemoGame.xml - - - - - ..\bin - DemoGame.xml - - - ../bin - - - - - - - - - - - - - - - - diff --git a/Prebuild/doc/prebuild-example4.xml b/Prebuild/doc/prebuild-example4.xml deleted file mode 100644 index e5861b89a4..0000000000 --- a/Prebuild/doc/prebuild-example4.xml +++ /dev/null @@ -1,715 +0,0 @@ - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - 1 - 1595 - - - - SdlDotNet.build - prebuild.xml - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SdlDotNet.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - SdlDotNet.xml - false - 1 - 1595 - - - - - - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - Rectangles.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - Rectangles.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - Gears.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - Gears.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - CDPlayer.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - CDPlayer.xml - 1 - 1595 - - - - - - - - App.ico - CDPlayer.cs - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - MoviePlayer.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - MoviePlayer.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SimpleGame.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SimpleGame.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - BombRun.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - BombRun.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SnowDemo.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SnowDemo.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - BounceSprites.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - BounceSprites.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - Triad.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - Triad.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - GuiExample.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - GuiExample.xml - 1 - 1595 - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SpriteGuiDemos.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SpriteGuiDemos.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SdlDotNet.Tests.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SdlDotNet.Tests.xml - 1 - 1595 - - - - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - AudioExample.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - AudioExample.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SdlDotNet.Particles.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SdlDotNet.Particles.xml - 1 - 1595 - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - ParticlesExample.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - ParticlesExample.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - NeHe.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - NeHe.xml - 1 - 1595 - - - - - - - - - - - App.ico - NeHe.cs - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - RedBook.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - RedBook.xml - 1 - 1595 - - - - - - - - - - - App.ico - RedBook.cs - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - PhysFsTest.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - PhysFsTest.xml - 1 - 1595 - - - - - - - - App.ico - - - - - diff --git a/Prebuild/doc/prebuild-example5.xml b/Prebuild/doc/prebuild-example5.xml deleted file mode 100644 index 52215477eb..0000000000 --- a/Prebuild/doc/prebuild-example5.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - DEBUG;TRACE;WIN32 - false - true - bin\Debug - Tao.Sdl.xml - true - - - - - TRACE;WIN32 - true - true - bin\Release - Tao.Sdl.xml - false - - - - Tao.Sdl.License.txt - Tao.Sdl.Readme.txt - Tao.Sdl.snk - Tao.Sdl.dll.config - - - - - AssemblyInfo.cs - Sdl.cs - SdlImage.cs - SdlMixer.cs - SdlTtf.cs - SdlNet.cs - SdlGfx.cs - Smpeg.cs - DelegateCallingConventionCdeclAttribute.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - Tao.Sdl.Tests.xml - true - - - - - TRACE;WIN32 - true - false - bin\Release - Tao.Sdl.Tests.xml - false - - - - - - - AssemblyInfo.cs - SdlTest.cs - SdlTestVideo.cs - SdlTestImage.cs - SdlTestTtf.cs - SdlTestMixer.cs - SdlTestGfx.cs - SmpegTest.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - - AssemblyInfo.cs - Rectangles.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - - AssemblyInfo.cs - SmpegPlayer.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - - AssemblyInfo.cs - GfxPrimitives.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - AssemblyInfo.cs - AppMain.cs - BuildProcessor.cs - Options.cs - ReleaseBuildProcessor.cs - UsageHelp.cs - - - - diff --git a/Prebuild/prebuild.xml b/Prebuild/prebuild.xml deleted file mode 100644 index 1f81086835..0000000000 --- a/Prebuild/prebuild.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - DEBUG;TRACE - false - bin/Debug - true - 1595 - - - - - TRACE - bin/Release - true - false - 1595 - - - - prebuild.xml - prebuild - - - Matthew Holmes (matthew@wildfiregames.com) - Dan Moorehead (dan05a@gmail.com) - Dave Hudson (jendave@yahoo.com) - Rob Loach (http://robloach.net) - C.J. Adams-Collier (cjac@colliertech.org) - The Prebuild project generator - - - DEBUG;TRACE - false - bin/Debug - true - Prebuild.snk - 1595 - - - - - TRACE - bin/Release - true - false - Prebuild.snk - 1595 - - - - - - - - - - - - - - diff --git a/Prebuild/scripts/Clean.bat b/Prebuild/scripts/Clean.bat deleted file mode 100755 index 806bbe8bd6..0000000000 --- a/Prebuild/scripts/Clean.bat +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -Prebuild.exe /clean /yes /removedir obj /file prebuild.xml /build NET_2_0 /pause diff --git a/Prebuild/scripts/Clean.sh b/Prebuild/scripts/Clean.sh deleted file mode 100755 index b0a6530d80..0000000000 --- a/Prebuild/scripts/Clean.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -./prebuild /clean /removedir obj /file ../prebuild.xml /pause -rm -rf ../Makefile diff --git a/Prebuild/scripts/Help.bat b/Prebuild/scripts/Help.bat deleted file mode 100755 index 7c843c46f8..0000000000 --- a/Prebuild/scripts/Help.bat +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -Prebuild.exe /usage /pause \ No newline at end of file diff --git a/Prebuild/scripts/MonoDevelop.sh b/Prebuild/scripts/MonoDevelop.sh deleted file mode 100755 index fbd7669659..0000000000 --- a/Prebuild/scripts/MonoDevelop.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -prebuild /target monodev /file ../prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/Prebuild.nsi b/Prebuild/scripts/Prebuild.nsi deleted file mode 100644 index 8f9854e0ea..0000000000 --- a/Prebuild/scripts/Prebuild.nsi +++ /dev/null @@ -1,231 +0,0 @@ -!verbose 3 - -!define PRODUCT_NAME "Prebuild" -!define PRODUCT_VERSION "1.3.1" -!define PRODUCT_PUBLISHER "Prebuild" -!define PRODUCT_PACKAGE "prebuild" -!define PRODUCT_WEB_SITE "http://dnpb.sourceforge.net" -!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Prebuild" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\Prebuild" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" -!define PRODUCT_PATH ".." - -;!define MUI_WELCOMEFINISHPAGE_BITMAP "PrebuildLogo.bmp" -;!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH -;!define MUI_UNWELCOMEFINISHPAGE_BITMAP "PrebuildLogo.bmp" -;!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH - -BrandingText "© 2003-2006 David Hudson, http://dnpb.sourceforge.net/" -SetCompressor lzma -CRCCheck on - -; File Association defines -;!include "fileassoc.nsh" - -; MUI 1.67 compatible ------ -!include "MUI.nsh" - -; MUI Settings -!define MUI_ABORTWARNING -!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" - -;-------------------------------- -;Variables - -;-------------------------------- -;Installer Pages - -; Welcome page -!insertmacro MUI_PAGE_WELCOME -; License page -!insertmacro MUI_PAGE_LICENSE "..\doc\license.txt" -; Directory page -!insertmacro MUI_PAGE_DIRECTORY - -; Instfiles page -!insertmacro MUI_PAGE_INSTFILES - -; Finish page -!insertmacro MUI_PAGE_FINISH - -;------------------------------------ -; Uninstaller pages -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH -;------------------------------------ - -; Language files -!insertmacro MUI_LANGUAGE "English" - -; Reserve files -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -; MUI end ------ - -Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -OutFile "..\${PRODUCT_PACKAGE}-${PRODUCT_VERSION}-setup.exe" -InstallDir "$PROGRAMFILES\Prebuild" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show - -; .NET Framework check -; http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dnnetdep/html/redistdeploy1_1.asp -; Section "Detecting that the .NET Framework 1.1 is installed" -Function .onInit - ReadRegDWORD $R0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" Install - StrCmp $R0 "" 0 CheckPreviousVersion - MessageBox MB_OK "Microsoft .NET Framework 1.1 was not found on this system.$\r$\n$\r$\nUnable to continue this installation." - Abort - - CheckPreviousVersion: - ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" - StrCmp $R0 "" CheckOSVersion 0 - MessageBox MB_OK "An old version of Prebuild is installed on this computer, please uninstall first.$\r$\n$\r$\nUnable to continue this installation." - Abort - - CheckOSVersion: - Call IsSupportedWindowsVersion - Pop $R0 - StrCmp $R0 "False" NoAbort 0 - MessageBox MB_OK "The operating system you are using is not supported by Prebuild (95/98/ME/NT3.x/NT4.x)." - Abort - - NoAbort: -FunctionEnd - -Section "Source" SecSource - SetOverwrite ifnewer - SetOutPath "$INSTDIR\src" - File /r /x *.swp /x .svn /x *.xml /x *.csproj /x *.user /x *.build /x *.prjx /x *.mdp /x bin /x obj /x *.nsi ${PRODUCT_PATH}\src\*.* - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR - -SectionEnd - -Section "Runtime" SecRuntime - SetOverwrite ifnewer - SetOutPath "$INSTDIR" - File /r /x *.swp /x .svn /x *.nsi /x src /x *.sln /x *.cmbx /x *.mds ${PRODUCT_PATH}\Prebuild.exe ${PRODUCT_PATH}\prebuild.xml - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR - -SectionEnd - -Section "Documentation" SecDocs - SetOverwrite ifnewer - SetOutPath "$INSTDIR\doc" - File /r /x *.swp /x .svn /x *.exe ${PRODUCT_PATH}\doc\*.* - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR -SectionEnd - -Section "Scripts" SecScripts - SetOverwrite ifnewer - SetOutPath "$INSTDIR\scripts" - File /r /x *.swp /x .svn /x *.nsi /x *.exe ${PRODUCT_PATH}\scripts\*.* - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR -SectionEnd - -;Language strings - -Section -AdditionalIcons - WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" -SectionEnd - -Section -Post - WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" -SectionEnd - -Section Uninstall - - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" - RMDir /r "$INSTDIR" - -SectionEnd - -; GetWindowsVersion, taken from NSIS help, modified for our purposes -Function IsSupportedWindowsVersion - - Push $R0 - Push $R1 - - ReadRegStr $R0 HKLM \ - "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - - IfErrors 0 lbl_winnt - - ; we are not NT - ReadRegStr $R0 HKLM \ - "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber - - StrCpy $R1 $R0 1 - StrCmp $R1 '4' 0 lbl_error - - StrCpy $R1 $R0 3 - - StrCmp $R1 '4.0' lbl_win32_95 - StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 - - lbl_win32_95: - StrCpy $R0 'False' - Goto lbl_done - - lbl_win32_98: - StrCpy $R0 'False' - Goto lbl_done - - lbl_win32_ME: - StrCpy $R0 'False' - Goto lbl_done - - lbl_winnt: - - StrCpy $R1 $R0 1 - - StrCmp $R1 '3' lbl_winnt_x - StrCmp $R1 '4' lbl_winnt_x - - StrCpy $R1 $R0 3 - - StrCmp $R1 '5.0' lbl_winnt_2000 - StrCmp $R1 '5.1' lbl_winnt_XP - StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error - - lbl_winnt_x: - StrCpy $R0 'False' - Goto lbl_done - - lbl_winnt_2000: - Strcpy $R0 'True' - Goto lbl_done - - lbl_winnt_XP: - Strcpy $R0 'True' - Goto lbl_done - - lbl_winnt_2003: - Strcpy $R0 'True' - Goto lbl_done - - lbl_error: - Strcpy $R0 'False' - lbl_done: - - Pop $R1 - Exch $R0 - -FunctionEnd diff --git a/Prebuild/scripts/SharpDevelop.bat b/Prebuild/scripts/SharpDevelop.bat deleted file mode 100755 index 08fea0bd16..0000000000 --- a/Prebuild/scripts/SharpDevelop.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a combine (.cmbx) and a set of project files (.prjx) -@rem for SharpDevelop (http://icsharpcode.net/OpenSource/SD/Default.aspx) -cd .. -Prebuild.exe /target sharpdev /file prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/SharpDevelop2.bat b/Prebuild/scripts/SharpDevelop2.bat deleted file mode 100755 index 49120abb7a..0000000000 --- a/Prebuild/scripts/SharpDevelop2.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a combine (.cmbx) and a set of project files (.prjx) -@rem for SharpDevelop (http://icsharpcode.net/OpenSource/SD/Default.aspx) -cd .. -Prebuild.exe /target sharpdev2 /file prebuild.xml /pause diff --git a/Prebuild/scripts/VS2002.bat b/Prebuild/scripts/VS2002.bat deleted file mode 100755 index dc5b6a7cfd..0000000000 --- a/Prebuild/scripts/VS2002.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj) -@rem for Microsoft Visual Studio .NET 2002 -cd .. -Prebuild.exe /target vs2002 /file prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/VS2003.bat b/Prebuild/scripts/VS2003.bat deleted file mode 100755 index 929a480a16..0000000000 --- a/Prebuild/scripts/VS2003.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj) -@rem for Microsoft Visual Studio .NET 2002 -cd .. -Prebuild.exe /target vs2003 /file prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/VS2005.bat b/Prebuild/scripts/VS2005.bat deleted file mode 100755 index 7a7af1dafd..0000000000 --- a/Prebuild/scripts/VS2005.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) -@rem for Microsoft Visual Studio .NET 2005 -cd .. -Prebuild.exe /target vs2005 /file prebuild.xml /build NET_2_0 /pause diff --git a/Prebuild/scripts/VS2008.bat b/Prebuild/scripts/VS2008.bat deleted file mode 100755 index eb51a820cb..0000000000 --- a/Prebuild/scripts/VS2008.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) -@rem for Microsoft Visual Studio .NET 2008 -cd .. -Prebuild.exe /target vs2008 /file prebuild.xml /pause diff --git a/Prebuild/scripts/autotools.bat b/Prebuild/scripts/autotools.bat deleted file mode 100755 index 43f9a74647..0000000000 --- a/Prebuild/scripts/autotools.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates Makefiles -@rem for autotools -cd .. -Prebuild.exe /target autotools /file prebuild.xml /pause diff --git a/Prebuild/scripts/autotools.sh b/Prebuild/scripts/autotools.sh deleted file mode 100755 index 4d140cebcf..0000000000 --- a/Prebuild/scripts/autotools.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -RUNTIME=`which mono` - -SCRIPTDIR=`dirname $0` -${RUNTIME} ${SCRIPTDIR}/../Prebuild.exe /target autotools /file ${SCRIPTDIR}/../prebuild.xml /build NET_2_0 diff --git a/Prebuild/scripts/makefile.bat b/Prebuild/scripts/makefile.bat deleted file mode 100755 index eef9a69443..0000000000 --- a/Prebuild/scripts/makefile.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates makefiles -@rem for make -cd .. -Prebuild.exe /target makefile /file prebuild.xml /pause diff --git a/Prebuild/scripts/makefile.sh b/Prebuild/scripts/makefile.sh deleted file mode 100755 index 2e656cba7b..0000000000 --- a/Prebuild/scripts/makefile.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -./prebuild /target makefile /file ../prebuild.xml /pause - -if [ -f ../Makefile ] -then - rm -rf ../Makefile -fi - -mv ../Prebuild.make ../Makefile diff --git a/Prebuild/scripts/nant.bat b/Prebuild/scripts/nant.bat deleted file mode 100755 index 925467d687..0000000000 --- a/Prebuild/scripts/nant.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a .build files -@rem for NAnt -cd .. -Prebuild.exe /target nant /file prebuild.xml /pause diff --git a/Prebuild/scripts/nant.sh b/Prebuild/scripts/nant.sh deleted file mode 100755 index 0311971421..0000000000 --- a/Prebuild/scripts/nant.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -prebuild /target nant /file ../prebuild.xml /pause diff --git a/Prebuild/scripts/xcode.bat b/Prebuild/scripts/xcode.bat deleted file mode 100755 index 9883edf0a1..0000000000 --- a/Prebuild/scripts/xcode.bat +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a Xcode files -@rem for NAnt -cd .. -Prebuild.exe /target xcode /file prebuild.xml /pause diff --git a/Prebuild/scripts/xcode.sh b/Prebuild/scripts/xcode.sh deleted file mode 100755 index e9b58f99d1..0000000000 --- a/Prebuild/scripts/xcode.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -prebuild /target xcode /file ../prebuild.xml /pause diff --git a/Prebuild/src/App.ico b/Prebuild/src/App.ico deleted file mode 100644 index ac4ea6f3c0b8554e84fb478312ec0e294a30aea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 - /// - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] - public sealed class DataNodeAttribute : Attribute - { - #region Fields - - private string m_Name = "unknown"; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - public DataNodeAttribute(string name) - { - m_Name = name; - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs deleted file mode 100644 index 2d6a6a7bfc..0000000000 --- a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Field)] - public sealed class OptionNodeAttribute : Attribute - { - #region Fields - - private string m_NodeName; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// Name of the node. - public OptionNodeAttribute(string nodeName) - { - m_NodeName = nodeName; - } - - #endregion - - #region Properties - - /// - /// Gets the name of the node. - /// - /// The name of the node. - public string NodeName - { - get - { - return m_NodeName; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Attributes/TargetAttribute.cs b/Prebuild/src/Core/Attributes/TargetAttribute.cs deleted file mode 100644 index 5ad62ee033..0000000000 --- a/Prebuild/src/Core/Attributes/TargetAttribute.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] - public sealed class TargetAttribute : Attribute - { - #region Fields - - private string m_Name; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - public TargetAttribute(string name) - { - m_Name = name; - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/FatalException.cs b/Prebuild/src/Core/FatalException.cs deleted file mode 100644 index 348790568f..0000000000 --- a/Prebuild/src/Core/FatalException.cs +++ /dev/null @@ -1,85 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - /// - [Serializable()] - public class FatalException : Exception - { - #region Constructors - - - /// - /// Initializes a new instance of the class. - /// - public FatalException() - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The format. - /// The args. - public FatalException(string format, params object[] args) - : base(String.Format(format, args)) - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public FatalException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public FatalException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Interfaces/IDataNode.cs b/Prebuild/src/Core/Interfaces/IDataNode.cs deleted file mode 100644 index 986dd2de8c..0000000000 --- a/Prebuild/src/Core/Interfaces/IDataNode.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -namespace Prebuild.Core.Interfaces -{ - /// - /// - /// - public interface IDataNode - { - /// - /// Gets or sets the parent. - /// - /// The parent. - IDataNode Parent { get; set; } - /// - /// Parses the specified node. - /// - /// The node. - void Parse(XmlNode node); - } -} diff --git a/Prebuild/src/Core/Interfaces/ITarget.cs b/Prebuild/src/Core/Interfaces/ITarget.cs deleted file mode 100644 index 47115c658b..0000000000 --- a/Prebuild/src/Core/Interfaces/ITarget.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Interfaces -{ - /// - /// - /// - public interface ITarget - { - /// - /// Writes the specified kern. - /// - /// The kern. - void Write(Kernel kern); - /// - /// Cleans the specified kern. - /// - /// The kern. - void Clean(Kernel kern); - /// - /// Gets the name. - /// - /// The name. - string Name { get; } - } -} \ No newline at end of file diff --git a/Prebuild/src/Core/Kernel.cs b/Prebuild/src/Core/Kernel.cs deleted file mode 100644 index 95ef04ee5c..0000000000 --- a/Prebuild/src/Core/Kernel.cs +++ /dev/null @@ -1,831 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Rob Loach (http://www.robloach.net), -C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Xml; -using System.Xml.Schema; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Parse; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core -{ - /// - /// - /// - public class Kernel : IDisposable - { - #region Inner Classes - - private struct NodeEntry - { - public Type Type; - public DataNodeAttribute Attribute; - } - - #endregion - - #region Fields - - private static readonly Kernel m_Instance = new Kernel(); - - /// - /// This must match the version of the schema that is embeeded - /// - private const string m_SchemaVersion = "1.7"; - private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; - private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; - bool disposed; - private Version m_Version; - private const string m_Revision = ""; - private CommandLineCollection m_CommandLine; - private Log m_Log; - private CurrentDirectory m_CurrentWorkingDirectory; - private XmlSchemaCollection m_Schemas; - - private Hashtable m_Targets; - private Hashtable m_Nodes; - - readonly List m_Solutions = new List(); - string m_Target; - string m_Clean; - string[] m_RemoveDirectories; - XmlDocument m_CurrentDoc; - bool m_PauseAfterFinish; - string[] m_ProjectGroups; - - #endregion - - #region Constructors - - private Kernel() - { - } - - #endregion - - #region Properties - - /// - /// Gets a value indicating whether [pause after finish]. - /// - /// true if [pause after finish]; otherwise, false. - public bool PauseAfterFinish - { - get - { - return m_PauseAfterFinish; - } - } - - /// - /// Gets the instance. - /// - /// The instance. - public static Kernel Instance - { - get - { - return m_Instance; - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); - } - } - - /// - /// Gets the command line. - /// - /// The command line. - public CommandLineCollection CommandLine - { - get - { - return m_CommandLine; - } - } - - /// - /// Gets the targets. - /// - /// The targets. - public Hashtable Targets - { - get - { - return m_Targets; - } - } - - /// - /// Gets the log. - /// - /// The log. - public Log Log - { - get - { - return m_Log; - } - } - - /// - /// Gets the current working directory. - /// - /// The current working directory. - public CurrentDirectory CurrentWorkingDirectory - { - get - { - return m_CurrentWorkingDirectory; - } - } - - /// - /// Gets the solutions. - /// - /// The solutions. - public List Solutions - { - get - { - return m_Solutions; - } - } - - /// - /// Gets the XmlDocument object representing the prebuild.xml - /// being processed - /// - /// The XmlDocument object - public XmlDocument CurrentDoc - { - get - { - return m_CurrentDoc; - } - } - - #endregion - - #region Private Methods - - private static void RemoveDirectories(string rootDir, string[] dirNames) - { - foreach(string dir in Directory.GetDirectories(rootDir)) - { - string simpleName = Path.GetFileName(dir); - - if(Array.IndexOf(dirNames, simpleName) != -1) - { - //delete if the name matches one of the directory names to delete - string fullDirPath = Path.GetFullPath(dir); - Directory.Delete(fullDirPath,true); - } - else//not a match, so check children - { - RemoveDirectories(dir,dirNames); - //recurse, checking children for them - } - } - } - -// private void RemoveDirectoryMatches(string rootDir, string dirPattern) -// { -// foreach(string dir in Directory.GetDirectories(rootDir)) -// { -// foreach(string match in Directory.GetDirectories(dir)) -// {//delete all child directories that match -// Directory.Delete(Path.GetFullPath(match),true); -// } -// //recure through the rest checking for nested matches to delete -// RemoveDirectoryMatches(dir,dirPattern); -// } -// } - - private void LoadSchema() - { - Assembly assembly = this.GetType().Assembly; - Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); - if(stream == null) - { - //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET - stream = assembly.GetManifestResourceStream(m_Schema); - if(stream == null) - { - throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); - } - } - XmlReader schema = new XmlTextReader(stream); - - m_Schemas = new XmlSchemaCollection(); - m_Schemas.Add(m_SchemaURI, schema); - } - - private void CacheVersion() - { - m_Version = Assembly.GetEntryAssembly().GetName().Version; - } - - private void CacheTargets(Assembly assm) - { - foreach(Type t in assm.GetTypes()) - { - TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); - - if(ta == null) - continue; - - if (t.IsAbstract) - continue; - - ITarget target = (ITarget)assm.CreateInstance(t.FullName); - if (target == null) - { - throw new MissingMethodException("Could not create ITarget instance"); - } - - m_Targets[ta.Name] = target; - } - } - - private void CacheNodeTypes(Assembly assm) - { - foreach(Type t in assm.GetTypes()) - { - foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) - { - NodeEntry ne = new NodeEntry(); - ne.Type = t; - ne.Attribute = dna; - m_Nodes[dna.Name] = ne; - } - } - } - - private void LogBanner() - { - m_Log.Write("Prebuild v" + this.Version); - m_Log.Write("Copyright (c) 2004-2008"); - m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); - m_Log.Write("Dan Moorehead (dan05a@gmail.com),"); - m_Log.Write("David Hudson (jendave@yahoo.com),"); - m_Log.Write("Rob Loach (http://www.robloach.net),"); - m_Log.Write("C.J. Adams-Collier (cjac@colliertech.org),"); - - m_Log.Write("See 'prebuild /usage' for help"); - m_Log.Write(); - } - - - - private void ProcessFile(string file) - { - ProcessFile(file, this.m_Solutions); - } - - public void ProcessFile(ProcessNode node, SolutionNode parent) - { - if (node.IsValid) - { - List list = new List(); - ProcessFile(node.Path, list); - - foreach (SolutionNode solution in list) - parent.SolutionsTable[solution.Name] = solution; - } - } - - /// - /// - /// - /// - /// - /// - public void ProcessFile(string file, IList solutions) - { - m_CurrentWorkingDirectory.Push(); - - string path = file; - try - { - try - { - path = Helper.ResolvePath(path); - } - catch(ArgumentException) - { - m_Log.Write("Could not open Prebuild file: " + path); - m_CurrentWorkingDirectory.Pop(); - return; - } - - Helper.SetCurrentDir(Path.GetDirectoryName(path)); - - XmlTextReader reader = new XmlTextReader(path); - - Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); - - //register command line arguments as XML variables - IDictionaryEnumerator dict = m_CommandLine.GetEnumerator(); - while (dict.MoveNext()) - { - string name = dict.Key.ToString().Trim(); - if (name.Length > 0) - pre.RegisterVariable(name, dict.Value.ToString()); - } - - string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML - - // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the - // output before the system processes it. - if (m_CommandLine.WasPassed("ppi")) - { - // Get the filename if there is one, otherwise use a default. - string ppiFile = m_CommandLine["ppi"]; - if (ppiFile == null || ppiFile.Trim().Length == 0) - { - ppiFile = "preprocessed-input.xml"; - } - - // Write out the string to the given stream. - try - { - using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) - { - ppiWriter.WriteLine(xml); - } - } - catch(IOException ex) - { - Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); - } - - // Finish processing this special tag. - return; - } - - m_CurrentDoc = new XmlDocument(); - try - { - XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); - - //validate while reading from string into XmlDocument DOM structure in memory - foreach(XmlSchema schema in m_Schemas) - { - validator.Schemas.Add(schema); - } - m_CurrentDoc.Load(validator); - } - catch(XmlException e) - { - throw new XmlException(e.ToString()); - } - - //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details - if(m_CommandLine.WasPassed("ppo")) - { - string ppoFile = m_CommandLine["ppo"]; - if(ppoFile == null || ppoFile.Trim().Length < 1) - { - ppoFile = "preprocessed.xml"; - } - - StreamWriter writer = null; - try - { - writer = new StreamWriter(ppoFile); - writer.Write(xml); - } - catch(IOException ex) - { - Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); - } - finally - { - if(writer != null) - { - writer.Close(); - } - } - return; - } - //start reading the xml config file - XmlElement rootNode = m_CurrentDoc.DocumentElement; - //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); - Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); - - foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions - { - IDataNode dataNode = ParseNode(node, null); - if(dataNode is ProcessNode) - { - ProcessNode proc = (ProcessNode)dataNode; - if(proc.IsValid) - { - ProcessFile(proc.Path); - } - } - else if(dataNode is SolutionNode) - { - solutions.Add((SolutionNode)dataNode); - } - } - } - catch(XmlSchemaException xse) - { - m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", - xse.LineNumber, path, xse.Message); - } - finally - { - m_CurrentWorkingDirectory.Pop(); - } - } - - #endregion - - #region Public Methods - - /// - /// Allows the project. - /// - /// The project groups flags. - /// - public bool AllowProject(string projectGroupsFlags) - { - if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) - { - if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) - { - foreach(string group in projectGroupsFlags.Split('|')) - { - if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list - { - return true; - } - } - } - return false;//not included in the list or no groups specified for the project - } - return true;//no filter specified in the command line args - } - - /// - /// Gets the type of the node. - /// - /// The node. - /// - public Type GetNodeType(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(!m_Nodes.ContainsKey(node.Name)) - { - return null; - } - - NodeEntry ne = (NodeEntry)m_Nodes[node.Name]; - return ne.Type; - } - - /// - /// - /// - /// - /// - /// - public IDataNode ParseNode(XmlNode node, IDataNode parent) - { - return ParseNode(node, parent, null); - } - - //Create an instance of the data node type that is mapped to the name of the xml DOM node - /// - /// Parses the node. - /// - /// The node. - /// The parent. - /// The pre node. - /// - public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) - { - IDataNode dataNode; - - try - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(preNode == null) - { - if(!m_Nodes.ContainsKey(node.Name)) - { - //throw new XmlException("Unknown XML node: " + node.Name); - return null; - } - - NodeEntry ne = (NodeEntry)m_Nodes[node.Name]; - Type type = ne.Type; - //DataNodeAttribute dna = ne.Attribute; - - dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); - if(dataNode == null) - { - throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); - } - } - else - dataNode = preNode; - - dataNode.Parent = parent; - dataNode.Parse(node); - } - catch(WarningException wex) - { - m_Log.Write(LogType.Warning, wex.Message); - return null; - } - catch(FatalException fex) - { - m_Log.WriteException(LogType.Error, fex); - throw; - } - catch(Exception ex) - { - m_Log.WriteException(LogType.Error, ex); - throw; - } - - return dataNode; - } - - /// - /// Initializes the specified target. - /// - /// The target. - /// The args. - public void Initialize(LogTargets target, string[] args) - { - m_Targets = new Hashtable(); - CacheTargets(this.GetType().Assembly); - m_Nodes = new Hashtable(); - CacheNodeTypes(this.GetType().Assembly); - CacheVersion(); - - m_CommandLine = new CommandLineCollection(args); - - string logFile = null; - if(m_CommandLine.WasPassed("log")) - { - logFile = m_CommandLine["log"]; - - if(logFile != null && logFile.Length == 0) - { - logFile = "Prebuild.log"; - } - } - else - { - target = target & ~LogTargets.File; //dont output to a file - } - - m_Log = new Log(target, logFile); - LogBanner(); - - m_CurrentWorkingDirectory = new CurrentDirectory(); - - m_Target = m_CommandLine["target"]; - m_Clean = m_CommandLine["clean"]; - string removeDirs = m_CommandLine["removedir"]; - if(removeDirs != null && removeDirs.Length == 0) - { - m_RemoveDirectories = removeDirs.Split('|'); - } - - string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include - if(flags != null && flags.Length == 0) - { - m_ProjectGroups = flags.Split('|'); - } - m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); - - LoadSchema(); - } - - /// - /// Processes this instance. - /// - public void Process() - { - bool perfomedOtherTask = false; - if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) - { - try - { - RemoveDirectories(".",m_RemoveDirectories); - } - catch(IOException e) - { - m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); - m_Log.WriteException(LogType.Error,e); - } - catch(UnauthorizedAccessException e) - { - m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); - m_Log.WriteException(LogType.Error,e); - } - perfomedOtherTask = true; - } - - if(m_Target != null && m_Clean != null) - { - m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); - return; - } - - if(m_Target == null && m_Clean == null) - { - if(perfomedOtherTask) //finished - { - return; - } - m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); - return; - } - - string file = "./prebuild.xml"; - if(m_CommandLine.WasPassed("file")) - { - file = m_CommandLine["file"]; - } - - ProcessFile(file); - - string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); - bool clean = (m_Target == null); - if(clean && target != null && target.Length == 0) - { - target = "all"; - } - if(clean && target == "all")//default to all if no target was specified for clean - { - //check if they passed yes - if (!m_CommandLine.WasPassed("yes")) - { - Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); - string ret = Console.ReadLine(); - if(ret == null) - { - return; - } - ret = ret.Trim().ToLower(); - if((ret.ToLower() != "y" && ret.ToLower() != "yes")) - { - return; - } - } - //clean all targets (just cleaning vs2002 target didn't clean nant) - foreach(ITarget targ in m_Targets.Values) - { - targ.Clean(this); - } - } - else - { - if (!m_Targets.Contains(target)) { - m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); - return; - } - ITarget targ = (ITarget)m_Targets[target]; - - if(clean) - { - targ.Clean(this); - } - else - { - targ.Write(this); - } - } - - m_Log.Flush(); - } - - #endregion - - #region IDisposable Members - - /// - /// - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose objects - /// - /// - /// If true, it will dispose close the handle - /// - /// - /// Will dispose managed and unmanaged resources. - /// - protected virtual void Dispose(bool disposing) - { - if (!this.disposed) - { - if (disposing) - { - if (this.m_Log != null) - { - this.m_Log.Close(); - this.m_Log = null; - } - } - } - this.disposed = true; - } - - /// - /// - /// - ~Kernel() - { - this.Dispose(false); - } - - /// - /// Closes and destroys this object - /// - /// - /// Same as Dispose(true) - /// - public void Close() - { - Dispose(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/AuthorNode.cs b/Prebuild/src/Core/Nodes/AuthorNode.cs deleted file mode 100644 index 20e72c01f1..0000000000 --- a/Prebuild/src/Core/Nodes/AuthorNode.cs +++ /dev/null @@ -1,89 +0,0 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Author")] - public class AuthorNode : DataNode - { - #region Fields - - private string m_Signature; - - #endregion - - #region Properties - - /// - /// Gets the signature. - /// - /// The signature. - public string Signature - { - get - { - return m_Signature; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Signature = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Signature == null) - { - m_Signature = ""; - } - - m_Signature = m_Signature.Trim(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/ConfigurationNode.cs b/Prebuild/src/Core/Nodes/ConfigurationNode.cs deleted file mode 100644 index 67d78d55fd..0000000000 --- a/Prebuild/src/Core/Nodes/ConfigurationNode.cs +++ /dev/null @@ -1,178 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Configuration")] - public class ConfigurationNode : DataNode, ICloneable, IComparable - { - #region Fields - - private string m_Name = "unknown"; - private OptionsNode m_Options; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public ConfigurationNode() - { - m_Options = new OptionsNode(); - } - - #endregion - - #region Properties - - /// - /// Gets or sets the parent. - /// - /// The parent. - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - base.Parent = value; - if(base.Parent is SolutionNode) - { - SolutionNode node = (SolutionNode)base.Parent; - if(node != null && node.Options != null) - { - node.Options.CopyTo(m_Options); - } - } - } - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets or sets the options. - /// - /// The options. - public OptionsNode Options - { - get - { - return m_Options; - } - set - { - m_Options = value; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - if( node == null ) - { - throw new ArgumentNullException("node"); - } - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is OptionsNode) - { - ((OptionsNode)dataNode).CopyTo(m_Options); - } - } - } - - /// - /// Copies to. - /// - /// The conf. - public void CopyTo(ConfigurationNode conf) - { - m_Options.CopyTo(conf.m_Options); - } - - #endregion - - #region ICloneable Members - - /// - /// Creates a new object that is a copy of the current instance. - /// - /// - /// A new object that is a copy of this instance. - /// - public object Clone() - { - ConfigurationNode ret = new ConfigurationNode(); - ret.m_Name = m_Name; - m_Options.CopyTo(ret.m_Options); - return ret; - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ConfigurationNode that = (ConfigurationNode) obj; - return this.m_Name.CompareTo(that.m_Name); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/DataNode.cs b/Prebuild/src/Core/Nodes/DataNode.cs deleted file mode 100644 index 763e6c3831..0000000000 --- a/Prebuild/src/Core/Nodes/DataNode.cs +++ /dev/null @@ -1,117 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using System.IO; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - public abstract class DataNode : IDataNode - { - #region Fields - - private IDataNode parent; - string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; - - #endregion - - #region IDataNode Members - - /// - /// Gets or sets the parent. - /// - /// The parent. - public virtual IDataNode Parent - { - get - { - return parent; - } - set - { - parent = value; - } - } - public string[] WebTypes - { - get { return m_WebTypes; } - } - /// - /// Parses the specified node. - /// - /// The node. - public virtual void Parse(XmlNode node) - { - } - public BuildAction GetBuildActionByFileName(string fileName) - { - string extension = Path.GetExtension(fileName).ToLower(); - foreach (string type in WebTypes) - { - if (extension == type) - return BuildAction.Content; - } - return BuildAction.Compile; - } - /// - /// Parses the file type to figure out what type it is - /// - /// - public SubType GetSubTypeByFileName(string fileName) - { - string extension = System.IO.Path.GetExtension(fileName).ToLower(); - string designer = String.Format(".designer{0}", extension); - string path = fileName.ToLower(); - if (extension == ".resx") - { - return SubType.Designer; - } - else if (path.EndsWith(".settings")) - { - return SubType.Settings; - } - else - { - - foreach (string type in WebTypes) - { - if (path.EndsWith(string.Format("{0}{1}", type, extension))) - { - return SubType.CodeBehind; - } - } - } - return SubType.Code; - } - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs deleted file mode 100644 index 27c205162a..0000000000 --- a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("DatabaseProject")] - public class DatabaseProjectNode : DataNode - { - string name; - string path; - string fullpath; - Guid guid = Guid.NewGuid(); - readonly List authors = new List(); - readonly List references = new List(); - - public Guid Guid - { - get { return guid; } - } - - public string Name - { - get { return name; } - } - - public string Path - { - get { return path; } - } - - public string FullPath - { - get { return fullpath; } - } - - public IEnumerable References - { - get { return references; } - } - - public override void Parse(XmlNode node) - { - name = Helper.AttributeValue(node, "name", name); - path = Helper.AttributeValue(node, "path", name); - - try - { - fullpath = Helper.ResolvePath(path); - } - catch - { - throw new WarningException("Could not resolve Solution path: {0}", path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - - try - { - Helper.SetCurrentDir(fullpath); - - if (node == null) - { - throw new ArgumentNullException("node"); - } - - foreach (XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - - if (dataNode == null) - continue; - - if (dataNode is AuthorNode) - authors.Add((AuthorNode)dataNode); - else if (dataNode is DatabaseReferenceNode) - references.Add((DatabaseReferenceNode)dataNode); - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - - base.Parse(node); - } - } -} diff --git a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs deleted file mode 100644 index 845db24b12..0000000000 --- a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using Prebuild.Core.Attributes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("DatabaseReference")] - public class DatabaseReferenceNode : DataNode - { - string name; - Guid providerId; - string connectionString; - - public string Name - { - get { return name; } - } - - public Guid ProviderId - { - get { return providerId; } - } - - public string ConnectionString - { - get { return connectionString; } - } - - public override void Parse(System.Xml.XmlNode node) - { - name = Helper.AttributeValue(node, "name", name); - - string providerName = Helper.AttributeValue(node, "providerName", string.Empty); - if (providerName != null) - { - switch (providerName) - { - // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* - // Not sure if these will help other operating systems, or if there's a better way. - case "Microsoft.SqlServerCe.Client.3.5": - providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; - case "System.Data.OleDb": - providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; - case "System.Data.OracleClient": - providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; - case "System.Data.SqlClient": - providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; - case "System.Data.Odbc": - providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; - - default: - throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); - } - } - else - providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); - - connectionString = Helper.AttributeValue(node, "connectionString", connectionString); - - base.Parse(node); - } - } -} diff --git a/Prebuild/src/Core/Nodes/DescriptionNode.cs b/Prebuild/src/Core/Nodes/DescriptionNode.cs deleted file mode 100644 index 353a5aec07..0000000000 --- a/Prebuild/src/Core/Nodes/DescriptionNode.cs +++ /dev/null @@ -1,89 +0,0 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// The object representing the /Prebuild/Solution/Project/Description element - /// - [DataNode("Description")] - public class DescriptionNode : DataNode - { - #region Fields - - private string m_Value; - - #endregion - - #region Properties - - /// - /// Gets the description Value. - /// - /// The description Value. - public string Value - { - get - { - return m_Value; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Value = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Value == null) - { - m_Value = ""; - } - - m_Value = m_Value.Trim(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/ExcludeNode.cs b/Prebuild/src/Core/Nodes/ExcludeNode.cs deleted file mode 100644 index 7f04cba72f..0000000000 --- a/Prebuild/src/Core/Nodes/ExcludeNode.cs +++ /dev/null @@ -1,89 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Exclude")] - public class ExcludeNode : DataNode - { - #region Fields - - private string m_Pattern = ""; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Pattern; - } - } - - /// - /// Gets the pattern. - /// - /// The pattern. - public string Pattern - { - get - { - return m_Pattern; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); - m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/FileNode.cs b/Prebuild/src/Core/Nodes/FileNode.cs deleted file mode 100644 index 1520fcb789..0000000000 --- a/Prebuild/src/Core/Nodes/FileNode.cs +++ /dev/null @@ -1,271 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; -using Prebuild.Core.Targets; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - public enum BuildAction - { - /// - /// - /// - None, - /// - /// - /// - Compile, - /// - /// - /// - Content, - /// - /// - /// - EmbeddedResource - } - - /// - /// - /// - public enum SubType - { - /// - /// - /// - Code, - /// - /// - /// - Component, - /// - /// - /// - Designer, - /// - /// - /// - Form, - /// - /// - /// - Settings, - /// - /// - /// - UserControl, - /// - /// - /// - CodeBehind, - } - - public enum CopyToOutput - { - Never, - Always, - PreserveNewest - } - - /// - /// - /// - [DataNode("File")] - public class FileNode : DataNode - { - #region Fields - - private string m_Path; - private string m_ResourceName = ""; - private BuildAction? m_BuildAction; - private bool m_Valid; - private SubType? m_SubType; - private CopyToOutput m_CopyToOutput = CopyToOutput.Never; - private bool m_Link = false; - private string m_LinkPath = string.Empty; - private bool m_PreservePath = false; - - - #endregion - - #region Properties - - /// - /// - /// - public string Path - { - get - { - return m_Path; - } - } - - /// - /// - /// - public string ResourceName - { - get - { - return m_ResourceName; - } - } - - /// - /// - /// - public BuildAction BuildAction - { - get - { - if (m_BuildAction != null) - return m_BuildAction.Value; - else - return GetBuildActionByFileName(this.Path); - - } - } - - public CopyToOutput CopyToOutput - { - get - { - return this.m_CopyToOutput; - } - } - - public bool IsLink - { - get - { - return this.m_Link; - } - } - - public string LinkPath - { - get - { - return this.m_LinkPath; - } - } - /// - /// - /// - public SubType SubType - { - get - { - if (m_SubType != null) - return m_SubType.Value; - else - return GetSubTypeByFileName(this.Path); - } - } - - /// - /// - /// - public bool IsValid - { - get - { - return m_Valid; - } - } - - /// - /// - /// - /// - /// - public bool PreservePath - { - get - { - return m_PreservePath; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); - if (buildAction != string.Empty) - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - string subType = Helper.AttributeValue(node, "subType", string.Empty); - if (subType != String.Empty) - m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); - - m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); - this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); - if ( this.m_Link == true ) - { - this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); - } - this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); - this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - m_Path = m_Path.Trim(); - m_Valid = true; - if(!File.Exists(m_Path)) - { - m_Valid = false; - Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/FilesNode.cs b/Prebuild/src/Core/Nodes/FilesNode.cs deleted file mode 100644 index dc306c2252..0000000000 --- a/Prebuild/src/Core/Nodes/FilesNode.cs +++ /dev/null @@ -1,247 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using System.IO; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Files")] - public class FilesNode : DataNode - { - #region Fields - - private StringCollection m_Files; - private Hashtable m_BuildActions; - private Hashtable m_SubTypes; - private Hashtable m_ResourceNames; - private Hashtable m_CopyToOutputs; - private Hashtable m_Links; - private Hashtable m_LinkPaths; - private Hashtable m_PreservePaths; - - #endregion - - #region Constructors - - /// - /// - /// - public FilesNode() - { - m_Files = new StringCollection(); - m_BuildActions = new Hashtable(); - m_SubTypes = new Hashtable(); - m_ResourceNames = new Hashtable(); - m_CopyToOutputs = new Hashtable(); - m_Links = new Hashtable(); - m_LinkPaths = new Hashtable(); - m_PreservePaths = new Hashtable(); - } - - #endregion - - #region Properties - - /// - /// - /// - public int Count - { - get - { - return m_Files.Count; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - /// - public BuildAction GetBuildAction(string file) - { - if(!m_BuildActions.ContainsKey(file)) - { - return BuildAction.Compile; - } - - return (BuildAction)m_BuildActions[file]; - } - - public CopyToOutput GetCopyToOutput(string file) - { - if (!this.m_CopyToOutputs.ContainsKey(file)) - { - return CopyToOutput.Never; - } - return (CopyToOutput) this.m_CopyToOutputs[file]; - } - - public bool GetIsLink(string file) - { - if (!this.m_Links.ContainsKey(file)) - { - return false; - } - return (bool) this.m_Links[file]; - } - - public string GetLinkPath( string file ) - { - if ( !this.m_LinkPaths.ContainsKey( file ) ) - { - return string.Empty; - } - return (string)this.m_LinkPaths[ file ]; - } - - /// - /// - /// - /// - /// - public SubType GetSubType(string file) - { - if(!m_SubTypes.ContainsKey(file)) - { - return SubType.Code; - } - - return (SubType)m_SubTypes[file]; - } - - /// - /// - /// - /// - /// - public string GetResourceName(string file) - { - if(!m_ResourceNames.ContainsKey(file)) - { - return ""; - } - - return (string)m_ResourceNames[file]; - } - - /// - /// - /// - /// - /// - public bool GetPreservePath( string file ) - { - if ( !m_PreservePaths.ContainsKey( file ) ) - { - return false; - } - - return (bool)m_PreservePaths[ file ]; - } - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is FileNode) - { - FileNode fileNode = (FileNode)dataNode; - if(fileNode.IsValid) - { - if (!m_Files.Contains(fileNode.Path)) - { - m_Files.Add(fileNode.Path); - m_BuildActions[fileNode.Path] = fileNode.BuildAction; - m_SubTypes[fileNode.Path] = fileNode.SubType; - m_ResourceNames[fileNode.Path] = fileNode.ResourceName; - this.m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; - this.m_Links[ fileNode.Path ] = fileNode.IsLink; - this.m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; - this.m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; - - } - } - } - else if(dataNode is MatchNode) - { - foreach(string file in ((MatchNode)dataNode).Files) - { - MatchNode matchNode = (MatchNode)dataNode; - if (!m_Files.Contains(file)) - { - m_Files.Add(file); - m_BuildActions[ file ] = matchNode.BuildAction == null ? GetBuildActionByFileName(file) : matchNode.BuildAction; - m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; - m_ResourceNames[ file ] = matchNode.ResourceName; - this.m_PreservePaths[ file ] = matchNode.PreservePath; - this.m_Links[ file ] = matchNode.IsLink; - this.m_LinkPaths[ file ] = matchNode.LinkPath; - this.m_CopyToOutputs[ file ] = matchNode.CopyToOutput; - - } - } - } - } - } - - // TODO: Check in to why StringCollection's enumerator doesn't implement - // IEnumerator? - /// - /// - /// - /// - public StringEnumerator GetEnumerator() - { - return m_Files.GetEnumerator(); - } - - #endregion - - } -} diff --git a/Prebuild/src/Core/Nodes/MatchNode.cs b/Prebuild/src/Core/Nodes/MatchNode.cs deleted file mode 100644 index 656d7d0718..0000000000 --- a/Prebuild/src/Core/Nodes/MatchNode.cs +++ /dev/null @@ -1,330 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Text.RegularExpressions; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; -using System.Collections; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Match")] - public class MatchNode : DataNode - { - #region Fields - - private readonly StringCollection m_Files = new StringCollection(); - private Regex m_Regex; - private BuildAction? m_BuildAction; - private SubType? m_SubType; - string m_ResourceName = ""; - private CopyToOutput m_CopyToOutput; - private bool m_Link; - private string m_LinkPath; - private bool m_PreservePath; - private readonly List m_Exclusions = new List(); - - #endregion - - #region Properties - - /// - /// - /// - public StringCollection Files - { - get - { - return m_Files; - } - } - - /// - /// - /// - public BuildAction? BuildAction - { - get - { - return m_BuildAction; - } - } - - /// - /// - /// - public SubType? SubType - { - get - { - return m_SubType; - } - } - - public CopyToOutput CopyToOutput - { - get - { - return this.m_CopyToOutput; - } - } - - public bool IsLink - { - get - { - return this.m_Link; - } - } - - public string LinkPath - { - get - { - return this.m_LinkPath; - } - } - /// - /// - /// - public string ResourceName - { - get - { - return m_ResourceName; - } - } - - public bool PreservePath - { - get - { - return m_PreservePath; - } - } - - #endregion - - #region Private Methods - - /// - /// Recurses the directories. - /// - /// The path. - /// The pattern. - /// if set to true [recurse]. - /// if set to true [use regex]. - private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List exclusions) - { - Match match; - Boolean excludeFile; - try - { - string[] files; - - if(!useRegex) - { - files = Directory.GetFiles(path, pattern); - if(files != null) - { - string fileTemp; - foreach (string file in files) - { - excludeFile = false; - if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") - { - fileTemp = file.Substring(2); - } - else - { - fileTemp = file; - } - - // Check all excludions and set flag if there are any hits. - foreach ( ExcludeNode exclude in exclusions ) - { - Regex exRegEx = new Regex( exclude.Pattern ); - match = exRegEx.Match( file ); - excludeFile |= match.Success; - } - - if ( !excludeFile ) - { - m_Files.Add( fileTemp ); - } - - } - } - else - { - return; - } - } - else - { - files = Directory.GetFiles(path); - foreach(string file in files) - { - excludeFile = false; - - match = m_Regex.Match(file); - if(match.Success) - { - // Check all excludions and set flag if there are any hits. - foreach ( ExcludeNode exclude in exclusions ) - { - Regex exRegEx = new Regex( exclude.Pattern ); - match = exRegEx.Match( file ); - excludeFile |= !match.Success; - } - - if ( !excludeFile ) - { - m_Files.Add( file ); - } - } - } - } - - if(recurse) - { - string[] dirs = Directory.GetDirectories(path); - if(dirs != null && dirs.Length > 0) - { - foreach(string str in dirs) - { - RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); - } - } - } - } - catch(DirectoryNotFoundException) - { - return; - } - catch(ArgumentException) - { - return; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - string path = Helper.AttributeValue(node, "path", "."); - string pattern = Helper.AttributeValue(node, "pattern", "*"); - bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); - bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); - string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); - if (buildAction != string.Empty) - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - - //TODO: Figure out where the subtype node is being assigned - //string subType = Helper.AttributeValue(node, "subType", string.Empty); - //if (subType != String.Empty) - // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); - m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); - this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); - this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); - if ( this.m_Link == true ) - { - this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); - } - this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); - - - if(path != null && path.Length == 0) - { - path = ".";//use current directory - } - //throw new WarningException("Match must have a 'path' attribute"); - - if(pattern == null) - { - throw new WarningException("Match must have a 'pattern' attribute"); - } - - path = Helper.NormalizePath(path); - if(!Directory.Exists(path)) - { - throw new WarningException("Match path does not exist: {0}", path); - } - - try - { - if(useRegex) - { - m_Regex = new Regex(pattern); - } - } - catch(ArgumentException ex) - { - throw new WarningException("Could not compile regex pattern: {0}", ex.Message); - } - - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is ExcludeNode) - { - ExcludeNode excludeNode = (ExcludeNode)dataNode; - m_Exclusions.Add( excludeNode ); - } - } - - RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); - - if(m_Files.Count < 1) - { - throw new WarningException("Match returned no files: {0}{1}", Helper.EndPath(path), pattern); - } - m_Regex = null; - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/OptionsNode.cs b/Prebuild/src/Core/Nodes/OptionsNode.cs deleted file mode 100644 index b63034bfe8..0000000000 --- a/Prebuild/src/Core/Nodes/OptionsNode.cs +++ /dev/null @@ -1,644 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Options")] - public class OptionsNode : DataNode - { - #region Fields - - private static Hashtable m_OptionFields; - - [OptionNode("CompilerDefines")] - private string m_CompilerDefines = ""; - - /// - /// - /// - public string CompilerDefines - { - get - { - return m_CompilerDefines; - } - set - { - m_CompilerDefines = value; - } - } - - [OptionNode("OptimizeCode")] - private bool m_OptimizeCode; - - /// - /// - /// - public bool OptimizeCode - { - get - { - return m_OptimizeCode; - } - set - { - m_OptimizeCode = value; - } - } - - [OptionNode("CheckUnderflowOverflow")] - private bool m_CheckUnderflowOverflow; - - /// - /// - /// - public bool CheckUnderflowOverflow - { - get - { - return m_CheckUnderflowOverflow; - } - set - { - m_CheckUnderflowOverflow = value; - } - } - - [OptionNode("AllowUnsafe")] - private bool m_AllowUnsafe; - - /// - /// - /// - public bool AllowUnsafe - { - get - { - return m_AllowUnsafe; - } - set - { - m_AllowUnsafe = value; - } - } - - [OptionNode("PreBuildEvent")] - private string m_PreBuildEvent; - - /// - /// - /// - public string PreBuildEvent - { - get - { - return m_PreBuildEvent; - } - set - { - m_PreBuildEvent = value; - } - } - - [OptionNode("PostBuildEvent")] - private string m_PostBuildEvent; - - /// - /// - /// - public string PostBuildEvent - { - get - { - return m_PostBuildEvent; - } - set - { - m_PostBuildEvent = value; - } - } - - [OptionNode("PreBuildEventArgs")] - private string m_PreBuildEventArgs; - - /// - /// - /// - public string PreBuildEventArgs - { - get - { - return m_PreBuildEventArgs; - } - set - { - m_PreBuildEventArgs = value; - } - } - - [OptionNode("PostBuildEventArgs")] - private string m_PostBuildEventArgs; - - /// - /// - /// - public string PostBuildEventArgs - { - get - { - return m_PostBuildEventArgs; - } - set - { - m_PostBuildEventArgs = value; - } - } - - [OptionNode("RunPostBuildEvent")] - private string m_RunPostBuildEvent; - - /// - /// - /// - public string RunPostBuildEvent - { - get - { - return m_RunPostBuildEvent; - } - set - { - m_RunPostBuildEvent = value; - } - } - - [OptionNode("RunScript")] - private string m_RunScript; - - /// - /// - /// - public string RunScript - { - get - { - return m_RunScript; - } - set - { - m_RunScript = value; - } - } - - [OptionNode("WarningLevel")] - private int m_WarningLevel = 4; - - /// - /// - /// - public int WarningLevel - { - get - { - return m_WarningLevel; - } - set - { - m_WarningLevel = value; - } - } - - [OptionNode("WarningsAsErrors")] - private bool m_WarningsAsErrors; - - /// - /// - /// - public bool WarningsAsErrors - { - get - { - return m_WarningsAsErrors; - } - set - { - m_WarningsAsErrors = value; - } - } - - [OptionNode("SuppressWarnings")] - private string m_SuppressWarnings = ""; - - /// - /// - /// - public string SuppressWarnings - { - get - { - return m_SuppressWarnings; - } - set - { - m_SuppressWarnings = value; - } - } - - [OptionNode("OutputPath")] - private string m_OutputPath = "bin/"; - - /// - /// - /// - public string OutputPath - { - get - { - return m_OutputPath; - } - set - { - m_OutputPath = value; - } - } - - [OptionNode("GenerateDocumentation")] - private bool m_GenerateDocumentation; - - /// - /// - /// - public bool GenerateDocumentation - { - get - { - return m_GenerateDocumentation; - } - set - { - m_GenerateDocumentation = value; - } - } - - [OptionNode("GenerateXmlDocFile")] - private bool m_GenerateXmlDocFile; - - /// - /// - /// - public bool GenerateXmlDocFile - { - get - { - return m_GenerateXmlDocFile; - } - set - { - m_GenerateXmlDocFile = value; - } - } - - [OptionNode("XmlDocFile")] - private string m_XmlDocFile = ""; - - /// - /// - /// - public string XmlDocFile - { - get - { - return m_XmlDocFile; - } - set - { - m_XmlDocFile = value; - } - } - - [OptionNode("KeyFile")] - private string m_KeyFile = ""; - - /// - /// - /// - public string KeyFile - { - get - { - return m_KeyFile; - } - set - { - m_KeyFile = value; - } - } - - [OptionNode("DebugInformation")] - private bool m_DebugInformation; - - /// - /// - /// - public bool DebugInformation - { - get - { - return m_DebugInformation; - } - set - { - m_DebugInformation = value; - } - } - - [OptionNode("RegisterComInterop")] - private bool m_RegisterComInterop; - - /// - /// - /// - public bool RegisterComInterop - { - get - { - return m_RegisterComInterop; - } - set - { - m_RegisterComInterop = value; - } - } - - [OptionNode("RemoveIntegerChecks")] - private bool m_RemoveIntegerChecks; - - /// - /// - /// - public bool RemoveIntegerChecks - { - get - { - return m_RemoveIntegerChecks; - } - set - { - m_RemoveIntegerChecks = value; - } - } - - [OptionNode("IncrementalBuild")] - private bool m_IncrementalBuild; - - /// - /// - /// - public bool IncrementalBuild - { - get - { - return m_IncrementalBuild; - } - set - { - m_IncrementalBuild = value; - } - } - - [OptionNode("BaseAddress")] - private string m_BaseAddress = "285212672"; - - /// - /// - /// - public string BaseAddress - { - get - { - return m_BaseAddress; - } - set - { - m_BaseAddress = value; - } - } - - [OptionNode("FileAlignment")] - private int m_FileAlignment = 4096; - - /// - /// - /// - public int FileAlignment - { - get - { - return m_FileAlignment; - } - set - { - m_FileAlignment = value; - } - } - - [OptionNode("NoStdLib")] - private bool m_NoStdLib; - - /// - /// - /// - public bool NoStdLib - { - get - { - return m_NoStdLib; - } - set - { - m_NoStdLib = value; - } - } - - private StringCollection m_FieldsDefined; - - #endregion - - #region Constructors - - /// - /// Initializes the class. - /// - static OptionsNode() - { - Type t = typeof(OptionsNode); - - m_OptionFields = new Hashtable(); - foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) - { - object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); - if(attrs == null || attrs.Length < 1) - { - continue; - } - - OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; - m_OptionFields[ona.NodeName] = f; - } - } - - /// - /// Initializes a new instance of the class. - /// - public OptionsNode() - { - m_FieldsDefined = new StringCollection(); - } - - #endregion - - #region Properties - - /// - /// Gets the at the specified index. - /// - /// - public object this[string index] - { - get - { - if(!m_OptionFields.ContainsKey(index)) - { - return null; - } - - FieldInfo f = (FieldInfo)m_OptionFields[index]; - return f.GetValue(this); - } - } - - /// - /// Gets the at the specified index. - /// - /// - public object this[string index, object defaultValue] - { - get - { - object valueObject = this[index]; - if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) - { - return defaultValue; - } - return valueObject; - } - } - - - #endregion - - #region Private Methods - - private void FlagDefined(string name) - { - if(!m_FieldsDefined.Contains(name)) - { - m_FieldsDefined.Add(name); - } - } - - private void SetOption(string nodeName, string val) - { - lock(m_OptionFields) - { - if(!m_OptionFields.ContainsKey(nodeName)) - { - return; - } - - FieldInfo f = (FieldInfo)m_OptionFields[nodeName]; - f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); - FlagDefined(f.Name); - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); - } - } - - /// - /// Copies to. - /// - /// The opt. - public void CopyTo(OptionsNode opt) - { - if(opt == null) - { - return; - } - - foreach(FieldInfo f in m_OptionFields.Values) - { - if(m_FieldsDefined.Contains(f.Name)) - { - f.SetValue(opt, f.GetValue(this)); - opt.m_FieldsDefined.Add(f.Name); - } - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/ProcessNode.cs b/Prebuild/src/Core/Nodes/ProcessNode.cs deleted file mode 100644 index 6bfbe16be3..0000000000 --- a/Prebuild/src/Core/Nodes/ProcessNode.cs +++ /dev/null @@ -1,110 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Process")] - public class ProcessNode : DataNode - { - #region Fields - - private string m_Path; - private bool m_IsValid = true; - - #endregion - - #region Properties - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets a value indicating whether this instance is valid. - /// - /// true if this instance is valid; otherwise, false. - public bool IsValid - { - get - { - return m_IsValid; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - try - { - m_Path = Helper.ResolvePath(m_Path); - } - catch(ArgumentException) - { - Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); - m_IsValid = false; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/ProjectNode.cs b/Prebuild/src/Core/Nodes/ProjectNode.cs deleted file mode 100644 index 04af7a3582..0000000000 --- a/Prebuild/src/Core/Nodes/ProjectNode.cs +++ /dev/null @@ -1,580 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// A set of values that the Project's type can be - /// - public enum ProjectType - { - /// - /// The project is a console executable - /// - Exe, - /// - /// The project is a windows executable - /// - WinExe, - /// - /// The project is a library - /// - Library, - /// - /// The project is a website - /// - Web, - } - - /// - /// - /// - public enum ClrRuntime - { - /// - /// - /// - Microsoft, - /// - /// - /// - Mono - } - /// - /// The version of the .NET framework to use (Required for VS2008) - /// We don't need .NET 1.1 in here, it'll default when using vs2003. - /// - public enum FrameworkVersion - { - /// - /// .NET 2.0 - /// - v2_0, - /// - /// .NET 3.0 - /// - v3_0, - /// - /// .NET 3.5 - /// - v3_5, - /// - /// .NET 4.0 - /// - v4_0, - } - /// - /// The Node object representing /Prebuild/Solution/Project elements - /// - [DataNode("Project")] - public class ProjectNode : DataNode, IComparable - { - #region Fields - - private string m_Name = "unknown"; - private string m_Path = ""; - private string m_FullPath = ""; - private string m_AssemblyName; - private string m_AppIcon = ""; - private string m_ConfigFile = ""; - private string m_DesignerFolder = ""; - private string m_Language = "C#"; - private ProjectType m_Type = ProjectType.Exe; - private ClrRuntime m_Runtime = ClrRuntime.Microsoft; - private FrameworkVersion m_Framework = FrameworkVersion.v2_0; - private string m_StartupObject = ""; - private string m_RootNamespace; - private string m_FilterGroups = ""; - private string m_Version = ""; - private Guid m_Guid; - private string m_DebugStartParameters; - - private Hashtable m_Configurations = new Hashtable(); - private readonly List m_ReferencePaths = new List(); - private readonly List m_References = new List(); - private readonly List m_Authors = new List(); - private FilesNode m_Files; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - /// - /// The version of the .NET Framework to compile under - /// - public FrameworkVersion FrameworkVersion - { - get - { - return this.m_Framework; - } - } - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets the filter groups. - /// - /// The filter groups. - public string FilterGroups - { - get - { - return m_FilterGroups; - } - } - - /// - /// Gets the project's version - /// - /// The project's version. - public string Version - { - get - { - return m_Version; - } - } - - /// - /// Gets the full path. - /// - /// The full path. - public string FullPath - { - get - { - return m_FullPath; - } - } - - /// - /// Gets the name of the assembly. - /// - /// The name of the assembly. - public string AssemblyName - { - get - { - return m_AssemblyName; - } - } - - /// - /// Gets the app icon. - /// - /// The app icon. - public string AppIcon - { - get - { - return m_AppIcon; - } - } - - /// - /// Gets the app icon. - /// - /// The app icon. - public string ConfigFile - { - get - { - return m_ConfigFile; - } - } - - /// - /// - /// - public string DesignerFolder - { - get - { - return m_DesignerFolder; - } - } - - /// - /// Gets the language. - /// - /// The language. - public string Language - { - get - { - return m_Language; - } - } - - /// - /// Gets the type. - /// - /// The type. - public ProjectType Type - { - get - { - return m_Type; - } - } - - /// - /// Gets the runtime. - /// - /// The runtime. - public ClrRuntime Runtime - { - get - { - return m_Runtime; - } - } - - private bool m_GenerateAssemblyInfoFile = false; - - /// - /// - /// - public bool GenerateAssemblyInfoFile - { - get - { - return m_GenerateAssemblyInfoFile; - } - set - { - m_GenerateAssemblyInfoFile = value; - } - } - - /// - /// Gets the startup object. - /// - /// The startup object. - public string StartupObject - { - get - { - return m_StartupObject; - } - } - - /// - /// Gets the root namespace. - /// - /// The root namespace. - public string RootNamespace - { - get - { - return m_RootNamespace; - } - } - - /// - /// Gets the configurations. - /// - /// The configurations. - public IList Configurations - { - get - { - ArrayList tmp = new ArrayList(ConfigurationsTable.Values); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the configurations table. - /// - /// The configurations table. - public Hashtable ConfigurationsTable - { - get - { - return m_Configurations; - } - } - - /// - /// Gets the reference paths. - /// - /// The reference paths. - public List ReferencePaths - { - get - { - List tmp = new List(m_ReferencePaths); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the references. - /// - /// The references. - public List References - { - get - { - List tmp = new List(m_References); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the Authors list. - /// - /// The list of the project's authors. - public List Authors - { - get - { - return m_Authors; - } - } - - /// - /// Gets the files. - /// - /// The files. - public FilesNode Files - { - get - { - return m_Files; - } - } - - /// - /// Gets or sets the parent. - /// - /// The parent. - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - base.Parent = value; - if(base.Parent is SolutionNode && m_Configurations.Count < 1) - { - SolutionNode parent = (SolutionNode)base.Parent; - foreach(ConfigurationNode conf in parent.Configurations) - { - m_Configurations[conf.Name] = conf.Clone(); - } - } - } - } - - /// - /// Gets the GUID. - /// - /// The GUID. - public Guid Guid - { - get - { - return m_Guid; - } - } - - public string DebugStartParameters - { - get - { - return m_DebugStartParameters; - } - } - - #endregion - - #region Private Methods - - private void HandleConfiguration(ConfigurationNode conf) - { - if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, - //so it *may* override changes to the same properties for configurations defines at the project level - { - foreach(ConfigurationNode confNode in this.m_Configurations.Values) - { - conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides - } - } - if(m_Configurations.ContainsKey(conf.Name)) - { - ConfigurationNode parentConf = (ConfigurationNode)m_Configurations[conf.Name]; - conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides - } - else - { - m_Configurations[conf.Name] = conf; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); - m_Version = Helper.AttributeValue(node, "version", m_Version); - m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); - m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); - m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); - m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); - m_Language = Helper.AttributeValue(node, "language", m_Language); - m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); - m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); - m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); - m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); - m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); - - int hash = m_Name.GetHashCode(); - Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString()); - m_Guid = new Guid(guid); - - m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); - m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty); - - if(m_AssemblyName == null || m_AssemblyName.Length < 1) - { - m_AssemblyName = m_Name; - } - - if(m_RootNamespace == null || m_RootNamespace.Length < 1) - { - m_RootNamespace = m_Name; - } - - m_FullPath = m_Path; - try - { - m_FullPath = Helper.ResolvePath(m_FullPath); - } - catch - { - throw new WarningException("Could not resolve Solution path: {0}", m_Path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - try - { - Helper.SetCurrentDir(m_FullPath); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is ConfigurationNode) - { - HandleConfiguration((ConfigurationNode)dataNode); - } - else if(dataNode is ReferencePathNode) - { - m_ReferencePaths.Add((ReferencePathNode)dataNode); - } - else if(dataNode is ReferenceNode) - { - m_References.Add((ReferenceNode)dataNode); - } - else if(dataNode is AuthorNode) - { - m_Authors.Add((AuthorNode)dataNode); - } - else if(dataNode is FilesNode) - { - m_Files = (FilesNode)dataNode; - } - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ProjectNode that = (ProjectNode)obj; - return this.m_Name.CompareTo(that.m_Name); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/ReferenceNode.cs b/Prebuild/src/Core/Nodes/ReferenceNode.cs deleted file mode 100644 index 9c5d1a3491..0000000000 --- a/Prebuild/src/Core/Nodes/ReferenceNode.cs +++ /dev/null @@ -1,144 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Reference")] - public class ReferenceNode : DataNode, IComparable - { - #region Fields - - private string m_Name = "unknown"; - private string m_Path; - private string m_LocalCopy; - private string m_Version; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets a value indicating whether [local copy specified]. - /// - /// true if [local copy specified]; otherwise, false. - public bool LocalCopySpecified - { - get - { - return ( m_LocalCopy != null && m_LocalCopy.Length == 0); - } - } - - /// - /// Gets a value indicating whether [local copy]. - /// - /// true if [local copy]; otherwise, false. - public bool LocalCopy - { - get - { - if( m_LocalCopy == null) - { - return false; - } - return bool.Parse(m_LocalCopy); - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return m_Version; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); - m_Version = Helper.AttributeValue(node, "version", m_Version); - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ReferenceNode that = (ReferenceNode)obj; - return this.m_Name.CompareTo(that.m_Name); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/ReferencePathNode.cs b/Prebuild/src/Core/Nodes/ReferencePathNode.cs deleted file mode 100644 index f0543c267e..0000000000 --- a/Prebuild/src/Core/Nodes/ReferencePathNode.cs +++ /dev/null @@ -1,99 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("ReferencePath")] - public class ReferencePathNode : DataNode, IComparable - { - #region Fields - - private string m_Path; - - #endregion - - #region Properties - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - m_Path = m_Path.Trim(); - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ReferencePathNode that = (ReferencePathNode)obj; - return this.m_Path.CompareTo(that.m_Path); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/SolutionNode.cs b/Prebuild/src/Core/Nodes/SolutionNode.cs deleted file mode 100644 index 2a1b8e2c55..0000000000 --- a/Prebuild/src/Core/Nodes/SolutionNode.cs +++ /dev/null @@ -1,358 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Solution")] - [DataNode("EmbeddedSolution")] - [DebuggerDisplay("{Name}")] - public class SolutionNode : DataNode - { - #region Fields - - private Guid m_Guid = Guid.NewGuid(); - private string m_Name = "unknown"; - private string m_Path = ""; - private string m_FullPath = ""; - private string m_ActiveConfig = "Debug"; - private string m_Version = "1.0.0"; - - private OptionsNode m_Options; - private FilesNode m_Files; - private readonly Hashtable m_Configurations = new Hashtable(); - private readonly Hashtable m_Projects = new Hashtable(); - private readonly Hashtable m_DatabaseProjects = new Hashtable(); - private readonly List m_ProjectsOrder = new List(); - private readonly Hashtable m_Solutions = new Hashtable(); - - #endregion - - #region Properties - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - if (value is SolutionNode) - { - SolutionNode solution = (SolutionNode)value; - foreach (ConfigurationNode conf in solution.Configurations) - { - m_Configurations[conf.Name] = conf.Clone(); - } - } - - base.Parent = value; - } - } - - public Guid Guid - { - get - { - return m_Guid; - } - set - { - m_Guid = value; - } - } - /// - /// Gets or sets the active config. - /// - /// The active config. - public string ActiveConfig - { - get - { - return m_ActiveConfig; - } - set - { - m_ActiveConfig = value; - } - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets the full path. - /// - /// The full path. - public string FullPath - { - get - { - return m_FullPath; - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return m_Version; - } - } - - /// - /// Gets the options. - /// - /// The options. - public OptionsNode Options - { - get - { - return m_Options; - } - } - - /// - /// Gets the files. - /// - /// The files. - public FilesNode Files - { - get - { - return m_Files; - } - } - - /// - /// Gets the configurations. - /// - /// The configurations. - public ICollection Configurations - { - get - { - ArrayList tmp = new ArrayList(ConfigurationsTable.Values); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the configurations table. - /// - /// The configurations table. - public Hashtable ConfigurationsTable - { - get - { - return m_Configurations; - } - } - /// - /// Gets the database projects. - /// - public ICollection DatabaseProjects - { - get - { - return m_DatabaseProjects.Values; - } - } - /// - /// Gets the nested solutions. - /// - public ICollection Solutions - { - get - { - return m_Solutions.Values; - } - } - /// - /// Gets the nested solutions hash table. - /// - public Hashtable SolutionsTable - { - get - { - return this.m_Solutions; - } - } - /// - /// Gets the projects. - /// - /// The projects. - public ICollection Projects - { - get - { - ArrayList tmp = new ArrayList(m_Projects.Values); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the projects table. - /// - /// The projects table. - public Hashtable ProjectsTable - { - get - { - return m_Projects; - } - } - - /// - /// Gets the projects table. - /// - /// The projects table. - public List ProjectsTableOrder - { - get - { - return m_ProjectsOrder; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_Version = Helper.AttributeValue(node, "version", m_Version); - - m_FullPath = m_Path; - try - { - m_FullPath = Helper.ResolvePath(m_FullPath); - } - catch - { - throw new WarningException("Could not resolve solution path: {0}", m_Path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - try - { - Helper.SetCurrentDir(m_FullPath); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is OptionsNode) - { - m_Options = (OptionsNode)dataNode; - } - else if(dataNode is FilesNode) - { - m_Files = (FilesNode)dataNode; - } - else if(dataNode is ConfigurationNode) - { - m_Configurations[((ConfigurationNode)dataNode).Name] = dataNode; - } - else if(dataNode is ProjectNode) - { - m_Projects[((ProjectNode)dataNode).Name] = dataNode; - m_ProjectsOrder.Add((ProjectNode)dataNode); - } - else if(dataNode is SolutionNode) - { - m_Solutions[((SolutionNode)dataNode).Name] = dataNode; - } - else if (dataNode is ProcessNode) - { - ProcessNode p = (ProcessNode)dataNode; - Kernel.Instance.ProcessFile(p, this); - } - else if (dataNode is DatabaseProjectNode) - { - m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = dataNode; - } - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Parse/IfContext.cs b/Prebuild/src/Core/Parse/IfContext.cs deleted file mode 100644 index 3c79d38b06..0000000000 --- a/Prebuild/src/Core/Parse/IfContext.cs +++ /dev/null @@ -1,154 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Parse -{ - /// - /// - /// - public enum IfState - { - /// - /// - /// - None, - /// - /// - /// - If, - /// - /// - /// - ElseIf, - /// - /// - /// - Else - } - - /// - /// Summary description for IfContext. - /// - // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) - public class IfContext - { - #region Properties - - bool m_Active; - bool m_Keep; - bool m_EverKept; - IfState m_State = IfState.None; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// if set to true [active]. - /// if set to true [keep]. - /// The state. - public IfContext(bool active, bool keep, IfState state) - { - m_Active = active; - m_Keep = keep; - m_EverKept = keep; - m_State = state; - } - - #endregion - - #region Properties - - /// - /// Gets or sets a value indicating whether this is active. - /// - /// true if active; otherwise, false. - public bool Active - { - get - { - return m_Active; - } - set - { - m_Active = value; - } - } - - /// - /// Gets or sets a value indicating whether this is keep. - /// - /// true if keep; otherwise, false. - public bool Keep - { - get - { - return m_Keep; - } - set - { - m_Keep = value; - if(m_Keep) - { - m_EverKept = true; - } - } - } - - /// - /// Gets a value indicating whether [ever kept]. - /// - /// true if [ever kept]; otherwise, false. - public bool EverKept - { - get - { - return m_EverKept; - } - } - - /// - /// Gets or sets the state. - /// - /// The state. - public IfState State - { - get - { - return m_State; - } - set - { - m_State = value; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Parse/Preprocessor.cs b/Prebuild/src/Core/Parse/Preprocessor.cs deleted file mode 100644 index b2306e43db..0000000000 --- a/Prebuild/src/Core/Parse/Preprocessor.cs +++ /dev/null @@ -1,663 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.IO; -using System.Text.RegularExpressions; -using System.Xml; - -namespace Prebuild.Core.Parse -{ - /// - /// - /// - public enum OperatorSymbol - { - /// - /// - /// - None, - /// - /// - /// - Equal, - /// - /// - /// - NotEqual, - /// - /// - /// - LessThan, - /// - /// - /// - GreaterThan, - /// - /// - /// - LessThanEqual, - /// - /// - /// - GreaterThanEqual - } - - /// - /// - /// - public class Preprocessor - { - #region Constants - - /// - /// Includes the regex to look for file tags in the processing instruction. - /// - private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); - - #endregion - - #region Fields - - XmlDocument m_OutDoc; - Stack m_IfStack; - Hashtable m_Variables; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public Preprocessor() - { - m_OutDoc = new XmlDocument(); - m_IfStack = new Stack(); - m_Variables = new Hashtable(); - - RegisterVariable("OS", GetOS()); - RegisterVariable("RuntimeVersion", Environment.Version.Major); - RegisterVariable("RuntimeMajor", Environment.Version.Major); - RegisterVariable("RuntimeMinor", Environment.Version.Minor); - RegisterVariable("RuntimeRevision", Environment.Version.Revision); - } - - #endregion - - #region Properties - - /// - /// Gets the processed doc. - /// - /// The processed doc. - public XmlDocument ProcessedDoc - { - get - { - return m_OutDoc; - } - } - - #endregion - - #region Private Methods - - /// - /// Parts of this code were taken from NAnt and is subject to the GPL - /// as per NAnt's license. Thanks to the NAnt guys for this little gem. - /// - /// - public static string GetOS() - { - PlatformID platId = Environment.OSVersion.Platform; - if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) - { - return "Win32"; - } - - if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) - { - return "MACOSX"; - } - - /* - * .NET 1.x, under Mono, the UNIX code is 128. Under - * .NET 2.x, Mono or MS, the UNIX code is 4 - */ - if(Environment.Version.Major == 1) - { - if((int)platId == 128) - { - return "UNIX"; - } - } - else if((int)platId == 4) - { - return "UNIX"; - } - - return "Unknown"; - } - - private static bool CompareNum(OperatorSymbol oper, int val1, int val2) - { - switch(oper) - { - case OperatorSymbol.Equal: - return (val1 == val2); - case OperatorSymbol.NotEqual: - return (val1 != val2); - case OperatorSymbol.LessThan: - return (val1 < val2); - case OperatorSymbol.LessThanEqual: - return (val1 <= val2); - case OperatorSymbol.GreaterThan: - return (val1 > val2); - case OperatorSymbol.GreaterThanEqual: - return (val1 >= val2); - } - - throw new WarningException("Unknown operator type"); - } - - private static bool CompareStr(OperatorSymbol oper, string val1, string val2) - { - switch(oper) - { - case OperatorSymbol.Equal: - return (val1 == val2); - case OperatorSymbol.NotEqual: - return (val1 != val2); - case OperatorSymbol.LessThan: - return (val1.CompareTo(val2) < 0); - case OperatorSymbol.LessThanEqual: - return (val1.CompareTo(val2) <= 0); - case OperatorSymbol.GreaterThan: - return (val1.CompareTo(val2) > 0); - case OperatorSymbol.GreaterThanEqual: - return (val1.CompareTo(val2) >= 0); - } - - throw new WarningException("Unknown operator type"); - } - - private static char NextChar(int idx, string str) - { - if((idx + 1) >= str.Length) - { - return Char.MaxValue; - } - - return str[idx + 1]; - } - // Very very simple expression parser. Can only match expressions of the form - // : - // OS = Windows - // OS != Linux - // RuntimeMinor > 0 - private bool ParseExpression(string exp) - { - if(exp == null) - { - throw new ArgumentException("Invalid expression, cannot be null"); - } - - exp = exp.Trim(); - if(exp.Length < 1) - { - throw new ArgumentException("Invalid expression, cannot be 0 length"); - } - - string id = ""; - string str = ""; - OperatorSymbol oper = OperatorSymbol.None; - bool inStr = false; - char c; - - for(int i = 0; i < exp.Length; i++) - { - c = exp[i]; - if(Char.IsWhiteSpace(c)) - { - continue; - } - - if(Char.IsLetterOrDigit(c) || c == '_') - { - if(inStr) - { - str += c; - } - else - { - id += c; - } - } - else if(c == '\"') - { - inStr = !inStr; - if(inStr) - { - str = ""; - } - } - else - { - if(inStr) - { - str += c; - } - else - { - switch(c) - { - case '=': - oper = OperatorSymbol.Equal; - break; - - case '!': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.NotEqual; - } - - break; - - case '<': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.LessThanEqual; - } - else - { - oper = OperatorSymbol.LessThan; - } - - break; - - case '>': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.GreaterThanEqual; - } - else - { - oper = OperatorSymbol.GreaterThan; - } - - break; - } - } - } - } - - - if(inStr) - { - throw new WarningException("Expected end of string in expression"); - } - - if(oper == OperatorSymbol.None) - { - throw new WarningException("Expected operator in expression"); - } - else if(id.Length < 1) - { - throw new WarningException("Expected identifier in expression"); - } - else if(str.Length < 1) - { - throw new WarningException("Expected value in expression"); - } - - bool ret = false; - try - { - object val = m_Variables[id.ToLower()]; - if(val == null) - { - throw new WarningException("Unknown identifier '{0}'", id); - } - - int numVal, numVal2; - string strVal, strVal2; - Type t = val.GetType(); - if(t.IsAssignableFrom(typeof(int))) - { - numVal = (int)val; - numVal2 = Int32.Parse(str); - ret = CompareNum(oper, numVal, numVal2); - } - else - { - strVal = val.ToString(); - strVal2 = str; - ret = CompareStr(oper, strVal, strVal2); - } - } - catch(ArgumentException ex) - { - ex.ToString(); - throw new WarningException("Invalid value type for system variable '{0}', expected int", id); - } - - return ret; - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - /// - public void RegisterVariable(string name, object variableValue) - { - if(name == null || variableValue == null) - { - return; - } - - m_Variables[name.ToLower()] = variableValue; - } - - /// - /// Performs validation on the xml source as well as evaluates conditional and flow expresions - /// - /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml - /// - /// the output xml - public string Process(XmlReader initialReader) - { - if(initialReader == null) - { - throw new ArgumentException("Invalid XML reader to pre-process"); - } - - IfContext context = new IfContext(true, true, IfState.None); - StringWriter xmlText = new StringWriter(); - XmlTextWriter writer = new XmlTextWriter(xmlText); - writer.Formatting = Formatting.Indented; - - // Create a queue of XML readers and add the initial - // reader to it. Then we process until we run out of - // readers which lets the operation add more - // readers to generate a multi-file parser and not require - // XML fragments that a recursive version would use. - Stack readerStack = new Stack(); - readerStack.Push(initialReader); - - while(readerStack.Count > 0) - { - // Pop off the next reader. - XmlReader reader = (XmlReader) readerStack.Pop(); - - // Process through this XML reader until it is - // completed (or it is replaced by the include - // operation). - while(reader.Read()) - { - // The prebuild file has a series of processing - // instructions which allow for specific - // inclusions based on operating system or to - // include additional files. - if(reader.NodeType == XmlNodeType.ProcessingInstruction) - { - bool ignore = false; - - switch(reader.LocalName) - { - case "include": - // use regular expressions to parse out the attributes. - MatchCollection matches = includeFileRegex.Matches(reader.Value); - - // make sure there is only one file attribute. - if(matches.Count > 1) - { - throw new WarningException("An node was found, but it specified more than one file."); - } - - if(matches.Count == 0) - { - throw new WarningException("An node was found, but it did not specify the file attribute."); - } - - // Push current reader back onto the stack. - readerStack.Push(reader); - - // Pull the file out from the regex and make sure it is a valid file before using it. - string filename = matches[0].Groups[1].Value; - - filename = String.Join(Path.DirectorySeparatorChar.ToString(), filename.Split(new char[] { '/', '\\' })); - - if (!filename.Contains("*")) - { - FileInfo includeFile = new FileInfo(filename); - - if (!includeFile.Exists) - { - throw new WarningException("Cannot include file: " + includeFile.FullName); - } - - // Create a new reader object for this file, and push it onto the stack - XmlReader newReader = new XmlTextReader(includeFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)); - readerStack.Push(newReader); - } - else - { - WildCardInclude(readerStack, filename); - } - - // continue reading with whatever reader is on the top of the stack - reader = (XmlReader)readerStack.Pop(); - ignore = true; - - break; - - case "if": - m_IfStack.Push(context); - context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); - ignore = true; - break; - - case "elseif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - else if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - - context.State = IfState.ElseIf; - if(!context.EverKept) - { - context.Keep = ParseExpression(reader.Value); - } - else - { - context.Keep = false; - } - - ignore = true; - break; - - case "else": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - else if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - - context.State = IfState.Else; - context.Keep = !context.EverKept; - ignore = true; - break; - - case "endif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'endif' outside of 'if'"); - } - - context = (IfContext)m_IfStack.Pop(); - ignore = true; - break; - } - - if(ignore) - { - continue; - } - }//end pre-proc instruction - - if(!context.Active || !context.Keep) - { - continue; - } - - switch(reader.NodeType) - { - case XmlNodeType.Element: - bool empty = reader.IsEmptyElement; - writer.WriteStartElement(reader.Name); - - while (reader.MoveToNextAttribute()) - { - writer.WriteAttributeString(reader.Name, reader.Value); - } - - if(empty) - { - writer.WriteEndElement(); - } - - break; - - case XmlNodeType.EndElement: - writer.WriteEndElement(); - break; - - case XmlNodeType.Text: - writer.WriteString(reader.Value); - break; - - case XmlNodeType.CDATA: - writer.WriteCData(reader.Value); - break; - - default: - break; - } - } - - if(m_IfStack.Count != 0) - { - throw new WarningException("Mismatched 'if', 'endif' pair"); - } - } - - return xmlText.ToString(); - } - - private static void WildCardInclude(Stack readerStack, string include) - { - if (!include.Contains("*")) - { - return; - } - -// Console.WriteLine("Processing {0}", include); - - // Break up the include into pre and post wildcard sections - string preWildcard = include.Substring(0, include.IndexOf("*")); - string postWildcard = include.Substring(include.IndexOf("*") + 2); - - // If preWildcard is a directory, recurse - if (Directory.Exists(preWildcard)) - { - string[] directories = Directory.GetDirectories(preWildcard); - Array.Sort(directories); - Array.Reverse(directories); - foreach (string dirPath in directories ) - { - Console.WriteLine("Scanning : {0}", dirPath); - - string includeFile = Path.Combine(dirPath, postWildcard); - if (includeFile.Contains("*")) - { - // postWildcard included another wildcard, recurse. - WildCardInclude(readerStack, includeFile); - } - else - { - FileInfo file = new FileInfo(includeFile); - if (file.Exists) - { - Console.WriteLine("Including File: {0}", includeFile); - XmlReader newReader = new XmlTextReader(file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)); - readerStack.Push(newReader); - } - } - } - } - else - { - // preWildcard is not a path to a directory, so the wildcard is in the filename - string searchFilename = Path.GetFileName(preWildcard.Substring(preWildcard.IndexOf("/") + 1) + "*" + postWildcard); - // Console.WriteLine("searchFilename: {0}", searchFilename); - - string searchDirectory = Path.GetDirectoryName(preWildcard); - // Console.WriteLine("searchDirectory: {0}", searchDirectory); - - string[] files = Directory.GetFiles(searchDirectory, searchFilename); - Array.Sort(files); - Array.Reverse(files); - foreach (string includeFile in files) - { - FileInfo file = new FileInfo(includeFile); - if (file.Exists) - { - Console.WriteLine("Including File: {0}", includeFile); - XmlReader newReader = new XmlTextReader(file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)); - readerStack.Push(newReader); - } - } - } - - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs deleted file mode 100644 index 5dcbb38269..0000000000 --- a/Prebuild/src/Core/Targets/AutotoolsTarget.cs +++ /dev/null @@ -1,1782 +0,0 @@ -#region BSD License -/* - -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Dave Hudson (jendave@yahoo.com), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote -products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -#region MIT X11 license - -/* - Portions of this file authored by Lluis Sanchez Gual - - Copyright (C) 2006 Novell, Inc (http://www.novell.com) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#endregion -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Xsl; -using System.Net; -using System.Diagnostics; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Parse; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - public enum ClrVersion - { - Default, - Net_1_1, - Net_2_0 - } - - public class SystemPackage - { - string name; - string version; - string description; - string[] assemblies; - bool isInternal; - ClrVersion targetVersion; - - public void Initialize(string name, - string version, - string description, - string[] assemblies, - ClrVersion targetVersion, - bool isInternal) - { - this.isInternal = isInternal; - this.name = name; - this.version = version; - this.assemblies = assemblies; - this.description = description; - this.targetVersion = targetVersion; - } - - public string Name - { - get { return name; } - } - - public string Version - { - get { return version; } - } - - public string Description - { - get { return description; } - } - - public ClrVersion TargetVersion - { - get { return targetVersion; } - } - - // The package is part of the mono SDK - public bool IsCorePackage - { - get { return name == "mono"; } - } - - // The package has been registered by an add-in, and is not installed - // in the system. - public bool IsInternalPackage - { - get { return isInternal; } - } - - public string[] Assemblies - { - get { return assemblies; } - } - - } - - - /// - /// - /// - [Target("autotools")] - public class AutotoolsTarget : ITarget - { - #region Fields - - Kernel m_Kernel; - XmlDocument autotoolsDoc; - XmlUrlResolver xr; - System.Security.Policy.Evidence e; - Hashtable assemblyPathToPackage = new Hashtable(); - Hashtable assemblyFullNameToPath = new Hashtable(); - Hashtable packagesHash = new Hashtable(); - readonly List packages = new List(); - - #endregion - - #region Private Methods - - private void mkdirDashP(string dirName) - { - DirectoryInfo di = new DirectoryInfo(dirName); - if (di.Exists) - return; - - string parentDirName = System.IO.Path.GetDirectoryName(dirName); - DirectoryInfo parentDi = new DirectoryInfo(parentDirName); - if (!parentDi.Exists) - mkdirDashP(parentDirName); - - di.Create(); - } - - private void chkMkDir(string dirName) - { - System.IO.DirectoryInfo di = - new System.IO.DirectoryInfo(dirName); - - if (!di.Exists) - di.Create(); - } - - private void transformToFile(string filename, XsltArgumentList argList, string nodeName) - { - // Create an XslTransform for this file - XslTransform templateTransformer = - new XslTransform(); - - // Load up the template - XmlNode templateNode = - autotoolsDoc.SelectSingleNode(nodeName + "/*"); - templateTransformer.Load(templateNode.CreateNavigator(), xr, e); - - // Create a writer for the transformed template - XmlTextWriter templateWriter = - new XmlTextWriter(filename, null); - - // Perform transformation, writing the file - templateTransformer.Transform - (m_Kernel.CurrentDoc, argList, templateWriter, xr); - } - - string NormalizeAsmName(string name) - { - int i = name.IndexOf(", PublicKeyToken=null"); - if (i != -1) - return name.Substring(0, i).Trim(); - else - return name; - } - - private void AddAssembly(string assemblyfile, SystemPackage package) - { - if (!File.Exists(assemblyfile)) - return; - - try - { - System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); - assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; - assemblyPathToPackage[assemblyfile] = package; - } - catch - { - } - } - - private List GetAssembliesWithLibInfo(string line, string file) - { - List references = new List(); - List libdirs = new List(); - List retval = new List(); - foreach (string piece in line.Split(' ')) - { - if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) - { - references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); - } - else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) - { - libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); - } - } - - foreach (string refrnc in references) - { - foreach (string libdir in libdirs) - { - if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) - { - retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); - } - } - } - - return retval; - } - - private List GetAssembliesWithoutLibInfo(string line, string file) - { - List references = new List(); - foreach (string reference in line.Split(' ')) - { - if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) - { - string final_ref = reference.Substring(3).Trim(); - references.Add(ProcessPiece(final_ref, file)); - } - } - return references; - } - - private string ProcessPiece(string piece, string pcfile) - { - int start = piece.IndexOf("${"); - if (start == -1) - return piece; - - int end = piece.IndexOf("}"); - if (end == -1) - return piece; - - string variable = piece.Substring(start + 2, end - start - 2); - string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); - return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); - } - - private string GetVariableFromPkgConfig(string var, string pcfile) - { - ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); - psi.RedirectStandardOutput = true; - psi.UseShellExecute = false; - psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); - Process p = new Process(); - p.StartInfo = psi; - p.Start(); - string ret = p.StandardOutput.ReadToEnd().Trim(); - p.WaitForExit(); - if (String.IsNullOrEmpty(ret)) - return String.Empty; - return ret; - } - - private void ParsePCFile(string pcfile) - { - // Don't register the package twice - string pname = Path.GetFileNameWithoutExtension(pcfile); - if (packagesHash.Contains(pname)) - return; - - List fullassemblies = null; - string version = ""; - string desc = ""; - - SystemPackage package = new SystemPackage(); - - using (StreamReader reader = new StreamReader(pcfile)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - string lowerLine = line.ToLower(); - if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) - { - string choppedLine = line.Substring(5).Trim(); - if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) - { - fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); - } - else - { - fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); - } - } - else if (lowerLine.StartsWith("version:")) - { - // "version:".Length == 8 - version = line.Substring(8).Trim(); - } - else if (lowerLine.StartsWith("description:")) - { - // "description:".Length == 12 - desc = line.Substring(12).Trim(); - } - } - } - - if (fullassemblies == null) - return; - - foreach (string assembly in fullassemblies) - { - AddAssembly(assembly, package); - } - - package.Initialize(pname, - version, - desc, - fullassemblies.ToArray(), - ClrVersion.Default, - false); - packages.Add(package); - packagesHash[pname] = package; - } - - void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) - { - SystemPackage package = new SystemPackage(); - List list = new List(); - - string dir = Path.Combine(prefix, version); - if (!Directory.Exists(dir)) - { - return; - } - - foreach (string assembly in Directory.GetFiles(dir, "*.dll")) - { - AddAssembly(assembly, package); - list.Add(assembly); - } - - package.Initialize("mono", - version, - "The Mono runtime", - list.ToArray(), - ver, - false); - packages.Add(package); - } - - void RunInitialization() - { - string versionDir; - - if (Environment.Version.Major == 1) - { - versionDir = "1.0"; - } - else - { - versionDir = "2.0"; - } - - //Pull up assemblies from the installed mono system. - string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); - - if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) - prefix = Path.Combine(prefix, "mono"); - else - prefix = Path.GetDirectoryName(prefix); - - RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); - RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); - - string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); - string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); - - if (String.IsNullOrEmpty(libpath)) - { - string path_dirs = Environment.GetEnvironmentVariable("PATH"); - foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) - { - if (pathdir == null) - continue; - if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) - { - libpath = Path.Combine(pathdir, ".."); - libpath = Path.Combine(libpath, "lib"); - libpath = Path.Combine(libpath, "pkgconfig"); - break; - } - } - } - search_dirs += Path.PathSeparator + libpath; - if (!string.IsNullOrEmpty(search_dirs)) - { - List scanDirs = new List(); - foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) - { - if (!scanDirs.Contains(potentialDir)) - scanDirs.Add(potentialDir); - } - foreach (string pcdir in scanDirs) - { - if (pcdir == null) - continue; - - if (Directory.Exists(pcdir)) - { - foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) - { - ParsePCFile(pcfile); - } - } - } - } - } - - private void WriteCombine(SolutionNode solution) - { - #region "Create Solution directory if it doesn't exist" - string solutionDir = Path.Combine(solution.FullPath, - Path.Combine("autotools", - solution.Name)); - chkMkDir(solutionDir); - #endregion - - #region "Write Solution-level files" - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("solutionName", "", solution.Name); - // $solutionDir is $rootDir/$solutionName/ - transformToFile(Path.Combine(solutionDir, "configure.ac"), - argList, "/Autotools/SolutionConfigureAc"); - transformToFile(Path.Combine(solutionDir, "Makefile.am"), - argList, "/Autotools/SolutionMakefileAm"); - transformToFile(Path.Combine(solutionDir, "autogen.sh"), - argList, "/Autotools/SolutionAutogenSh"); - #endregion - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - m_Kernel.Log.Write(String.Format("Writing project: {0}", - project.Name)); - WriteProject(solution, project); - } - } - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if (match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, - ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = - (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = - Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + - "/$(BUILD_DIR)/$(CONFIG)/", - refr.Name, "dll"), - '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = ((refr.Path != null) ? - Helper.NormalizePath(refr.Path + "/" + - refr.Name + ".dll", - '/') : - fileRef - ); - ret += Path.Combine(project.Path, finalPath); - return ret; - } - - try - { - //Assembly assem = Assembly.Load(refr.Name); - //if (assem != null) - //{ - // int index = refr.Name.IndexOf(","); - // if ( index > 0) - // { - // ret += assem.Location; - // //Console.WriteLine("Location1: " + assem.Location); - // } - // else - // { - // ret += (refr.Name + ".dll"); - // //Console.WriteLine("Location2: " + assem.Location); - // } - //} - //else - //{ - int index = refr.Name.IndexOf(","); - if (index > 0) - { - ret += refr.Name.Substring(0, index) + ".dll"; - //Console.WriteLine("Location3: " + assem.Location); - } - else - { - ret += (refr.Name + ".dll"); - //Console.WriteLine("Location4: " + assem.Location); - } - //} - } - catch (System.NullReferenceException e) - { - e.ToString(); - int index = refr.Name.IndexOf(","); - if (index > 0) - { - ret += refr.Name.Substring(0, index) + ".dll"; - //Console.WriteLine("Location5: " + assem.Location); - } - else - { - ret += (refr.Name + ".dll"); - //Console.WriteLine("Location6: " + assem.Location); - } - } - } - return ret; - } - - private static string BuildReferencePath(SolutionNode solution, - ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = - (ProjectNode)solution.ProjectsTable[refr.Name]; - string finalPath = - Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + - "/${build.dir}/"), - '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = ((refr.Path != null) ? - Helper.NormalizePath(refr.Path, '/') : - fileRef - ); - ret += finalPath; - return ret; - } - - try - { - Assembly assem = Assembly.Load(refr.Name); - if (assem != null) - { - ret += ""; - } - else - { - ret += ""; - } - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += ""; - } - } - return ret; - } - - private static string FindFileReference(string refName, - ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = - Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - if (path == null) - { - return ""; - } - - StringBuilder tmpPath; - - if (Core.Parse.Preprocessor.GetOS() == "Win32") - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath.Replace("/", @"\\"); - } - else - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); - } - return tmpPath.ToString(); - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); - string projectDir = Path.Combine(solutionDir, project.Name); - string projectVersion = project.Version; - bool hasAssemblyConfig = false; - chkMkDir(projectDir); - - List - compiledFiles = new List(), - contentFiles = new List(), - embeddedFiles = new List(), - - binaryLibs = new List(), - pkgLibs = new List(), - systemLibs = new List(), - runtimeLibs = new List(), - - extraDistFiles = new List(), - localCopyTargets = new List(); - - // If there exists a .config file for this assembly, copy - // it to the project folder - - // TODO: Support copying .config.osx files - // TODO: support processing the .config file for native library deps - string projectAssemblyName = project.Name; - if (project.AssemblyName != null) - projectAssemblyName = project.AssemblyName; - - if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) - { - hasAssemblyConfig = true; - System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); - extraDistFiles.Add(project.AssemblyName + ".dll.config"); - } - - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != string.Empty) - { - // Copy snk file into the project's directory - // Use the snk from the project directory directly - string source = Path.Combine(project.FullPath, conf.Options.KeyFile); - string keyFile = conf.Options.KeyFile; - Regex re = new Regex(".*/"); - keyFile = re.Replace(keyFile, ""); - - string dest = Path.Combine(projectDir, keyFile); - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - } - } - - // Copy compiled, embedded and content files into the project's directory - foreach (string filename in project.Files) - { - string source = Path.Combine(project.FullPath, filename); - string dest = Path.Combine(projectDir, filename); - - if (filename.Contains("AssemblyInfo.cs")) - { - // If we've got an AssemblyInfo.cs, pull the version number from it - string[] sources = { source }; - string[] args = { "" }; - Microsoft.CSharp.CSharpCodeProvider cscp = - new Microsoft.CSharp.CSharpCodeProvider(); - - string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); - System.CodeDom.Compiler.CompilerParameters cparam = - new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); - - System.CodeDom.Compiler.CompilerResults cr = - cscp.CompileAssemblyFromFile(cparam, sources); - - foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) - Console.WriteLine("Error! '{0}'", error.ErrorText); - - try { - string projectFullName = cr.CompiledAssembly.FullName; - Regex verRegex = new Regex("Version=([\\d\\.]+)"); - Match verMatch = verRegex.Match(projectFullName); - if (verMatch.Success) - projectVersion = verMatch.Groups[1].Value; - }catch{ - Console.WriteLine("Couldn't compile AssemblyInfo.cs"); - } - - // Clean up the temp file - try - { - if (File.Exists(tempAssemblyFile)) - File.Delete(tempAssemblyFile); - } - catch - { - Console.WriteLine("Error! '{0}'", e.ToString()); - } - - } - - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - - switch (project.Files.GetBuildAction(filename)) - { - case BuildAction.Compile: - compiledFiles.Add(filename); - break; - case BuildAction.Content: - contentFiles.Add(filename); - extraDistFiles.Add(filename); - break; - case BuildAction.EmbeddedResource: - embeddedFiles.Add(filename); - break; - } - } - - // Set up references - for (int refNum = 0; refNum < project.References.Count; refNum++) - { - ReferenceNode refr = (ReferenceNode)project.References[refNum]; - Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); - - /* Determine which pkg-config (.pc) file refers to - this assembly */ - - SystemPackage package = null; - - if (packagesHash.Contains(refr.Name)){ - package = (SystemPackage)packagesHash[refr.Name]; - - }else{ - string assemblyFullName = string.Empty; - if (refAssembly != null) - assemblyFullName = refAssembly.FullName; - - string assemblyFileName = string.Empty; - if (assemblyFullName != string.Empty && - assemblyFullNameToPath.Contains(assemblyFullName) - ) - assemblyFileName = - (string)assemblyFullNameToPath[assemblyFullName]; - - if (assemblyFileName != string.Empty && - assemblyPathToPackage.Contains(assemblyFileName) - ) - package = (SystemPackage)assemblyPathToPackage[assemblyFileName]; - - } - - /* If we know the .pc file and it is not "mono" - (already in the path), add a -pkg: argument */ - - if (package != null && - package.Name != "mono" && - !pkgLibs.Contains(package.Name) - ) - pkgLibs.Add(package.Name); - - string fileRef = - FindFileReference(refr.Name, (ProjectNode)refr.Parent); - - if (refr.LocalCopy || - solution.ProjectsTable.ContainsKey(refr.Name) || - fileRef != null || - refr.Path != null - ) - { - - /* Attempt to copy the referenced lib to the - project's directory */ - - string filename = refr.Name + ".dll"; - string source = filename; - if (refr.Path != null) - source = Path.Combine(refr.Path, source); - source = Path.Combine(project.FullPath, source); - string dest = Path.Combine(projectDir, filename); - - /* Since we depend on this binary dll to build, we - * will add a compile- time dependency on the - * copied dll, and add the dll to the list of - * files distributed with this package - */ - - binaryLibs.Add(refr.Name + ".dll"); - extraDistFiles.Add(refr.Name + ".dll"); - - // TODO: Support copying .config.osx files - // TODO: Support for determining native dependencies - if (File.Exists(source + ".config")) - { - System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); - extraDistFiles.Add(refr.Name + ".dll.config"); - } - - try - { - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException) - { - if (solution.ProjectsTable.ContainsKey(refr.Name)){ - - /* If an assembly is referenced, marked for - * local copy, in the list of projects for - * this solution, but does not exist, put a - * target into the Makefile.am to build the - * assembly and copy it to this project's - * directory - */ - - ProjectNode sourcePrj = - ((ProjectNode)(solution.ProjectsTable[refr.Name])); - - string target = - String.Format("{0}:\n" + - "\t$(MAKE) -C ../{1}\n" + - "\tln ../{2}/$@ $@\n", - filename, - sourcePrj.Name, - sourcePrj.Name ); - - localCopyTargets.Add(target); - } - } - } - else if( !pkgLibs.Contains(refr.Name) ) - { - // Else, let's assume it's in the GAC or the lib path - string assemName = string.Empty; - int index = refr.Name.IndexOf(","); - - if (index > 0) - assemName = refr.Name.Substring(0, index); - else - assemName = refr.Name; - - m_Kernel.Log.Write(String.Format( - "Warning: Couldn't find an appropriate assembly " + - "for reference:\n'{0}'", refr.Name - )); - systemLibs.Add(assemName); - } - } - - const string lineSep = " \\\n\t"; - string compiledFilesString = string.Empty; - if (compiledFiles.Count > 0) - compiledFilesString = - lineSep + string.Join(lineSep, compiledFiles.ToArray()); - - string embeddedFilesString = ""; - if (embeddedFiles.Count > 0) - embeddedFilesString = - lineSep + string.Join(lineSep, embeddedFiles.ToArray()); - - string contentFilesString = ""; - if (contentFiles.Count > 0) - contentFilesString = - lineSep + string.Join(lineSep, contentFiles.ToArray()); - - string extraDistFilesString = ""; - if (extraDistFiles.Count > 0) - extraDistFilesString = - lineSep + string.Join(lineSep, extraDistFiles.ToArray()); - - string pkgLibsString = ""; - if (pkgLibs.Count > 0) - pkgLibsString = - lineSep + string.Join(lineSep, pkgLibs.ToArray()); - - string binaryLibsString = ""; - if (binaryLibs.Count > 0) - binaryLibsString = - lineSep + string.Join(lineSep, binaryLibs.ToArray()); - - string systemLibsString = ""; - if (systemLibs.Count > 0) - systemLibsString = - lineSep + string.Join(lineSep, systemLibs.ToArray()); - - string localCopyTargetsString = ""; - if (localCopyTargets.Count > 0) - localCopyTargetsString = - string.Join("\n", localCopyTargets.ToArray()); - - string monoPath = ""; - foreach (string runtimeLib in runtimeLibs) - { - monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; - } - - // Add the project name to the list of transformation - // parameters - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("projectName", "", project.Name); - argList.AddParam("solutionName", "", solution.Name); - argList.AddParam("assemblyName", "", projectAssemblyName); - argList.AddParam("compiledFiles", "", compiledFilesString); - argList.AddParam("embeddedFiles", "", embeddedFilesString); - argList.AddParam("contentFiles", "", contentFilesString); - argList.AddParam("extraDistFiles", "", extraDistFilesString); - argList.AddParam("pkgLibs", "", pkgLibsString); - argList.AddParam("binaryLibs", "", binaryLibsString); - argList.AddParam("systemLibs", "", systemLibsString); - argList.AddParam("monoPath", "", monoPath); - argList.AddParam("localCopyTargets", "", localCopyTargetsString); - argList.AddParam("projectVersion", "", projectVersion); - argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); - - // Transform the templates - transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); - transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); - transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); - - if (project.Type == Core.Nodes.ProjectType.Library) - transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); - if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) - transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); - } - - private void WriteProjectOld(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); - StreamWriter ss = new StreamWriter(projFile); - ss.NewLine = "\n"; - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using (ss) - { - ss.WriteLine(Helper.AssemblyFullName(project.AssemblyName, project.Type) + ":"); - ss.WriteLine("\tmkdir -p " + Helper.MakePathRelativeTo(solution.FullPath, project.Path) + "/$(BUILD_DIR)/$(CONFIG)/"); - foreach (string file in project.Files) - { - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.Write("\tresgen "); - ss.Write(Helper.NormalizePath(Path.Combine(project.Path, file.Substring(0, file.LastIndexOf('.')) + ".resx "), '/')); - if (project.Files.GetResourceName(file) != "") - { - ss.WriteLine(Helper.NormalizePath(Path.Combine(project.Path, project.RootNamespace + "." + project.Files.GetResourceName(file) + ".resources"), '/')); - } - else - { - ss.WriteLine(Helper.NormalizePath(Path.Combine(project.Path, project.RootNamespace + "." + file.Substring(0, file.LastIndexOf('.')) + ".resources"), '/')); - } - } - } - ss.WriteLine("\t$(CSC)\t/out:" + Helper.MakePathRelativeTo(solution.FullPath, project.Path) + "/$(BUILD_DIR)/$(CONFIG)/" + Helper.AssemblyFullName(project.AssemblyName, project.Type) + " \\"); - ss.WriteLine("\t\t/target:" + project.Type.ToString().ToLower() + " \\"); - if (project.References.Count > 0) - { - ss.Write("\t\t/reference:"); - bool firstref = true; - foreach (ReferenceNode refr in project.References) - { - if (firstref) - { - firstref = false; - } - else - { - ss.Write(","); - } - ss.Write("{0}", Helper.NormalizePath(Helper.MakePathRelativeTo(solution.FullPath, BuildReference(solution, refr)), '/')); - } - ss.WriteLine(" \\"); - } - //ss.WriteLine("\t\tProperties/AssemblyInfo.cs \\"); - - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.Write("\t\t/resource:"); - ss.WriteLine(Helper.NormalizePath(Path.Combine(project.Path, file), '/') + " \\"); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.Write("\t\t/resource:"); - if (project.Files.GetResourceName(file) != "") - { - ss.WriteLine(Helper.NormalizePath(Path.Combine(project.Path, project.RootNamespace + "." + project.Files.GetResourceName(file) + ".resources"), '/') + "," + project.RootNamespace + "." + project.Files.GetResourceName(file) + ".resources" + " \\"); - } - else - { - ss.WriteLine(Helper.NormalizePath(Path.Combine(project.Path, project.RootNamespace + "." + file.Substring(0, file.LastIndexOf('.')) + ".resources"), '/') + "," + project.RootNamespace + "." + file.Substring(0, file.LastIndexOf('.')) + ".resources" + " \\"); - } - } - break; - } - } - - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ss.WriteLine("\t\t/keyfile:" + Helper.NormalizePath(Path.Combine(project.Path, conf.Options.KeyFile), '/') + " \\"); - break; - } - } - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.AllowUnsafe) - { - ss.WriteLine("\t\t/unsafe \\"); - break; - } - } - if (project.AppIcon != "") - { - ss.WriteLine("\t\t/win32icon:" + Helper.NormalizePath(Path.Combine(project.Path, project.AppIcon), '/') + " \\"); - } - - foreach (ConfigurationNode conf in project.Configurations) - { - ss.WriteLine("\t\t/define:{0}", conf.Options.CompilerDefines.Replace(';', ',') + " \\"); - break; - } - - foreach (ConfigurationNode conf in project.Configurations) - { - if (GetXmlDocFile(project, conf) != "") - { - ss.WriteLine("\t\t/doc:" + Helper.MakePathRelativeTo(solution.FullPath, project.Path) + "/$(BUILD_DIR)/$(CONFIG)/" + project.Name + ".xml \\"); - break; - } - } - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine("\t\t\\"); - ss.Write("\t\t" + NormalizePath(Path.Combine(Helper.MakePathRelativeTo(solution.FullPath, project.Path), file))); - break; - default: - break; - } - } - ss.WriteLine(); - ss.WriteLine(); - - if (project.Type == ProjectType.Library) - { - ss.WriteLine("install-data-local:"); - ss.WriteLine(" echo \"$(GACUTIL) /i bin/Release/" + project.Name + ".dll /f $(GACUTIL_FLAGS)\"; \\"); - ss.WriteLine(" $(GACUTIL) /i bin/Release/" + project.Name + ".dll /f $(GACUTIL_FLAGS) || exit 1;"); - ss.WriteLine(); - ss.WriteLine("uninstall-local:"); - ss.WriteLine(" echo \"$(GACUTIL) /u " + project.Name + " $(GACUTIL_FLAGS)\"; \\"); - ss.WriteLine(" $(GACUTIL) /u " + project.Name + " $(GACUTIL_FLAGS) || exit 1;"); - ss.WriteLine(); - } - ss.WriteLine("CLEANFILES = $(BUILD_DIR)/$(CONFIG)/" + Helper.AssemblyFullName(project.AssemblyName, project.Type) + " $(BUILD_DIR)/$(CONFIG)/" + project.AssemblyName + ".mdb $(BUILD_DIR)/$(CONFIG)/" + project.AssemblyName + ".pdb " + project.AssemblyName + ".xml"); - ss.WriteLine("EXTRA_DIST = \\"); - ss.Write(" $(FILES)"); - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ss.Write(" \\"); - ss.WriteLine("\t" + conf.Options.KeyFile); - } - break; - } - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } - bool hasLibrary = false; - - private void WriteCombineOld(SolutionNode solution) - { - - /* TODO: These vars should be pulled from the prebuild.xml file */ - string releaseVersion = "2.0.0"; - string assemblyVersion = "2.1.0.0"; - string description = - "Tao Framework " + solution.Name + " Binding For .NET"; - - hasLibrary = false; - m_Kernel.Log.Write("Creating Autotools make files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating makefile: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); - StreamWriter ss = new StreamWriter(combFile); - ss.NewLine = "\n"; - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using (ss) - { - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - if (project.Type == ProjectType.Library) - { - hasLibrary = true; - break; - } - } - - if (hasLibrary) - { - ss.Write("pkgconfig_in_files = "); - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - if (project.Type == ProjectType.Library) - { - string combFilepc = Helper.MakeFilePath(solution.FullPath, project.Name, "pc.in"); - ss.Write(" " + project.Name + ".pc.in "); - StreamWriter sspc = new StreamWriter(combFilepc); - sspc.NewLine = "\n"; - using (sspc) - { - sspc.WriteLine("prefix=@prefix@"); - sspc.WriteLine("exec_prefix=${prefix}"); - sspc.WriteLine("libdir=${exec_prefix}/lib"); - sspc.WriteLine(); - sspc.WriteLine("Name: @PACKAGE_NAME@"); - sspc.WriteLine("Description: @DESCRIPTION@"); - sspc.WriteLine("Version: @ASSEMBLY_VERSION@"); - sspc.WriteLine("Libs: -r:${libdir}/mono/gac/@PACKAGE_NAME@/@ASSEMBLY_VERSION@__@PUBKEY@/@PACKAGE_NAME@.dll"); - } - } - } - - ss.WriteLine(); - ss.WriteLine("pkgconfigdir=$(prefix)/lib/pkgconfig"); - ss.WriteLine("pkgconfig_DATA=$(pkgconfig_in_files:.pc.in=.pc)"); - } - ss.WriteLine(); - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine("-include x {0}", - Helper.NormalizePath(Helper.MakeFilePath(path, "Include", "am"), '/')); - } - ss.WriteLine(); - ss.WriteLine("all: \\"); - ss.Write("\t"); - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(Helper.AssemblyFullName(project.AssemblyName, project.Type) + " "); - - } - ss.WriteLine(); - if (hasLibrary) - { - ss.WriteLine("EXTRA_DIST = \\"); - ss.WriteLine("\t$(pkgconfig_in_files)"); - } - else - { - ss.WriteLine("EXTRA_DIST = "); - } - ss.WriteLine(); - ss.WriteLine("DISTCLEANFILES = \\"); - ss.WriteLine("\tconfigure \\"); - ss.WriteLine("\tMakefile.in \\"); - ss.WriteLine("\taclocal.m4"); - } - combFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); - StreamWriter ts = new StreamWriter(combFile); - ts.NewLine = "\n"; - using (ts) - { - if (this.hasLibrary) - { - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - if (project.Type == ProjectType.Library) - { - ts.WriteLine("AC_INIT(" + project.Name + ".pc.in)"); - break; - } - } - } - else - { - ts.WriteLine("AC_INIT(Makefile.am)"); - } - ts.WriteLine("AC_PREREQ(2.53)"); - ts.WriteLine("AC_CANONICAL_SYSTEM"); - - ts.WriteLine("PACKAGE_NAME={0}", solution.Name); - ts.WriteLine("PACKAGE_VERSION={0}", releaseVersion); - ts.WriteLine("DESCRIPTION=\"{0}\"", description); - ts.WriteLine("AC_SUBST(DESCRIPTION)"); - ts.WriteLine("AM_INIT_AUTOMAKE([$PACKAGE_NAME],[$PACKAGE_VERSION],[$DESCRIPTION])"); - - ts.WriteLine("ASSEMBLY_VERSION={0}", assemblyVersion); - ts.WriteLine("AC_SUBST(ASSEMBLY_VERSION)"); - - ts.WriteLine("PUBKEY=`sn -t $PACKAGE_NAME.snk | grep 'Public Key Token' | awk -F: '{print $2}' | sed -e 's/^ //'`"); - ts.WriteLine("AC_SUBST(PUBKEY)"); - - ts.WriteLine(); - ts.WriteLine("AM_MAINTAINER_MODE"); - ts.WriteLine(); - ts.WriteLine("dnl AC_PROG_INTLTOOL([0.25])"); - ts.WriteLine(); - ts.WriteLine("AC_PROG_INSTALL"); - ts.WriteLine(); - ts.WriteLine("MONO_REQUIRED_VERSION=1.1"); - ts.WriteLine(); - ts.WriteLine("AC_MSG_CHECKING([whether we're compiling from CVS])"); - ts.WriteLine("if test -f \"$srcdir/.cvs_version\" ; then"); - ts.WriteLine(" from_cvs=yes"); - ts.WriteLine("else"); - ts.WriteLine(" if test -f \"$srcdir/.svn\" ; then"); - ts.WriteLine(" from_cvs=yes"); - ts.WriteLine(" else"); - ts.WriteLine(" from_cvs=no"); - ts.WriteLine(" fi"); - ts.WriteLine("fi"); - ts.WriteLine(); - ts.WriteLine("AC_MSG_RESULT($from_cvs)"); - ts.WriteLine(); - ts.WriteLine("AC_PATH_PROG(MONO, mono)"); - ts.WriteLine("AC_PATH_PROG(GMCS, gmcs)"); - ts.WriteLine("AC_PATH_PROG(GACUTIL, gacutil)"); - ts.WriteLine(); - ts.WriteLine("AC_MSG_CHECKING([for mono])"); - ts.WriteLine("dnl if test \"x$MONO\" = \"x\" ; then"); - ts.WriteLine("dnl AC_MSG_ERROR([Can't find \"mono\" in your PATH])"); - ts.WriteLine("dnl else"); - ts.WriteLine(" AC_MSG_RESULT([found])"); - ts.WriteLine("dnl fi"); - ts.WriteLine(); - ts.WriteLine("AC_MSG_CHECKING([for gmcs])"); - ts.WriteLine("dnl if test \"x$GMCS\" = \"x\" ; then"); - ts.WriteLine("dnl AC_MSG_ERROR([Can't find \"gmcs\" in your PATH])"); - ts.WriteLine("dnl else"); - ts.WriteLine(" AC_MSG_RESULT([found])"); - ts.WriteLine("dnl fi"); - ts.WriteLine(); - //ts.WriteLine("AC_MSG_CHECKING([for gacutil])"); - //ts.WriteLine("if test \"x$GACUTIL\" = \"x\" ; then"); - //ts.WriteLine(" AC_MSG_ERROR([Can't find \"gacutil\" in your PATH])"); - //ts.WriteLine("else"); - //ts.WriteLine(" AC_MSG_RESULT([found])"); - //ts.WriteLine("fi"); - ts.WriteLine(); - ts.WriteLine("AC_SUBST(PATH)"); - ts.WriteLine("AC_SUBST(LD_LIBRARY_PATH)"); - ts.WriteLine(); - ts.WriteLine("dnl CSFLAGS=\"-debug -nowarn:1574\""); - ts.WriteLine("CSFLAGS=\"\""); - ts.WriteLine("AC_SUBST(CSFLAGS)"); - ts.WriteLine(); - // ts.WriteLine("AC_MSG_CHECKING(--disable-sdl argument)"); - // ts.WriteLine("AC_ARG_ENABLE(sdl,"); - // ts.WriteLine(" [ --disable-sdl Disable Sdl interface.],"); - // ts.WriteLine(" [disable_sdl=$disableval],"); - // ts.WriteLine(" [disable_sdl=\"no\"])"); - // ts.WriteLine("AC_MSG_RESULT($disable_sdl)"); - // ts.WriteLine("if test \"$disable_sdl\" = \"yes\"; then"); - // ts.WriteLine(" AC_DEFINE(FEAT_SDL)"); - // ts.WriteLine("fi"); - ts.WriteLine(); - ts.WriteLine("dnl Find pkg-config"); - ts.WriteLine("AC_PATH_PROG(PKGCONFIG, pkg-config, no)"); - ts.WriteLine("if test \"x$PKG_CONFIG\" = \"xno\"; then"); - ts.WriteLine(" AC_MSG_ERROR([You need to install pkg-config])"); - ts.WriteLine("fi"); - ts.WriteLine(); - ts.WriteLine("PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false)"); - ts.WriteLine("BUILD_DIR=\"bin\""); - ts.WriteLine("AC_SUBST(BUILD_DIR)"); - ts.WriteLine("CONFIG=\"Release\""); - ts.WriteLine("AC_SUBST(CONFIG)"); - ts.WriteLine(); - ts.WriteLine("if test \"x$has_mono\" = \"xtrue\"; then"); - ts.WriteLine(" AC_PATH_PROG(RUNTIME, mono, no)"); - ts.WriteLine(" AC_PATH_PROG(CSC, gmcs, no)"); - ts.WriteLine(" if test `uname -s` = \"Darwin\"; then"); - ts.WriteLine(" LIB_PREFIX="); - ts.WriteLine(" LIB_SUFFIX=.dylib"); - ts.WriteLine(" else"); - ts.WriteLine(" LIB_PREFIX=.so"); - ts.WriteLine(" LIB_SUFFIX="); - ts.WriteLine(" fi"); - ts.WriteLine("else"); - ts.WriteLine(" AC_PATH_PROG(CSC, csc.exe, no)"); - ts.WriteLine(" if test x$CSC = \"xno\"; then"); - ts.WriteLine(" AC_MSG_ERROR([You need to install either mono or .Net])"); - ts.WriteLine(" else"); - ts.WriteLine(" RUNTIME="); - ts.WriteLine(" LIB_PREFIX="); - ts.WriteLine(" LIB_SUFFIX=.dylib"); - ts.WriteLine(" fi"); - ts.WriteLine("fi"); - ts.WriteLine(); - ts.WriteLine("AC_SUBST(LIB_PREFIX)"); - ts.WriteLine("AC_SUBST(LIB_SUFFIX)"); - ts.WriteLine(); - ts.WriteLine("AC_SUBST(BASE_DEPENDENCIES_CFLAGS)"); - ts.WriteLine("AC_SUBST(BASE_DEPENDENCIES_LIBS)"); - ts.WriteLine(); - ts.WriteLine("dnl Find monodoc"); - ts.WriteLine("MONODOC_REQUIRED_VERSION=1.0"); - ts.WriteLine("AC_SUBST(MONODOC_REQUIRED_VERSION)"); - ts.WriteLine("PKG_CHECK_MODULES(MONODOC_DEPENDENCY, monodoc >= $MONODOC_REQUIRED_VERSION, enable_monodoc=yes, enable_monodoc=no)"); - ts.WriteLine(); - ts.WriteLine("if test \"x$enable_monodoc\" = \"xyes\"; then"); - ts.WriteLine(" AC_PATH_PROG(MONODOC, monodoc, no)"); - ts.WriteLine(" if test x$MONODOC = xno; then"); - ts.WriteLine(" enable_monodoc=no"); - ts.WriteLine(" fi"); - ts.WriteLine("else"); - ts.WriteLine(" MONODOC="); - ts.WriteLine("fi"); - ts.WriteLine(); - ts.WriteLine("AC_SUBST(MONODOC)"); - ts.WriteLine("AM_CONDITIONAL(ENABLE_MONODOC, test \"x$enable_monodoc\" = \"xyes\")"); - ts.WriteLine(); - ts.WriteLine("AC_PATH_PROG(GACUTIL, gacutil, no)"); - ts.WriteLine("if test \"x$GACUTIL\" = \"xno\" ; then"); - ts.WriteLine(" AC_MSG_ERROR([No gacutil tool found])"); - ts.WriteLine("fi"); - ts.WriteLine(); - // foreach(ProjectNode project in solution.ProjectsTableOrder) - // { - // if (project.Type == ProjectType.Library) - // { - // } - // } - ts.WriteLine("GACUTIL_FLAGS='/package $(PACKAGE_NAME) /gacdir $(DESTDIR)$(prefix)'"); - ts.WriteLine("AC_SUBST(GACUTIL_FLAGS)"); - ts.WriteLine(); - ts.WriteLine("winbuild=no"); - ts.WriteLine("case \"$host\" in"); - ts.WriteLine(" *-*-mingw*|*-*-cygwin*)"); - ts.WriteLine(" winbuild=yes"); - ts.WriteLine(" ;;"); - ts.WriteLine("esac"); - ts.WriteLine("AM_CONDITIONAL(WINBUILD, test x$winbuild = xyes)"); - ts.WriteLine(); - // ts.WriteLine("dnl Check for SDL"); - // ts.WriteLine(); - // ts.WriteLine("AC_PATH_PROG([SDL_CONFIG], [sdl-config])"); - // ts.WriteLine("have_sdl=no"); - // ts.WriteLine("if test -n \"${SDL_CONFIG}\"; then"); - // ts.WriteLine(" have_sdl=yes"); - // ts.WriteLine(" SDL_CFLAGS=`$SDL_CONFIG --cflags`"); - // ts.WriteLine(" SDL_LIBS=`$SDL_CONFIG --libs`"); - // ts.WriteLine(" #"); - // ts.WriteLine(" # sdl-config sometimes emits an rpath flag pointing at its library"); - // ts.WriteLine(" # installation directory. We don't want this, as it prevents users from"); - // ts.WriteLine(" # linking sdl-viewer against, for example, a locally compiled libGL when a"); - // ts.WriteLine(" # version of the library also exists in SDL's library installation"); - // ts.WriteLine(" # directory, typically /usr/lib."); - // ts.WriteLine(" #"); - // ts.WriteLine(" SDL_LIBS=`echo $SDL_LIBS | sed 's/-Wl,-rpath,[[^ ]]* //'`"); - // ts.WriteLine("fi"); - // ts.WriteLine("AC_SUBST([SDL_CFLAGS])"); - // ts.WriteLine("AC_SUBST([SDL_LIBS])"); - ts.WriteLine(); - ts.WriteLine("AC_OUTPUT(["); - ts.WriteLine("Makefile"); - // TODO: this does not work quite right. - //ts.WriteLine("Properties/AssemblyInfo.cs"); - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - if (project.Type == ProjectType.Library) - { - ts.WriteLine(project.Name + ".pc"); - } - // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - // ts.WriteLine(Helper.NormalizePath(Helper.MakeFilePath(path, "Include"),'/')); - } - ts.WriteLine("])"); - ts.WriteLine(); - ts.WriteLine("#po/Makefile.in"); - ts.WriteLine(); - ts.WriteLine("echo \"---\""); - ts.WriteLine("echo \"Configuration summary\""); - ts.WriteLine("echo \"\""); - ts.WriteLine("echo \" * Installation prefix: $prefix\""); - ts.WriteLine("echo \" * compiler: $CSC\""); - ts.WriteLine("echo \" * Documentation: $enable_monodoc ($MONODOC)\""); - ts.WriteLine("echo \" * Package Name: $PACKAGE_NAME\""); - ts.WriteLine("echo \" * Version: $PACKAGE_VERSION\""); - ts.WriteLine("echo \" * Public Key: $PUBKEY\""); - ts.WriteLine("echo \"\""); - ts.WriteLine("echo \"---\""); - ts.WriteLine(); - } - - ts.NewLine = "\n"; - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - if (project.GenerateAssemblyInfoFile) - { - GenerateAssemblyInfoFile(solution, combFile); - } - } - } - - private static void GenerateAssemblyInfoFile(SolutionNode solution, string combFile) - { - System.IO.Directory.CreateDirectory(Helper.MakePathRelativeTo(solution.FullPath, "Properties")); - combFile = Helper.MakeFilePath(solution.FullPath + "/Properties/", "AssemblyInfo.cs", "in"); - StreamWriter ai = new StreamWriter(combFile); - - using (ai) - { - ai.WriteLine("#region License"); - ai.WriteLine("/*"); - ai.WriteLine("MIT License"); - ai.WriteLine("Copyright (c)2003-2006 Tao Framework Team"); - ai.WriteLine("http://www.taoframework.com"); - ai.WriteLine("All rights reserved."); - ai.WriteLine(""); - ai.WriteLine("Permission is hereby granted, free of charge, to any person obtaining a copy"); - ai.WriteLine("of this software and associated documentation files (the \"Software\"), to deal"); - ai.WriteLine("in the Software without restriction, including without limitation the rights"); - ai.WriteLine("to use, copy, modify, merge, publish, distribute, sublicense, and/or sell"); - ai.WriteLine("copies of the Software, and to permit persons to whom the Software is"); - ai.WriteLine("furnished to do so, subject to the following conditions:"); - ai.WriteLine(""); - ai.WriteLine("The above copyright notice and this permission notice shall be included in all"); - ai.WriteLine("copies or substantial portions of the Software."); - ai.WriteLine(""); - ai.WriteLine("THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR"); - ai.WriteLine("IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,"); - ai.WriteLine("FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE"); - ai.WriteLine("AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER"); - ai.WriteLine("LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,"); - ai.WriteLine("OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE"); - ai.WriteLine("SOFTWARE."); - ai.WriteLine("*/"); - ai.WriteLine("#endregion License"); - ai.WriteLine(""); - ai.WriteLine("using System;"); - ai.WriteLine("using System.Reflection;"); - ai.WriteLine("using System.Runtime.InteropServices;"); - ai.WriteLine("using System.Security;"); - ai.WriteLine("using System.Security.Permissions;"); - ai.WriteLine(""); - ai.WriteLine("[assembly: AllowPartiallyTrustedCallers]"); - ai.WriteLine("[assembly: AssemblyCompany(\"Tao Framework -- http://www.taoframework.com\")]"); - ai.WriteLine("[assembly: AssemblyConfiguration(\"Retail\")]"); - ai.WriteLine("[assembly: AssemblyCopyright(\"Copyright (c)2003-2006 Tao Framework Team. All rights reserved.\")]"); - ai.WriteLine("[assembly: AssemblyCulture(\"\")]"); - ai.WriteLine("[assembly: AssemblyDefaultAlias(\"@PACKAGE_NAME@\")]"); - ai.WriteLine("[assembly: AssemblyDelaySign(false)]"); - ai.WriteLine("[assembly: AssemblyDescription(\"@DESCRIPTION@\")]"); - ai.WriteLine("[assembly: AssemblyFileVersion(\"@ASSEMBLY_VERSION@\")]"); - ai.WriteLine("[assembly: AssemblyInformationalVersion(\"@ASSEMBLY_VERSION@\")]"); - ai.WriteLine("[assembly: AssemblyKeyName(\"\")]"); - ai.WriteLine("[assembly: AssemblyProduct(\"@PACKAGE_NAME@.dll\")]"); - ai.WriteLine("[assembly: AssemblyTitle(\"@DESCRIPTION@\")]"); - ai.WriteLine("[assembly: AssemblyTrademark(\"Tao Framework -- http://www.taoframework.com\")]"); - ai.WriteLine("[assembly: AssemblyVersion(\"@ASSEMBLY_VERSION@\")]"); - ai.WriteLine("[assembly: CLSCompliant(true)]"); - ai.WriteLine("[assembly: ComVisible(false)]"); - ai.WriteLine("[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.Execution)]"); - ai.WriteLine("[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.SkipVerification)]"); - ai.WriteLine("[assembly: SecurityPermission(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)]"); - - } - //return combFile; - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - m_Kernel.Log.Write("Parsing system pkg-config files"); - RunInitialization(); - - string streamName = "autotools.xml"; - string fqStreamName = String.Format("Prebuild.data.{0}", - streamName - ); - - // Retrieve stream for the autotools template XML - Stream autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(fqStreamName); - - if(autotoolsStream == null) { - - /* - * try without the default namespace prepended, in - * case prebuild.exe assembly was compiled with - * something other than Visual Studio .NET - */ - - autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(streamName); - if(autotoolsStream == null){ - string errStr = - String.Format("Could not find embedded resource file:\n" + - "'{0}' or '{1}'", - streamName, fqStreamName - ); - - m_Kernel.Log.Write(errStr); - - throw new System.Reflection.TargetException(errStr); - } - } - - // Create an XML URL Resolver with default credentials - xr = new System.Xml.XmlUrlResolver(); - xr.Credentials = CredentialCache.DefaultCredentials; - - // Create a default evidence - no need to limit access - e = new System.Security.Policy.Evidence(); - - // Load the autotools XML - autotoolsDoc = new XmlDocument(); - autotoolsDoc.Load(autotoolsStream); - - /* rootDir is the filesystem location where the Autotools - * build tree will be created - for now we'll make it - * $PWD/autotools - */ - - string pwd = Directory.GetCurrentDirectory(); - //string pwd = System.Environment.GetEnvironmentVariable("PWD"); - string rootDir = ""; - //if (pwd.Length != 0) - //{ - rootDir = Path.Combine(pwd, "autotools"); - //} - //else - //{ - // pwd = Assembly.GetExecutingAssembly() - //} - chkMkDir(rootDir); - - foreach (SolutionNode solution in kern.Solutions) - { - m_Kernel.Log.Write(String.Format("Writing solution: {0}", - solution.Name)); - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "autotools"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/DebugTarget.cs b/Prebuild/src/Core/Targets/DebugTarget.cs deleted file mode 100644 index dc4e666ebd..0000000000 --- a/Prebuild/src/Core/Targets/DebugTarget.cs +++ /dev/null @@ -1,102 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-09-20 09:42:51 +0200 (on, 20 sep 2006) $ - * $Revision: 164 $ - */ -#endregion - -using System; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; - -#if (DEBUG && _DEBUG_TARGET) -namespace Prebuild.Core.Targets -{ - [Target("debug")] - public class DebugTarget : ITarget - { -#region Fields - - private Kernel m_Kernel = null; - -#endregion - -#region ITarget Members - - public void Write() - { - foreach(SolutionNode s in m_Kernel.Solutions) - { - Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); - foreach(string file in s.Files) -{ - Console.WriteLine("\tFile [ {0} ]", file); -} - - foreach(ProjectNode proj in s.Projects) - { - Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); - foreach(string file in proj.Files) - Console.WriteLine("\t\tFile [ {0} ]", file); - } - } - } - - public void Clean() - { - Console.WriteLine("Not implemented"); - } - - public string Name - { - get - { - return "debug"; - } - } - - public Kernel Kernel - { - get - { - return m_Kernel; - } - set - { - m_Kernel = value; - } - } - -#endregion - } -} -#endif diff --git a/Prebuild/src/Core/Targets/MakefileTarget.cs b/Prebuild/src/Core/Targets/MakefileTarget.cs deleted file mode 100644 index 86676d08cb..0000000000 --- a/Prebuild/src/Core/Targets/MakefileTarget.cs +++ /dev/null @@ -1,471 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Crestez Leonard (cleonard@go.ro) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - [Target("makefile")] - public class MakefileTarget : ITarget - { - #region Fields - - private Kernel m_Kernel = null; - - #endregion - - #region Private Methods - - // This converts a path relative to the path of a project to - // a path relative to the solution path. - private string NicePath(ProjectNode proj, string path) - { - string res; - SolutionNode solution = (SolutionNode)proj.Parent; - res = Path.Combine(Helper.NormalizePath(proj.FullPath, '/'), Helper.NormalizePath(path, '/')); - res = Helper.NormalizePath(res, '/'); - res = res.Replace("/./", "/"); - while (res.IndexOf("/../") >= 0) - { - int a = res.IndexOf("/../"); - int b = res.LastIndexOf("/", a - 1); - res = res.Remove(b, a - b + 3); - } - res = Helper.MakePathRelativeTo(solution.FullPath, res); - if (res.StartsWith("./")) - res = res.Substring(2, res.Length - 2); - res = Helper.NormalizePath(res, '/'); - return res; - } - - private void WriteProjectFiles(StreamWriter f, SolutionNode solution, ProjectNode project) - { - // Write list of source code files - f.WriteLine("SOURCES_{0} = \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.Compile) - f.WriteLine("\t{0} \\", NicePath(project, file)); - f.WriteLine(); - - // Write list of resource files - f.WriteLine("RESOURCES_{0} = \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) - { - string path = NicePath(project, file); - f.WriteLine("\t-resource:{0},{1} \\", path, Path.GetFileName(path)); - } - f.WriteLine(); - - // There's also Content and None in BuildAction. - // What am I supposed to do with that? - } - - private string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = NicePath(project, Helper.MakeFilePath(refPath.Path, refName, "dll")); - if (File.Exists(fullPath)) - return fullPath; - } - return null; - } - - private void WriteProjectReferences(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("REFERENCES_{0} = \\", project.Name); - foreach (ReferenceNode refr in project.References) - { - string path; - // Project references change with configurations. - if (solution.ProjectsTable.Contains(refr.Name)) - continue; - path = FindFileReference(refr.Name, project); - if (path != null) - f.WriteLine("\t-r:{0} \\", path); - else - f.WriteLine("\t-r:{0} \\", refr.Name); - } - f.WriteLine(); - } - - private void WriteProjectDependencies(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("DEPENDENCIES_{0} = \\", project.Name); - f.WriteLine("\t$(SOURCES_{0}) \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) - f.WriteLine("\t{0} \\", NicePath(project, file)); - f.WriteLine(); - } - - private string ProjectTypeToExtension(ProjectType t) - { - if (t == ProjectType.Exe || t == ProjectType.WinExe) - { - return "exe"; - } - else if (t == ProjectType.Library) - { - return "dll"; - } - else - { - throw new FatalException("Bad ProjectType: {0}", t); - } - } - - private string ProjectTypeToTarget(ProjectType t) - { - if (t == ProjectType.Exe) - { - return "exe"; - } - else if (t == ProjectType.WinExe) - { - return "winexe"; - } - else if (t == ProjectType.Library) - { - return "library"; - } - else - { - throw new FatalException("Bad ProjectType: {0}", t); - } - } - - private string ProjectOutput(ProjectNode project, ConfigurationNode config) - { - string filepath; - filepath = Helper.MakeFilePath((string)config.Options["OutputPath"], - project.AssemblyName, ProjectTypeToExtension(project.Type)); - return NicePath(project, filepath); - } - - // Returns true if two configs in one project have the same output. - private bool ProjectClashes(ProjectNode project) - { - foreach (ConfigurationNode conf1 in project.Configurations) - foreach (ConfigurationNode conf2 in project.Configurations) - if (ProjectOutput(project, conf1) == ProjectOutput(project, conf2) && conf1 != conf2) - { - m_Kernel.Log.Write("Warning: Configurations {0} and {1} for project {2} output the same file", - conf1.Name, conf2.Name, project.Name); - m_Kernel.Log.Write("Warning: I'm going to use some timestamps(extra empty files)."); - return true; - } - return false; - } - - private void WriteProject(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("# This is for project {0}", project.Name); - f.WriteLine(); - - WriteProjectFiles(f, solution, project); - WriteProjectReferences(f, solution, project); - WriteProjectDependencies(f, solution, project); - - bool clash = ProjectClashes(project); - - foreach (ConfigurationNode conf in project.Configurations) - { - string outpath = ProjectOutput(project, conf); - string filesToClean = outpath; - - if (clash) - { - f.WriteLine("{0}-{1}: .{0}-{1}-timestamp", project.Name, conf.Name); - f.WriteLine(); - f.Write(".{0}-{1}-timestamp: $(DEPENDENCIES_{0})", project.Name, conf.Name); - } - else - { - f.WriteLine("{0}-{1}: {2}", project.Name, conf.Name, outpath); - f.WriteLine(); - f.Write("{2}: $(DEPENDENCIES_{0})", project.Name, conf.Name, outpath); - } - // Dependencies on other projects. - foreach (ReferenceNode refr in project.References) - if (solution.ProjectsTable.Contains(refr.Name)) - { - ProjectNode refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - if (ProjectClashes(refProj)) - f.Write(" .{0}-{1}-timestamp", refProj.Name, conf.Name); - else - f.Write(" {0}", ProjectOutput(refProj, conf)); - } - f.WriteLine(); - - // make directory for output. - if (Path.GetDirectoryName(outpath) != "") - { - f.WriteLine("\tmkdir -p {0}", Path.GetDirectoryName(outpath)); - } - // mcs command line. - f.Write("\tgmcs", project.Name); - f.Write(" -warn:{0}", conf.Options["WarningLevel"]); - if ((bool)conf.Options["DebugInformation"]) - f.Write(" -debug"); - if ((bool)conf.Options["AllowUnsafe"]) - f.Write(" -unsafe"); - if ((bool)conf.Options["CheckUnderflowOverflow"]) - f.Write(" -checked"); - if (project.StartupObject != "") - f.Write(" -main:{0}", project.StartupObject); - if ((string)conf.Options["CompilerDefines"] != "") - { - f.Write(" -define:\"{0}\"", conf.Options["CompilerDefines"]); - } - - f.Write(" -target:{0} -out:{1}", ProjectTypeToTarget(project.Type), outpath); - - // Build references to other projects. Now that sux. - // We have to reference the other project in the same conf. - foreach (ReferenceNode refr in project.References) - if (solution.ProjectsTable.Contains(refr.Name)) - { - ProjectNode refProj; - refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - f.Write(" -r:{0}", ProjectOutput(refProj, conf)); - } - - f.Write(" $(REFERENCES_{0})", project.Name); - f.Write(" $(RESOURCES_{0})", project.Name); - f.Write(" $(SOURCES_{0})", project.Name); - f.WriteLine(); - - // Copy references with localcopy. - foreach (ReferenceNode refr in project.References) - if (refr.LocalCopy) - { - string outPath, srcPath, destPath; - outPath = Helper.NormalizePath((string)conf.Options["OutputPath"]); - if (solution.ProjectsTable.Contains(refr.Name)) - { - ProjectNode refProj; - refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - srcPath = ProjectOutput(refProj, conf); - destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); - destPath = NicePath(project, destPath); - if (srcPath != destPath) - { - f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); - filesToClean += " " + destPath; - } - continue; - } - srcPath = FindFileReference(refr.Name, project); - if (srcPath != null) - { - destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); - destPath = NicePath(project, destPath); - f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); - filesToClean += " " + destPath; - } - } - - if (clash) - { - filesToClean += String.Format(" .{0}-{1}-timestamp", project.Name, conf.Name); - f.WriteLine("\ttouch .{0}-{1}-timestamp", project.Name, conf.Name); - f.Write("\trm -rf"); - foreach (ConfigurationNode otherConf in project.Configurations) - if (otherConf != conf) - f.WriteLine(" .{0}-{1}-timestamp", project.Name, otherConf.Name); - f.WriteLine(); - } - f.WriteLine(); - f.WriteLine("{0}-{1}-clean:", project.Name, conf.Name); - f.WriteLine("\trm -rf {0}", filesToClean); - f.WriteLine(); - } - } - - private void WriteIntro(StreamWriter f, SolutionNode solution) - { - f.WriteLine("# Makefile for {0} generated by Prebuild ( http://dnpb.sf.net )", solution.Name); - f.WriteLine("# Do not edit."); - f.WriteLine("#"); - - f.Write("# Configurations:"); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}", conf.Name); - f.WriteLine(); - - f.WriteLine("# Projects:"); - foreach (ProjectNode proj in solution.Projects) - f.WriteLine("#\t{0}", proj.Name); - - f.WriteLine("#"); - f.WriteLine("# Building:"); - f.WriteLine("#\t\"make\" to build everything under the default(first) configuration"); - f.WriteLine("#\t\"make CONF\" to build every project under configuration CONF"); - f.WriteLine("#\t\"make PROJ\" to build project PROJ under the default(first) configuration"); - f.WriteLine("#\t\"make PROJ-CONF\" to build project PROJ under configuration CONF"); - f.WriteLine("#"); - f.WriteLine("# Cleaning (removing results of build):"); - f.WriteLine("#\t\"make clean\" to clean everything, that's what you probably want"); - f.WriteLine("#\t\"make CONF\" to clean everything for a configuration"); - f.WriteLine("#\t\"make PROJ\" to clean everything for a project"); - f.WriteLine("#\t\"make PROJ-CONF\" to clea project PROJ under configuration CONF"); - f.WriteLine(); - } - - private void WritePhony(StreamWriter f, SolutionNode solution) - { - string defconf = ""; - foreach (ConfigurationNode conf in solution.Configurations) - { - defconf = conf.Name; - break; - } - - f.Write(".PHONY: all"); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0} {0}-clean", proj.Name); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0} {0}-clean", conf.Name); - foreach (ProjectNode proj in solution.Projects) - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}-{1} {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - - f.WriteLine("all: {0}", defconf); - f.WriteLine(); - - f.Write("clean:"); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}-clean", conf.Name); - f.WriteLine(); - f.WriteLine(); - - foreach (ConfigurationNode conf in solution.Configurations) - { - f.Write("{0}: ", conf.Name); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0}-{1}", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - - f.Write("{0}-clean: ", conf.Name); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - } - - foreach (ProjectNode proj in solution.Projects) - { - f.WriteLine("{0}: {0}-{1}", proj.Name, defconf); - f.WriteLine(); - - f.Write("{0}-clean:", proj.Name); - foreach (ConfigurationNode conf in proj.Configurations) - f.Write(" {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - } - } - - private void WriteSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Creating makefile for {0}", solution.Name); - m_Kernel.CurrentWorkingDirectory.Push(); - - string file = "Makefile";// Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); - StreamWriter f = new StreamWriter(file); - - Helper.SetCurrentDir(Path.GetDirectoryName(file)); - - using (f) - { - WriteIntro(f, solution); - WritePhony(f, solution); - - foreach (ProjectNode project in solution.Projects) - { - m_Kernel.Log.Write("...Creating Project: {0}", project.Name); - WriteProject(f, solution, project); - } - } - - m_Kernel.Log.Write(""); - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning makefile for {0}", solution.Name); - - string file = Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); - Helper.DeleteIfExists(file); - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - public void Write(Kernel kern) - { - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - WriteSolution(solution); - m_Kernel = null; - } - - public virtual void Clean(Kernel kern) - { - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - CleanSolution(sol); - m_Kernel = null; - } - - public string Name - { - get - { - return "makefile"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs deleted file mode 100644 index c8401fd42a..0000000000 --- a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs +++ /dev/null @@ -1,464 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("monodev")] - public class MonoDevelopTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if(refr.Path != null || fileRef != null) - { - ret += "Assembly\" refto=\""; - - string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; - - ret += finalPath; - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - return ret; - } - - ret += "Gac\""; - ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; - ret += " refto=\""; - try - { - /* - Day changed to 28 Mar 2007 - ... - 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? - 08:09 < jonp> no - 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the - ability to load any assembly version by-name was an inherently - bad idea - 08:11 < cj> I'm thinking of a bunch of four-letter words right now... - 08:11 < cj> security through making it difficult for the developer!!! - 08:12 < jonp> just use the Obsolete API - 08:12 < jonp> it should still work - 08:12 < cj> alrighty. - 08:12 < jonp> you just get warnings when using it - */ - Assembly assem = Assembly.LoadWithPartialName(refr.Name); - ret += assem.FullName; - //ret += refr.Name; - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name; - } - ret += "\" />"; - } - - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if(File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - { - return "False"; - } - return "True"; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string csComp = "Mcs"; - string netRuntime = "Mono"; - if(project.Runtime == ClrRuntime.Microsoft) - { - csComp = "Csc"; - netRuntime = "MsNet"; - } - - string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using(ss) - { - ss.WriteLine( - "", - project.Name, - project.RootNamespace - ); - - int count = 0; - - ss.WriteLine(" ", solution.ActiveConfig); - - foreach(ConfigurationNode conf in project.Configurations) - { - ss.WriteLine(" ", conf.Name); - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - - ss.Write(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(string file in project.Files) - { - string buildAction = "Compile"; - switch(project.Files.GetBuildAction(file)) - { - case BuildAction.None: - buildAction = "Nothing"; - break; - - case BuildAction.Content: - buildAction = "Exclude"; - break; - - case BuildAction.EmbeddedResource: - buildAction = "EmbedAsResource"; - break; - - default: - buildAction = "Compile"; - break; - } - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string filePath = PrependPath(file); - ss.WriteLine(" ", filePath, buildAction); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ss.WriteLine(" {0}", BuildReference(solution, refr)); - } - ss.WriteLine(" "); - - - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - int count = 0; - - using(ss) - { - ss.WriteLine("", solution.Name); - - count = 0; - foreach(ConfigurationNode conf in solution.Configurations) - { - if(count == 0) - { - ss.WriteLine(" ", conf.Name); - } - - ss.WriteLine(" ", conf.Name); - foreach(ProjectNode project in solution.Projects) - { - ss.WriteLine(" ", project.Name, conf.Name); - } - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - - count = 0; - - foreach(ProjectNode project in solution.Projects) - { - if(count == 0) - ss.WriteLine(" ", project.Name); - - ss.WriteLine(" ", project.Name); - count++; - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine(" ", - Helper.MakeFilePath(path, project.Name, "mdp")); - } - ss.WriteLine(" "); - - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); - Helper.DeleteIfExists(slnFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "sharpdev"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/NAntTarget.cs b/Prebuild/src/Core/Targets/NAntTarget.cs deleted file mode 100644 index 9a6ee17819..0000000000 --- a/Prebuild/src/Core/Targets/NAntTarget.cs +++ /dev/null @@ -1,738 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -*/ - -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("nant")] - public class NAntTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr) - { - - if (!String.IsNullOrEmpty(refr.Path)) - { - return refr.Path; - } - - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name]; - string finalPath = - Helper.NormalizePath(refr.Name + GetProjectExtension(projectRef), '/'); - return finalPath; - } - - ProjectNode project = (ProjectNode) refr.Parent; - - // Do we have an explicit file reference? - string fileRef = FindFileReference(refr.Name, project); - if (fileRef != null) - { - return fileRef; - } - - // Is there an explicit path in the project ref? - if (refr.Path != null) - { - return Helper.NormalizePath(refr.Path + "/" + refr.Name + GetProjectExtension(project), '/'); - } - - // No, it's an extensionless GAC ref, but nant needs the .dll extension anyway - return refr.Name + ".dll"; - } - - public static string GetRefFileName(string refName) - { - if (ExtensionSpecified(refName)) - { - return refName; - } - else - { - return refName + ".dll"; - } - } - - private static bool ExtensionSpecified(string refName) - { - return refName.EndsWith(".dll") || refName.EndsWith(".exe"); - } - - private static string GetProjectExtension(ProjectNode project) - { - string extension = ".dll"; - if (project.Type == ProjectType.Exe || project.Type == ProjectType.WinExe) - { - extension = ".exe"; - } - return extension; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName); - - if (File.Exists(fullPath)) - { - return fullPath; - } - - fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - - fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - if (project.ConfigFile != null && project.ConfigFile.Length!=0) - { - ss.Write(" "); - } - - // Add the content files to just be copied - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); - - foreach (string file in project.Files) - { - // Ignore if we aren't content - if (project.Files.GetBuildAction(file) != BuildAction.Content) - continue; - - // Create a include tag - ss.WriteLine(" {0}", ""); - } - - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); - - ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - ss.WriteLine(" "); - } - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - if (!String.IsNullOrEmpty(conf.Options.OutputPath)) - { - string targetDir = Helper.NormalizePath(conf.Options.OutputPath, '/'); - - ss.WriteLine(" "); - - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - break; - } - } - - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating NAnt build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); - - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - // actually use active config out of prebuild.xml - ss.WriteLine(" ", solution.ActiveConfig); - - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine(); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine(" "); - ss.WriteLine(); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - - // sdague - ok, this is an ugly hack, but what it lets - // us do is native include of files into the nant - // created files from all .nant/*include files. This - // lets us keep using prebuild, but allows for - // extended nant targets to do build and the like. - - try - { - Regex re = new Regex(".include$"); - DirectoryInfo nantdir = new DirectoryInfo(".nant"); - foreach (FileSystemInfo item in nantdir.GetFileSystemInfos()) - { - if (item is DirectoryInfo) { } - else if (item is FileInfo) - { - if (re.Match(((FileInfo)item).FullName) != - System.Text.RegularExpressions.Match.Empty) - { - Console.WriteLine("Including file: " + ((FileInfo)item).FullName); - - using (FileStream fs = new FileStream(((FileInfo)item).FullName, - FileMode.Open, - FileAccess.Read, - FileShare.None)) - { - using (StreamReader sr = new StreamReader(fs)) - { - ss.WriteLine("", ((FileInfo)item).FullName); - while (sr.Peek() != -1) - { - ss.WriteLine(sr.ReadLine()); - } - ss.WriteLine(); - } - } - } - } - } - } - catch { } - // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" ", solution.Name, solution.Version); - // ss.WriteLine(" "); - - // ss.WriteLine(" "); - // // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" "); - ss.WriteLine(); - - - ss.WriteLine(" "); - ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning NAnt build files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "nant"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs deleted file mode 100644 index 66dd1bc6f6..0000000000 --- a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs +++ /dev/null @@ -1,82 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -using Prebuild.Core.Attributes; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("sharpdev2")] - public class SharpDevelop2Target : VS2005Target - { - #region Properties - public override string VersionName - { - get - { - return "SharpDevelop2"; - } - } - #endregion - - #region Public Methods - - /// - /// Writes the specified kern. - /// - /// The kern. - public override void Write(Kernel kern) - { - base.Write(kern); - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public override void Clean(Kernel kern) - { - base.Clean(kern); - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return "sharpdev2"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs deleted file mode 100644 index cf7ce0260b..0000000000 --- a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs +++ /dev/null @@ -1,428 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text.RegularExpressions; -using System.Reflection; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("sharpdev")] - public class SharpDevelopTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if(refr.Path != null || fileRef != null) - { - ret += "Assembly\" refto=\""; - - string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; - - ret += finalPath; - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - return ret; - } - - ret += "Gac\" refto=\""; - try - { - //Assembly assem = Assembly.Load(refr.Name); - ret += refr.Name;// assem.FullName; - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name; - } - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - } - - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if(File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - { - return "False"; - } - return "True"; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string csComp = "Csc"; - string netRuntime = "MsNet"; - if(project.Runtime == ClrRuntime.Mono) - { - csComp = "Mcs"; - netRuntime = "Mono"; - } - - string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using(ss) - { - ss.WriteLine( - "", - project.Name, - project.RootNamespace - ); - - ss.WriteLine(" "); - foreach(string file in project.Files) - { - string buildAction = "Compile"; - switch(project.Files.GetBuildAction(file)) - { - case BuildAction.None: - buildAction = "Nothing"; - break; - - case BuildAction.Content: - buildAction = "Exclude"; - break; - - case BuildAction.EmbeddedResource: - buildAction = "EmbedAsResource"; - break; - - default: - buildAction = "Compile"; - break; - } - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string filePath = PrependPath(file); - ss.WriteLine(" ", filePath, buildAction); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ss.WriteLine(" {0}", BuildReference(solution, refr)); - } - ss.WriteLine(" "); - - ss.Write(" "); - - int count = 0; - - ss.WriteLine(" ", solution.ActiveConfig); - - foreach(ConfigurationNode conf in project.Configurations) - { - ss.Write(" "); - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using(ss) - { - ss.WriteLine("", solution.Name); - - int count = 0; - foreach(ProjectNode project in solution.Projects) - { - if(count == 0) - ss.WriteLine(" ", project.Name); - - ss.WriteLine(" ", project.Name); - count++; - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine(" ", - Helper.MakeFilePath(path, project.Name, "prjx")); - } - ss.WriteLine(" "); - - count = 0; - foreach(ConfigurationNode conf in solution.Configurations) - { - if(count == 0) - { - ss.WriteLine(" ", conf.Name); - } - - ss.WriteLine(" ", conf.Name); - foreach(ProjectNode project in solution.Projects) - { - ss.WriteLine(" ", project.Name, conf.Name); - } - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); - Helper.DeleteIfExists(slnFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "sharpdev"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/ToolInfo.cs b/Prebuild/src/Core/Targets/ToolInfo.cs deleted file mode 100644 index 935c6744db..0000000000 --- a/Prebuild/src/Core/Targets/ToolInfo.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - public struct ToolInfo - { - string name; - string guid; - string fileExtension; - string xmlTag; - string importProject; - - /// - /// Gets or sets the name. - /// - /// The name. - public string Name - { - get - { - return name; - } - set - { - name = value; - } - } - - /// - /// Gets or sets the GUID. - /// - /// The GUID. - public string Guid - { - get - { - return guid; - } - set - { - guid = value; - } - } - - /// - /// Gets or sets the file extension. - /// - /// The file extension. - public string FileExtension - { - get - { - return fileExtension; - } - set - { - fileExtension = value; - } - } - public string LanguageExtension - { - get - { - switch (this.Name) - { - case "C#": - return ".cs"; - case "VisualBasic": - return ".vb"; - case "Boo": - return ".boo"; - default: - return ".cs"; - } - } - } - /// - /// Gets or sets the XML tag. - /// - /// The XML tag. - public string XmlTag - { - get - { - return xmlTag; - } - set - { - xmlTag = value; - } - } - - /// - /// Gets or sets the import project property. - /// - /// The ImportProject tag. - public string ImportProject - { - get - { - return importProject; - } - set - { - importProject = value; - } - } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The GUID. - /// The file extension. - /// The XML. - /// The import project. - public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) - { - this.name = name; - this.guid = guid; - this.fileExtension = fileExtension; - this.xmlTag = xml; - this.importProject = importProject; - } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The GUID. - /// The file extension. - /// The XML. - public ToolInfo(string name, string guid, string fileExtension, string xml) - { - this.name = name; - this.guid = guid; - this.fileExtension = fileExtension; - this.xmlTag = xml; - this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; - } - - /// - /// Equals operator - /// - /// ToolInfo to compare - /// true if toolInfos are equal - public override bool Equals(object obj) - { - if (obj == null) - { - throw new ArgumentNullException("obj"); - } - if (obj.GetType() != typeof(ToolInfo)) - return false; - - ToolInfo c = (ToolInfo)obj; - return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); - } - - /// - /// Equals operator - /// - /// ToolInfo to compare - /// ToolInfo to compare - /// True if toolInfos are equal - public static bool operator ==(ToolInfo c1, ToolInfo c2) - { - return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); - } - - /// - /// Not equals operator - /// - /// ToolInfo to compare - /// ToolInfo to compare - /// True if toolInfos are not equal - public static bool operator !=(ToolInfo c1, ToolInfo c2) - { - return !(c1 == c2); - } - - /// - /// Hash Code - /// - /// Hash code - public override int GetHashCode() - { - return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); - - } - } -} diff --git a/Prebuild/src/Core/Targets/VS2002Target.cs b/Prebuild/src/Core/Targets/VS2002Target.cs deleted file mode 100644 index 2292624473..0000000000 --- a/Prebuild/src/Core/Targets/VS2002Target.cs +++ /dev/null @@ -1,87 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -using Prebuild.Core.Attributes; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("vs2002")] - public class VS2002Target : VS2003Target - { - #region Private Methods - - private void SetVS2002() - { - this.SolutionVersion = "7.00"; - this.ProductVersion = "7.0.9254"; - this.SchemaVersion = "1.0"; - this.VersionName = "2002"; - this.Version = VSVersion.VS70; - } - - #endregion - - #region Public Methods - - /// - /// Writes the specified kern. - /// - /// The kern. - public override void Write(Kernel kern) - { - SetVS2002(); - base.Write(kern); - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public override void Clean(Kernel kern) - { - SetVS2002(); - base.Clean(kern); - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return "vs2002"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/VS2003Target.cs b/Prebuild/src/Core/Targets/VS2003Target.cs deleted file mode 100644 index 1bcb7dce0d..0000000000 --- a/Prebuild/src/Core/Targets/VS2003Target.cs +++ /dev/null @@ -1,602 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - [Target("vs2003")] - public class VS2003Target : ITarget - { - - #region Fields - - string solutionVersion = "8.00"; - string productVersion = "7.10.3077"; - string schemaVersion = "2.0"; - string versionName = "2003"; - VSVersion version = VSVersion.VS71; - - Hashtable m_Tools; - Kernel m_Kernel; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - protected string SolutionVersion - { - get - { - return this.solutionVersion; - } - set - { - this.solutionVersion = value; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - protected string ProductVersion - { - get - { - return this.productVersion; - } - set - { - this.productVersion = value; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - protected string SchemaVersion - { - get - { - return this.schemaVersion; - } - set - { - this.schemaVersion = value; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - protected string VersionName - { - get - { - return this.versionName; - } - set - { - this.versionName = value; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - protected VSVersion Version - { - get - { - return this.version; - } - set - { - this.version = value; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2003Target() - { - m_Tools = new Hashtable(); - - m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); - m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach(ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if(ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch(ArgumentException) - { - m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if(!m_Tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - IEnumerator enumerator; - //ConfigurationNode scripts; - - using(ps) - { - ps.WriteLine(""); - ps.WriteLine(" <{0}", toolInfo.XmlTag); - ps.WriteLine("\t\t\t\tProjectType = \"Local\""); - ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", this.ProductVersion); - ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", this.SchemaVersion); - ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); - ps.WriteLine("\t\t>"); - - ps.WriteLine("\t\t\t\t"); - ps.WriteLine(" "); - - foreach(ConfigurationNode conf in project.Configurations) - { - ps.WriteLine("\t\t\t\t "); - } - - ps.WriteLine(" "); - - ps.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach(string file in project.Files) - { - string fileName = file.Replace(".\\", ""); - ps.WriteLine(" "); - - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ps.WriteLine(" "); - - } - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" ", toolInfo.XmlTag); - ps.WriteLine(""); - } - - ps = new StreamWriter(projectFile + ".user"); - using(ps) - { - ps.WriteLine(""); - ps.WriteLine(" <{0}>", toolInfo.XmlTag); - ps.WriteLine(" "); - - ps.WriteLine(" ", MakeRefPath(project)); - foreach(ConfigurationNode conf in project.Configurations) - { - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" ", toolInfo.XmlTag); - ps.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false - // { - // return string.Empty; - // } - - //default to "AssemblyName.xml" - //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - //return (string)conf.Options["XmlDocFile", defaultValue]; - - //default to no XmlDocFile file - return (string)conf.Options["XmlDocFile", ""]; - } - - private void WriteSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", this.VersionName); - - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - StreamWriter ss = new StreamWriter(solutionFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - using(ss) - { - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); - foreach(ProjectNode project in solution.Projects) - { - if(!m_Tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", - toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, - toolInfo.FileExtension), project.Guid.ToString().ToUpper()); - - ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); - ss.WriteLine("\tEndProjectSection"); - - ss.WriteLine("EndProject"); - } - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); - foreach(ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.Name); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); - foreach(ProjectNode project in solution.Projects) - { - for(int i = 0; i < project.References.Count; i++) - { - ReferenceNode refr = (ReferenceNode)project.References[i]; - if(solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProject = (ProjectNode)solution.ProjectsTable[refr.Name]; - ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", - project.Guid.ToString().ToUpper() - , i, - refProject.Guid.ToString().ToUpper() - ); - } - } - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); - foreach(ProjectNode project in solution.Projects) - { - foreach(ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", - project.Guid.ToString().ToUpper(), - conf.Name); - - ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", - project.Guid.ToString().ToUpper(), - conf.Name); - } - } - ss.WriteLine("\tEndGlobalSection"); - - if(solution.Files != null) - { - ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); - foreach(string file in solution.Files) - { - ss.WriteLine("\t\t{0} = {0}", file); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); - ss.WriteLine("\tEndGlobalSection"); - ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("EndGlobal"); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", this.VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in m_Kernel.Solutions) - { - WriteSolution(sol); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in m_Kernel.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public virtual string Name - { - get - { - return "vs2003"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/VS2005Target.cs b/Prebuild/src/Core/Targets/VS2005Target.cs deleted file mode 100644 index 63461c9fe5..0000000000 --- a/Prebuild/src/Core/Targets/VS2005Target.cs +++ /dev/null @@ -1,149 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("vs2005")] - public class VS2005Target : VSGenericTarget - { - #region Inner Classes - - #endregion - - #region Fields - - string solutionVersion = "9.00"; - string productVersion = "8.0.50727"; - string schemaVersion = "2.0"; - string versionName = "Visual C# 2005"; - string name = "vs2005"; - - VSVersion version = VSVersion.VS80; - - public override string SolutionTag - { - get { return "# Visual Studio 2005"; } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - return string.Empty; - } - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2005Target() - : base() - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/VS2008Target.cs b/Prebuild/src/Core/Targets/VS2008Target.cs deleted file mode 100644 index e685962b5a..0000000000 --- a/Prebuild/src/Core/Targets/VS2008Target.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - [Target("vs2008")] - public class VS2008Target : VSGenericTarget - { - #region Fields - string solutionVersion = "10.00"; - string productVersion = "9.0.21022"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2008"; - string name = "vs2008"; - VSVersion version = VSVersion.VS90; - - Hashtable tools; - Kernel kernel; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v3_5: - return "ToolsVersion=\"3.5\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2008"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2008Target() - : base() - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs deleted file mode 100644 index 8772d18595..0000000000 --- a/Prebuild/src/Core/Targets/VS2010Target.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - [Target("vs2010")] - public class VS2010Target : VSGenericTarget - { - #region Fields - string solutionVersion = "11.00"; - string productVersion = "9.0.21022"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2010"; - string name = "vs2008"; - VSVersion version = VSVersion.VS10; - - Hashtable tools; - Kernel kernel; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v4_0: - return "ToolsVersion=\"4.0\""; - case FrameworkVersion.v3_5: - return "ToolsVersion=\"3.5\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2010"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2010Target() - : base() - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs deleted file mode 100644 index fdcc2b909a..0000000000 --- a/Prebuild/src/Core/Targets/VSGenericTarget.cs +++ /dev/null @@ -1,887 +0,0 @@ -#region BSD License -/* -Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - public abstract class VSGenericTarget : ITarget - { - #region Fields - - readonly Hashtable tools = new Hashtable(); - Kernel kernel; - #endregion - - #region Properties - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public abstract string SolutionVersion { get; } - /// - /// Gets or sets the product version. - /// - /// The product version. - public abstract string ProductVersion { get; } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public abstract string SchemaVersion { get; } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public abstract string VersionName { get; } - /// - /// Gets or sets the version. - /// - /// The version. - public abstract VSVersion Version { get; } - /// - /// Gets the name. - /// - /// The name. - public abstract string Name { get; } - - protected abstract string GetToolsVersionXml(FrameworkVersion version); - public abstract string SolutionTag { get; } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - protected VSGenericTarget() - { - this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); - this.tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); - this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); - this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); - this.tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach (ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if (ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch (ArgumentException) - { - this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) - { - SolutionNode node = solution; - - while (node.Parent is SolutionNode) - node = node.Parent as SolutionNode; - - return FindProjectInSolutionRecursively(name, node); - } - - private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) - { - if (solution.ProjectsTable.ContainsKey(name)) - return (ProjectNode)solution.ProjectsTable[name]; - - foreach (SolutionNode child in solution.Solutions) - { - ProjectNode node = FindProjectInSolutionRecursively(name, child); - if (node != null) - return node; - } - - return null; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if (!tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - #region Project File - using (ps) - { - ps.WriteLine("", this.Version == VSVersion.VS10 ? "4.0" : "3.5"); - ps.WriteLine(" "); - ps.WriteLine(" Local"); - ps.WriteLine(" {0}", this.ProductVersion); - ps.WriteLine(" {0}", this.SchemaVersion); - ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); - - // Visual Studio has a hard coded guid for the project type - if (project.Type == ProjectType.Web) - ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); - ps.WriteLine(" Debug"); - ps.WriteLine(" AnyCPU"); - ps.WriteLine(" {0}", project.AppIcon); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", project.AssemblyName); - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ps.WriteLine(" {0}", conf.Options.KeyFile); - ps.WriteLine(" true"); - break; - } - } - ps.WriteLine(" JScript"); - ps.WriteLine(" Grid"); - ps.WriteLine(" IE50"); - ps.WriteLine(" false"); - ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); - - ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); - ps.WriteLine(" {0}", project.DesignerFolder); - ps.WriteLine(" {0}", project.RootNamespace); - ps.WriteLine(" {0}", project.StartupObject); - if (string.IsNullOrEmpty(project.DebugStartParameters)) - { - ps.WriteLine(" {0}", project.DebugStartParameters); - } - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" ", conf.Name); - ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); - ps.WriteLine(" {0}", conf.Options["BaseAddress"]); - ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); - ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); - ps.WriteLine(" {0}", conf.Options["DebugInformation"]); - ps.WriteLine(" {0}", conf.Options["FileAlignment"]); - ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); - if (project.Type != ProjectType.Web) - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); - else - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath("bin\\"))); - - ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); - ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); - ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); - ps.WriteLine(" {0}", conf.Options["WarningLevel"]); - ps.WriteLine(" {0}", conf.Options["NoStdLib"]); - ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); - ps.WriteLine(" "); - } - - //ps.WriteLine(" "); - - List projectReferences = new List(); - List otherReferences = new List(); - - foreach (ReferenceNode refr in project.References) - { - ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); - - if (projectNode == null) - otherReferences.Add(refr); - else - projectReferences.Add(projectNode); - } - // Assembly References - ps.WriteLine(" "); - - foreach (ReferenceNode refr in otherReferences) - { - ps.Write(" "); - ps.Write(" "); - ps.Write(refr.Name); - ps.WriteLine(""); - // TODO: Allow reference to *.exe files - ps.WriteLine(" {0}", refr.LocalCopy); - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - //Project References - ps.WriteLine(" "); - foreach (ProjectNode projectReference in projectReferences) - { - ToolInfo tool = (ToolInfo)tools[projectReference.Language]; - if (tools == null) - throw new UnknownLanguageException(); - - string path = - Helper.MakePathRelativeTo(project.FullPath, - Helper.MakeFilePath(projectReference.FullPath, projectReference.Name, tool.FileExtension)); - ps.WriteLine(" ", path); - - // TODO: Allow reference to visual basic projects - ps.WriteLine(" {0}", projectReference.Name); - ps.WriteLine(" {0}", projectReference.Guid.ToString("B").ToUpper()); - ps.WriteLine(" {0}", tool.Guid.ToUpper()); - - ps.WriteLine(" False" ); - - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ps.WriteLine(" "); - - // ps.WriteLine(" "); - List list = new List(); - - foreach (string path in project.Files) - { - string lower = path.ToLower(); - if (lower.EndsWith(".resx")) - { - string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); - if (!list.Contains(codebehind)) - list.Add(codebehind); - } - } - - foreach (string file in project.Files) - { - // if (file == "Properties\\Bind.Designer.cs") - // { - // Console.WriteLine("Wait a minute!"); - // Console.WriteLine(project.Files.GetSubType(file).ToString()); - // } - - SubType subType = project.Files.GetSubType(file); - - if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer - && subType != SubType.CodeBehind) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ps.WriteLine(" {0}", Path.GetFileName(file)); - ps.WriteLine(" Designer"); - ps.WriteLine(" "); - // - } - - if (subType == SubType.Designer) - { - ps.WriteLine(" ", file); - ps.WriteLine(" " + subType + ""); - ps.WriteLine(" ResXFileCodeGenerator"); - - string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; - string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs"; - - ps.WriteLine(" {0}", autogen_name); - - // Check for a parent .cs file with the same name as this designer file - if (File.Exists(dependent_name)) - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - - ps.WriteLine(" "); - if (File.Exists(autogen_name)) - { - ps.WriteLine(" ", autogen_name); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - - // If a parent .cs file exists, link this autogen file to it. Otherwise link - // to the designer file - if (File.Exists(dependent_name)) - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - else - ps.WriteLine(" {0}", Path.GetFileName(file)); - - ps.WriteLine(" "); - } - list.Add(autogen_name); - } - if (subType == SubType.Settings) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(file)); - ps.WriteLine("Include=\"{0}\">", file); - string fileName = Path.GetFileName(file); - if (project.Files.GetBuildAction(file) == BuildAction.None) - { - ps.WriteLine(" SettingsSingleFileGenerator"); - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - else - { - ps.WriteLine(" Code"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); - string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); - ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); - } - ps.WriteLine(" ", project.Files.GetBuildAction(file)); - } - else if (subType != SubType.Designer) - { - string path = Helper.NormalizePath(file); - string path_lower = path.ToLower(); - - if (!list.Contains(file)) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(path)); - - int startPos = 0; - if (project.Files.GetPreservePath(file)) - { - while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) - startPos++; - - } - else - { - startPos = file.LastIndexOf(Path.GetFileName(path)); - } - - ps.WriteLine("Include=\"{0}\">", path); - - int last_period_index = file.LastIndexOf('.'); - string short_file_name = file.Substring(0, last_period_index); - string extension = Path.GetExtension(path); - string designer_format = string.Format(".designer{0}", extension); - - if (path_lower.EndsWith(designer_format)) - { - int designer_index = path_lower.IndexOf(designer_format); - string file_name = path.Substring(0, designer_index); - - if (File.Exists(file_name)) - ps.WriteLine(" {0}", Path.GetFileName(file_name)); - else if (File.Exists(file_name + ".resx")) - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); - } - else if (subType == SubType.CodeBehind) - { - ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); - } - if (project.Files.GetIsLink(file)) - { - string alias = project.Files.GetLinkPath(file); - alias += file.Substring(startPos); - alias = Helper.NormalizePath(alias); - ps.WriteLine(" {0}", alias); - } - else if (project.Files.GetBuildAction(file) != BuildAction.None) - { - if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) - { - ps.WriteLine(" {0}", subType); - } - } - - if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) - { - ps.WriteLine(" {0}", project.Files.GetCopyToOutput(file)); - } - - ps.WriteLine(" ", project.Files.GetBuildAction(file)); - } - } - } - - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(""); - } - #endregion - - #region User File - - ps = new StreamWriter(projectFile + ".user"); - using (ps) - { - ps.WriteLine(""); - //ps.WriteLine( "" ); - //ps.WriteLine(" <{0}>", toolInfo.XMLTag); - //ps.WriteLine(" "); - ps.WriteLine(" "); - //ps.WriteLine(" ", MakeRefPath(project)); - ps.WriteLine(" Debug"); - ps.WriteLine(" AnyCPU"); - ps.WriteLine(" {0}", MakeRefPath(project)); - ps.WriteLine(" {0}", this.ProductVersion); - ps.WriteLine(" ProjectFiles"); - ps.WriteLine(" 0"); - ps.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" "); - } - ps.WriteLine(""); - } - #endregion - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) - { - kernel.Log.Write("Creating {0} solution and project files", this.VersionName); - - foreach (SolutionNode child in solution.Solutions) - { - kernel.Log.Write("...Creating folder: {0}", child.Name); - WriteSolution(child, false); - } - - foreach (ProjectNode project in solution.Projects) - { - kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - - foreach (DatabaseProjectNode project in solution.DatabaseProjects) - { - kernel.Log.Write("...Creating database project: {0}", project.Name); - WriteDatabaseProject(solution, project); - } - - if (writeSolutionToDisk) // only write main solution - { - kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - - using (StreamWriter ss = new StreamWriter(solutionFile)) - { - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); - ss.WriteLine(SolutionTag); - - WriteProjectDeclarations(ss, solution, solution); - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0}|Any CPU = {0}|Any CPU", conf.Name); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); - WriteConfigurationLines(solution.Configurations, solution, ss); - ss.WriteLine("\tEndGlobalSection"); - - if (solution.Solutions.Count > 0) - { - ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); - foreach (SolutionNode embeddedSolution in solution.Solutions) - { - WriteNestedProjectMap(ss, embeddedSolution); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("EndGlobal"); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - } - - private void WriteProjectDeclarations(StreamWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) - { - foreach (SolutionNode childSolution in embeddedSolution.Solutions) - { - WriteEmbeddedSolution(writer, childSolution); - WriteProjectDeclarations(writer, actualSolution, childSolution); - } - - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteProject(actualSolution, writer, project); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteProject(actualSolution, writer, dbProject); - } - - if (actualSolution.Guid == embeddedSolution.Guid) - { - WriteSolutionFiles(actualSolution, writer); - } - } - - private static void WriteNestedProjectMap(StreamWriter writer, SolutionNode embeddedSolution) - { - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteNestedProject(writer, embeddedSolution, project.Guid); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteNestedProject(writer, embeddedSolution, dbProject.Guid); - } - - foreach (SolutionNode child in embeddedSolution.Solutions) - { - WriteNestedProject(writer, embeddedSolution, child.Guid); - WriteNestedProjectMap(writer, child); - } - } - - private static void WriteNestedProject(StreamWriter writer, SolutionNode solution, Guid projectGuid) - { - WriteNestedFolder(writer, solution.Guid, projectGuid); - } - - private static void WriteNestedFolder(StreamWriter writer, Guid parentGuid, Guid childGuid) - { - writer.WriteLine("\t\t{0} = {1}", - childGuid.ToString("B").ToUpper(), - parentGuid.ToString("B").ToUpper()); - } - - private static void WriteConfigurationLines(ICollection configurations, SolutionNode solution, StreamWriter ss) - { - foreach (ProjectNode project in solution.Projects) - { - foreach (ConfigurationNode conf in configurations) - { - ss.WriteLine("\t\t{0}.{1}|Any CPU.ActiveCfg = {1}|Any CPU", - project.Guid.ToString("B").ToUpper(), - conf.Name); - - ss.WriteLine("\t\t{0}.{1}|Any CPU.Build.0 = {1}|Any CPU", - project.Guid.ToString("B").ToUpper(), - conf.Name); - } - } - - foreach (SolutionNode child in solution.Solutions) - { - WriteConfigurationLines(configurations, child, ss); - } - } - - private void WriteSolutionFiles(SolutionNode solution, StreamWriter ss) - { - if (solution.Files != null && solution.Files.Count > 0) - { - WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); - } - } - - private void WriteEmbeddedSolution(StreamWriter writer, SolutionNode embeddedSolution) - { - WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); - } - - private void WriteProject(SolutionNode solution, StreamWriter ss, ProjectNode project) - { - WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); - } - - private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject) - { - if (solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); - } - - private static bool ExtensionSpecified(string refName) - { - return refName.EndsWith(".dll") || refName.EndsWith(".exe"); - } - - private static string GetProjectExtension(ProjectNode project) - { - string extension = ".dll"; - if (project.Type == ProjectType.Exe) - { - extension = ".exe"; - } - return extension; - } - - const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; - const string ProjectDeclarationEndFormat = "EndProject"; - - private void WriteProject(StreamWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = (ToolInfo)tools[language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); - - path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); - - WriteProject(ss, language, guid, name, path); - } - - private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location) - { - WriteProject(writer, language, projectGuid, name, location, null); - } - - private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = (ToolInfo)tools[language]; - - writer.WriteLine(ProjectDeclarationBeginFormat, - toolInfo.Guid, - name, - location, - projectGuid.ToString("B").ToUpper()); - - if (files != null) - { - writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); - - foreach (string file in files) - writer.WriteLine("\t\t{0} = {0}", file); - - writer.WriteLine("\tEndProjectSection"); - } - - writer.WriteLine(ProjectDeclarationEndFormat); - } - - private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) - { - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); - IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); - - kernel.CurrentWorkingDirectory.Push(); - - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - using (ps) - { - ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); - ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); - ps.Indent++; - ps.WriteLine("MSDTVersion = \"80\""); - // TODO: Use the project.Files property - if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) - WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); - - ps.WriteLine("Begin DBRefFolder = \"Database References\""); - ps.Indent++; - foreach (DatabaseReferenceNode reference in project.References) - { - ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); - ps.Indent++; - ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); - ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); - //ps.WriteLine("Colorizer = 5"); - ps.Indent--; - ps.WriteLine("End"); - } - ps.Indent--; - ps.WriteLine("End"); - ps.Indent--; - ps.WriteLine("End"); - - ps.Flush(); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - - private bool ContainsSqlFiles(string folder) - { - foreach (string file in Directory.GetFiles(folder, "*.sql")) - { - return true; // if the folder contains 1 .sql file, that's good enough - } - - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - return true; // if 1 child folder contains a .sql file, still good enough - } - - return false; - } - - private void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) - { - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - { - writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); - writer.Indent++; - WriteDatabaseFoldersAndFiles(writer, child); - writer.Indent--; - writer.WriteLine("End"); - } - } - foreach (string file in Directory.GetFiles(folder, "*.sql")) - { - writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); - } - } - - private void CleanProject(ProjectNode project) - { - kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = (ToolInfo)tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - WriteSolution(sol, true); - } - kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - CleanSolution(sol); - } - kernel = null; - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/VSVersion.cs b/Prebuild/src/Core/Targets/VSVersion.cs deleted file mode 100644 index 59549b00a9..0000000000 --- a/Prebuild/src/Core/Targets/VSVersion.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region BSD License -/* -Copyright (c) 2008-2009 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com), John Anderson (sontek@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - public enum VSVersion - { - /// - /// Visual Studio 2002 - /// - VS70, - /// - /// Visual Studio 2003 - /// - VS71, - /// - /// Visual Studio 2005 - /// - VS80, - /// - /// Visual Studio 2008 - /// - VS90, - /// - /// Visual Studio 2010 - /// - VS10 - } -} diff --git a/Prebuild/src/Core/Targets/XcodeTarget.cs b/Prebuild/src/Core/Targets/XcodeTarget.cs deleted file mode 100644 index d96f65b86d..0000000000 --- a/Prebuild/src/Core/Targets/XcodeTarget.cs +++ /dev/null @@ -1,596 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("xcode")] - public class XcodeTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path + "/" + refr.Name + ".dll", '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - //Assembly assem = Assembly.Load(refr.Name); - //if (assem != null) - //{ - //ret += (refr.Name + ".dll"); - //} - //else - //{ - ret += (refr.Name + ".dll"); - //} - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name + ".dll"; - } - } - return ret; - } - - private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - Assembly assem = Assembly.Load(refr.Name); - if (assem != null) - { - ret += ""; - } - else - { - ret += ""; - } - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += ""; - } - } - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - ss.WriteLine(" ", '/')); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating Xcode build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj")); - if (!directoryInfo.Exists) - { - directoryInfo.Create(); - } - string combFile = Helper.MakeFilePath(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj"), "project", "pbxproj"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); - - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - foreach (ConfigurationNode conf in solution.Configurations) - { - // Set the project.config to a non-debug configuration - if (conf.Options["DebugInformation"].ToString().ToLower() != "true") - { - ss.WriteLine(" ", conf.Name); - } - ss.WriteLine(); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine(" "); - ss.WriteLine(); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - //foreach(ProjectNode project in solution.Projects) - //{ - // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - // ss.Write(" "); - //} - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Xcode build files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "xcode"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/UnknownLanguageException.cs b/Prebuild/src/Core/UnknownLanguageException.cs deleted file mode 100644 index 607b66c022..0000000000 --- a/Prebuild/src/Core/UnknownLanguageException.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* - * $RCSfile$ - * Copyright (C) 2004, 2005 David Hudson (jendave@yahoo.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - [Serializable()] - public class UnknownLanguageException : Exception - { - /// - /// Basic exception. - /// - public UnknownLanguageException() - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public UnknownLanguageException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public UnknownLanguageException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - } -} diff --git a/Prebuild/src/Core/Utilities/CommandLineCollection.cs b/Prebuild/src/Core/Utilities/CommandLineCollection.cs deleted file mode 100644 index 22752aa1e1..0000000000 --- a/Prebuild/src/Core/Utilities/CommandLineCollection.cs +++ /dev/null @@ -1,153 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Diagnostics; - -namespace Prebuild.Core.Utilities -{ - /// - /// The CommandLine class parses and interprets the command-line arguments passed to - /// prebuild. - /// - public class CommandLineCollection - { - #region Fields - - // The raw OS arguments - private string[] m_RawArgs; - - // Command-line argument storage - private Hashtable m_Arguments; - - #endregion - - #region Constructors - - /// - /// Create a new CommandLine instance and set some internal variables. - /// - public CommandLineCollection(string[] args) - { - m_RawArgs = args; - m_Arguments = new Hashtable(); - - Parse(); - } - - #endregion - - #region Private Methods - - private void Parse() - { - if(m_RawArgs.Length < 1) - return; - - int idx = 0; - string arg = null, lastArg = null; - - while(idx 2 && arg[0] == '/') - { - arg = arg.Substring(1); - lastArg = arg; - m_Arguments[arg] = ""; - } - else - { - if(lastArg != null) - { - m_Arguments[lastArg] = arg; - lastArg = null; - } - } - - idx++; - } - } - - #endregion - - #region Public Methods - - /// - /// Wases the passed. - /// - /// The arg. - /// - public bool WasPassed(string arg) - { - return (m_Arguments.ContainsKey(arg)); - } - - #endregion - - #region Properties - - /// - /// Gets the parameter associated with the command line option - /// - /// Returns null if option was not specified, - /// null string if no parameter was specified, and the value if a parameter was specified - public string this[string index] - { - get - { - if(m_Arguments.ContainsKey(index)) - { - return (string)(m_Arguments[index]); - } - else - { - return null; - } - } - } - - #endregion - - #region IEnumerable Members - - /// - /// Returns an enumerator that can iterate through a collection. - /// - /// - /// An - /// that can be used to iterate through the collection. - /// - public IDictionaryEnumerator GetEnumerator() - { - return m_Arguments.GetEnumerator(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/CurrentDirectory.cs b/Prebuild/src/Core/Utilities/CurrentDirectory.cs deleted file mode 100644 index 5fabdf0943..0000000000 --- a/Prebuild/src/Core/Utilities/CurrentDirectory.cs +++ /dev/null @@ -1,80 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public class CurrentDirectory - { - #region Fields - - private Stack m_Stack; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public CurrentDirectory() - { - m_Stack = new Stack(); - } - - #endregion - - #region Public Methods - - /// - /// Pushes this instance. - /// - public void Push() - { - m_Stack.Push(Environment.CurrentDirectory); - } - - /// - /// Pops this instance. - /// - public void Pop() - { - if(m_Stack.Count < 1) - { - return; - } - - string cwd = (string)m_Stack.Pop(); - Helper.SetCurrentDir(cwd); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/Helper.cs b/Prebuild/src/Core/Utilities/Helper.cs deleted file mode 100644 index 9a0d131c7e..0000000000 --- a/Prebuild/src/Core/Utilities/Helper.cs +++ /dev/null @@ -1,654 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Collections.Specialized; -using System.Xml; -using Prebuild.Core.Nodes; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public class Helper - { - #region Fields - - private static Stack dirStack; - private static Regex varRegex; - static bool checkForOSVariables; - - /// - /// - /// - public static bool CheckForOSVariables - { - get - { - return checkForOSVariables; - } - set - { - checkForOSVariables = value; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes the class. - /// - static Helper() - { - dirStack = new Stack(); - //m_VarRegex = new Regex(@"\${(?[\w|_]+)}"); - } - - #endregion - - #region Properties - - /// - /// - /// - public static Stack DirStack - { - get - { - return dirStack; - } - } - - /// - /// - /// - public static Regex VarRegex - { - get - { - return varRegex; - } - set - { - varRegex = value; - } - } - - #endregion - - #region Public Methods - - #region String Parsing - #region Inner Classes and Delegates - /// - /// - /// - public delegate string StringLookup(string key); - - #endregion - - /// - /// Gets a collection of StringLocationPair objects that represent the matches - /// - /// The target. - /// The before group. - /// The after group. - /// if set to true [include delimiters in substrings]. - /// - public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) - { - if( beforeGroup == null ) - { - throw new ArgumentNullException("beforeGroup"); - } - if( afterGroup == null ) - { - throw new ArgumentNullException("afterGroup"); - } - StringCollection results = new StringCollection(); - if(target == null || target.Length == 0) - { - return results; - } - - int beforeMod = 0; - int afterMod = 0; - if(includeDelimitersInSubstrings) - { - //be sure to not exlude the delims - beforeMod = beforeGroup.Length; - afterMod = afterGroup.Length; - } - int startIndex = 0; - while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { - int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it - if(endIndex == -1) - { - break; - } - int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string - string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, - length - afterMod); - - results.Add(substring); - //results.Add(new StringLocationPair(substring,startIndex)); - startIndex = endIndex + 1; - //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization - //so start after endIndex - - } - return results; - } - - /// - /// Replaces the groups. - /// - /// The target. - /// The before group. - /// The after group. - /// The lookup. - /// - public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { - if( target == null ) - { - throw new ArgumentNullException("target"); - } - //int targetLength = target.Length; - StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); - if( lookup == null ) - { - throw new ArgumentNullException("lookup"); - } - foreach(string substring in strings) - { - target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); - } - return target; - } - - /// - /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate - /// - /// The target. - /// The lookup. - /// - public static string InterpolateForVariables(string target, StringLookup lookup) - { - return ReplaceGroups(target, "${" , "}" , lookup); - } - - /// - /// Replaces ${var} statements in a string with the corresonding environment variable with name var - /// - /// - /// - public static string InterpolateForEnvironmentVariables(string target) - { - return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); - } - - #endregion - - /// - /// Translates the value. - /// - /// Type of the translate. - /// The translation item. - /// - public static object TranslateValue(Type translateType, string translationItem) - { - if(translationItem == null) - { - return null; - } - - try - { - string lowerVal = translationItem.ToLower(); - if(translateType == typeof(bool)) - { - return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); - } - else if(translateType == typeof(int)) - { - return (Int32.Parse(translationItem)); - } - else - { - return translationItem; - } - } - catch(FormatException) - { - return null; - } - } - - /// - /// Deletes if exists. - /// - /// The file. - /// - public static bool DeleteIfExists(string file) - { - string resFile = null; - try - { - resFile = ResolvePath(file); - } - catch(ArgumentException) - { - return false; - } - - if(!File.Exists(resFile)) - { - return false; - } - - File.Delete(resFile); - return true; - } - - static readonly char seperator = Path.DirectorySeparatorChar; - - // This little gem was taken from the NeL source, thanks guys! - /// - /// Makes a relative path - /// - /// Path to start from - /// Path to end at - /// Path that will get from startPath to endPath - public static string MakePathRelativeTo(string startPath, string endPath) - { - string tmp = NormalizePath(startPath, seperator); - string src = NormalizePath(endPath, seperator); - string prefix = ""; - - while(true) - { - if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) - { - string ret; - int size = tmp.Length; - if(size == src.Length) - { - return "./"; - } - if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) - { - } - else - { - ret = prefix + endPath.Substring(size, endPath.Length - size); - ret = ret.Trim(); - if(ret[0] == seperator) - { - ret = "." + ret; - } - - return NormalizePath(ret); - } - - } - - if(tmp.Length < 2) - { - break; - } - - int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); - int prevPos = tmp.IndexOf(seperator); - - if((lastPos == prevPos) || (lastPos == -1)) - { - break; - } - - tmp = tmp.Substring(0, lastPos + 1); - prefix += ".." + seperator.ToString(); - } - - return endPath; - } - - /// - /// Resolves the path. - /// - /// The path. - /// - public static string ResolvePath(string path) - { - string tmpPath = NormalizePath(path); - if(tmpPath.Length < 1) - { - tmpPath = "."; - } - - tmpPath = Path.GetFullPath(tmpPath); - if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) - { - throw new ArgumentException("Path could not be resolved: " + tmpPath); - } - - return tmpPath; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// The separator character. - /// - public static string NormalizePath(string path, char separatorCharacter) - { - if(path == null || path == "" || path.Length < 1) - { - return ""; - } - - string tmpPath = path.Replace('\\', '/'); - tmpPath = tmpPath.Replace('/', separatorCharacter); - return tmpPath; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - return NormalizePath(path, Path.DirectorySeparatorChar); - } - - /// - /// Ends the path. - /// - /// The path. - /// The separator character. - /// - public static string EndPath(string path, char separatorCharacter) - { - if(path == null || path == "" || path.Length < 1) - { - return ""; - } - - if(!path.EndsWith(separatorCharacter.ToString())) - { - return (path + separatorCharacter); - } - - return path; - } - - /// - /// Ends the path. - /// - /// The path. - /// - public static string EndPath(string path) - { - return EndPath(path, Path.DirectorySeparatorChar); - } - - /// - /// Makes the file path. - /// - /// The path. - /// The name. - /// The ext. - /// - public static string MakeFilePath(string path, string name, string ext) - { - string ret = EndPath(NormalizePath(path)); - - if( name == null ) - { - throw new ArgumentNullException("name"); - } - - ret += name; - if(!name.EndsWith("." + ext)) - { - ret += "." + ext; - } - - //foreach(char c in Path.GetInvalidPathChars()) - //{ - // ret = ret.Replace(c, '_'); - //} - - return ret; - } - - /// - /// Makes the file path. - /// - /// The path. - /// The name. - /// - public static string MakeFilePath(string path, string name) - { - string ret = EndPath(NormalizePath(path)); - - if( name == null ) - { - throw new ArgumentNullException("name"); - } - - ret += name; - - //foreach (char c in Path.GetInvalidPathChars()) - //{ - // ret = ret.Replace(c, '_'); - //} - - return ret; - } - - /// - /// - /// - /// - /// - public static string MakeReferencePath(string path) - { - string ret = EndPath(NormalizePath(path)); - - //foreach (char c in Path.GetInvalidPathChars()) - //{ - // ret = ret.Replace(c, '_'); - //} - - return ret; - } - - /// - /// Sets the current dir. - /// - /// The path. - public static void SetCurrentDir(string path) - { - if( path == null ) - { - throw new ArgumentNullException("path"); - } - if(path.Length < 1) - { - return; - } - - Environment.CurrentDirectory = path; - } - - /// - /// Checks the type. - /// - /// The type to check. - /// The attr. - /// The inter. - /// - public static object CheckType(Type typeToCheck, Type attr, Type inter) - { - if(typeToCheck == null || attr == null) - { - return null; - } - - object[] attrs = typeToCheck.GetCustomAttributes(attr, false); - if(attrs == null || attrs.Length < 1) - { - return null; - } - if( inter == null ) - { - throw new ArgumentNullException("inter"); - } - - if(typeToCheck.GetInterface(inter.FullName) == null) - { - return null; - } - - return attrs[0]; - } - - /* A bit of overhead for simple group parsing, there are problems with Regex in Mono - public static string ParseValue(string val) - { - if(val == null || val.Length < 1 || !CheckForOSVariables) - return val; - - string tmp = val; - Match m = m_VarRegex.Match(val); - while(m.Success) - { - if(m.Groups["var"] == null) - continue; - - Capture c = m.Groups["var"].Captures[0]; - if(c == null) - continue; - - string var = c.Value; - string envVal = Environment.GetEnvironmentVariable(var); - if(envVal == null) - envVal = ""; - - tmp = tmp.Replace("${" + var + "}", envVal); - m = m.NextMatch(); - } - - return tmp; - }*/ - - /// - /// Attributes the value. - /// - /// The node. - /// The attr. - /// The def. - /// - public static string AttributeValue(XmlNode node, string attr, string def) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(node.Attributes[attr] == null) - { - return def; - } - string val = node.Attributes[attr].Value; - if(!CheckForOSVariables) - { - return val; - } - - return InterpolateForEnvironmentVariables(val); - } - - /// - /// Parses the boolean. - /// - /// The node. - /// The attr. - /// if set to true [default value]. - /// - public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(node.Attributes[attr] == null) - { - return defaultValue; - } - return bool.Parse(node.Attributes[attr].Value); - } - - /// - /// Enums the attribute value. - /// - /// The node. - /// The attr. - /// Type of the enum. - /// The def. - /// - public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) - { - if( def == null ) - { - throw new ArgumentNullException("def"); - } - string val = AttributeValue(node, attr, def.ToString()); - return Enum.Parse(enumType, val, true); - } - - /// - /// - /// - /// - /// - /// - public static string AssemblyFullName(string assemblyName, ProjectType projectType) - { - return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/Log.cs b/Prebuild/src/Core/Utilities/Log.cs deleted file mode 100644 index 548e987690..0000000000 --- a/Prebuild/src/Core/Utilities/Log.cs +++ /dev/null @@ -1,270 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public enum LogType - { - /// - /// - /// - None, - /// - /// - /// - Info, - /// - /// - /// - Warning, - /// - /// - /// - Error - } - - /// - /// - /// - [Flags] - public enum LogTargets - { - /// - /// - /// - None = 0, - /// - /// - /// - Null = 1, - /// - /// - /// - File = 2, - /// - /// - /// - Console = 4 - } - - /// - /// Summary description for Log. - /// - public class Log : IDisposable - { - #region Fields - - private StreamWriter m_Writer; - private LogTargets m_Target = LogTargets.Null; - bool disposed; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The target. - /// Name of the file. - public Log(LogTargets target, string fileName) - { - m_Target = target; - - if((m_Target & LogTargets.File) != 0) - { - m_Writer = new StreamWriter(fileName, false); - } - } - - #endregion - - #region Public Methods - - /// - /// Writes this instance. - /// - public void Write() - { - Write(string.Empty); - } - - /// - /// Writes the specified MSG. - /// - /// The MSG. - public void Write(string msg) - { - if((m_Target & LogTargets.Null) != 0) - { - return; - } - - if((m_Target & LogTargets.Console) != 0) - { - Console.WriteLine(msg); - } - if((m_Target & LogTargets.File) != 0 && m_Writer != null) - { - m_Writer.WriteLine(msg); - } - } - - /// - /// Writes the specified format. - /// - /// The format. - /// The args. - public void Write(string format, params object[] args) - { - Write(string.Format(format,args)); - } - - /// - /// Writes the specified type. - /// - /// The type. - /// The format. - /// The args. - public void Write(LogType type, string format, params object[] args) - { - if((m_Target & LogTargets.Null) != 0) - { - return; - } - - string str = ""; - switch(type) - { - case LogType.Info: - str = "[I] "; - break; - case LogType.Warning: - str = "[!] "; - break; - case LogType.Error: - str = "[X] "; - break; - } - - Write(str + format,args); - } - - /// - /// Writes the exception. - /// - /// The type. - /// The ex. - public void WriteException(LogType type, Exception ex) - { - if(ex != null) - { - Write(type, ex.Message); - //#if DEBUG - m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); - m_Writer.WriteLine(ex.StackTrace); - m_Writer.WriteLine("]]"); - //#endif - } - } - - /// - /// Flushes this instance. - /// - public void Flush() - { - if(m_Writer != null) - { - m_Writer.Flush(); - } - } - - #endregion - - #region IDisposable Members - - /// - /// Performs application-defined tasks associated with freeing, releasing, or - /// resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose objects - /// - /// - /// If true, it will dispose close the handle - /// - /// - /// Will dispose managed and unmanaged resources. - /// - protected virtual void Dispose(bool disposing) - { - if (!this.disposed) - { - if (disposing) - { - if (m_Writer != null) - { - m_Writer.Close(); - m_Writer = null; - } - } - } - this.disposed = true; - } - - /// - /// - /// - ~Log() - { - this.Dispose(false); - } - - /// - /// Closes and destroys this object - /// - /// - /// Same as Dispose(true) - /// - public void Close() - { - Dispose(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/WarningException.cs b/Prebuild/src/Core/WarningException.cs deleted file mode 100644 index df90dc8d7d..0000000000 --- a/Prebuild/src/Core/WarningException.cs +++ /dev/null @@ -1,84 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - /// - [Serializable()] - public class WarningException : Exception - { - #region Constructors - - /// - /// - /// - public WarningException() - { - } - - /// - /// - /// - /// - /// - public WarningException(string format, params object[] args) - : base(String.Format(format, args)) - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public WarningException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public WarningException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - - #endregion - } -} diff --git a/Prebuild/src/Prebuild.cs b/Prebuild/src/Prebuild.cs deleted file mode 100644 index 2d12b53066..0000000000 --- a/Prebuild/src/Prebuild.cs +++ /dev/null @@ -1,165 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-09-26 23:43:35 +0200 (ti, 26 sep 2006) $ - * $Revision: 168 $ - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.EnterpriseServices.Internal; - -using Prebuild.Core; -using Prebuild.Core.Utilities; - -namespace Prebuild -{ - /// - /// - /// - class Prebuild - { - #region Main - - [STAThread] - static void Main(string[] args) - { - Kernel kernel = null; - try - { - kernel = Kernel.Instance; - kernel.Initialize(LogTargets.File | LogTargets.Console, args); - bool exit = false; - - if(kernel.CommandLine.WasPassed("usage")) - { - exit = true; - OutputUsage(); - } - if(kernel.CommandLine.WasPassed("showtargets")) - { - exit = true; - OutputTargets(kernel); - } - if(kernel.CommandLine.WasPassed("install")) - { - exit = true; - InstallAssembly(kernel); - } - if(kernel.CommandLine.WasPassed("remove")) - { - exit = true; - RemoveAssembly(kernel); - } - - if(!exit) - { - kernel.Process(); - } - } - catch(Exception ex) - { - Console.WriteLine("Unhandled error: {0}", ex.Message); - //#if DEBUG - Console.WriteLine("{0}", ex.StackTrace); - //#endif - } - finally - { - if(kernel.PauseAfterFinish) - { - Console.WriteLine("\nPress enter to continue..."); - Console.ReadLine(); - } - } - } - - #endregion - - #region Private Methods - - private static void InstallAssembly(Kernel kernel) - { - Publish publish = new Publish(); - string file = kernel.CommandLine["install"]; - //Console.WriteLine(".."+file+".."); - publish.GacInstall(file); - } - - private static void RemoveAssembly(Kernel kernel) - { - Publish publish = new Publish(); - string file = kernel.CommandLine["remove"]; - publish.GacRemove(file); - } - - private static void OutputUsage() - { - Console.WriteLine("Usage: prebuild /target [options]"); - Console.WriteLine("Available command-line switches:"); - Console.WriteLine(); - Console.WriteLine("/target Target for Prebuild"); - Console.WriteLine("/clean Clean the build files for the given target"); - Console.WriteLine("/file XML file to process"); - Console.WriteLine("/log Log file to write to"); - Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); - Console.WriteLine("/pause Pauses the application after execution to view the output"); - Console.WriteLine("/yes Default to yes to any questions asked"); - Console.WriteLine("/install Install assembly into the GAC"); - Console.WriteLine("/remove Remove assembly from the GAC"); - Console.WriteLine(); - Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); - Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); - Console.WriteLine(); - } - - private static void OutputTargets(Kernel kern) - { - Console.WriteLine("Targets available in Prebuild:"); - Console.WriteLine(""); - if(kern.Targets.Keys.Count > 0) - { - string[] targs = new string[kern.Targets.Keys.Count]; - kern.Targets.Keys.CopyTo(targs, 0); - Array.Sort(targs); - foreach(string target in targs) - { - Console.WriteLine(target); - } - } - Console.WriteLine(""); - } - - #endregion - } -} diff --git a/Prebuild/src/Prebuild.snk b/Prebuild/src/Prebuild.snk deleted file mode 100644 index f9dce054ffae7c79dce7d3ba0b790904bdb36831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097%QdipZe+P78+gioe1FL>Pm`A%NYNJjT zvr&utrO*Bz`;(~1&v7SLbo#8h8*Eu!T1$f&*Z!JD(@sjU;6;rE+#4q{`Ci_P6X~Os zsqTl*?$f+z`P@h&-Z=SV9gYc!udqrVAH@hG`xHwT1SMQBX^U%@gPO$V6JX)9KT9Ww>?9GKft(b~3CsqH2^BHX{_&xGMn ztAW9|iLO>;#yB;wrHus##d%AZDeNPu@F_TTzUscSGU=aLSyvelLiSJps^FvCxcYHV z4Y1$J$Wu2ek`e>_>d43PbVJq8mILALAW%&DDsyb=|xUms2{~U~!hI$4*kXem7!Hk=k zc1qQS!>`bZbL}5fr*. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyName("")] diff --git a/Prebuild/src/data/autotools.xml b/Prebuild/src/data/autotools.xml deleted file mode 100644 index ee4b0643dc..0000000000 --- a/Prebuild/src/data/autotools.xml +++ /dev/null @@ -1,790 +0,0 @@ - - - - - #!/bin/sh -# Run this to generate all the initial makefiles, etc. -# Ripped off from Mono, which ripped off from GNOME macros version - -DIE=0 - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -if [ -n "$MONO_PATH" ]; then - # from -> /mono/lib:/another/mono/lib - # to -> /mono /another/mono - for i in `echo ${MONO_PATH} | tr ":" " "`; do - i=`dirname ${i}` - if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then - ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" - fi - if [ -n "{i}" -a -d "${i}/bin" ]; then - PATH="${i}/bin:$PATH" - fi - done - export PATH -fi - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to compile Mono." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if [ -z "$LIBTOOL" ]; then - LIBTOOL=`which glibtool 2>/dev/null` - if [ ! -x "$LIBTOOL" ]; then - LIBTOOL=`which libtool` - fi -fi - -(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { - ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`libtool' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { - grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ - (gettext --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`gettext' installed to compile Mono." - echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$NOCONFIGURE"; then - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - - -if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then - if test -z "$NO_LIBTOOLIZE" ; then - echo "Running libtoolize..." - ${LIBTOOL}ize --force --copy - fi -fi - -echo "Running aclocal $ACLOCAL_FLAGS ..." -aclocal $ACLOCAL_FLAGS || { - echo - echo "**Error**: aclocal failed. This may mean that you have not" - echo "installed all of the packages you need, or you may need to" - echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" - echo "for the prefix where you installed the packages whose" - echo "macros were not found" - exit 1 -} - -if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader || { echo "**Error**: autoheader failed."; exit 1; } -fi - -echo "Running automake --gnu $am_opt ..." -automake --add-missing --gnu $am_opt || - { echo "**Error**: automake failed."; exit 1; } -echo "Running autoconf ..." -autoconf || { echo "**Error**: autoconf failed."; exit 1; } - -conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME || exit 1 -else - echo Skipping configure process. -fi - - - - - - - - - - - - - - - - AC_INIT([],[]) - -AC_PREREQ(2.60) -AC_CANONICAL_SYSTEM -AC_CONFIG_AUX_DIR(.) -AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) -AM_MAINTAINER_MODE -dnl AC_PROG_INTLTOOL([0.25]) -AC_PROG_INSTALL - -ASSEMBLY_NAME= -PROJECT_NAME= -PROJECT_VERSION=$VERSION -PROJECT_DESCRIPTION="" -PROJECT_TYPE="" - -AC_SUBST(ASSEMBLY_NAME) -AC_SUBST(PROJECT_NAME) -AC_SUBST(PROJECT_VERSION) -AC_SUBST(DESCRIPTION) - -AC_MSG_CHECKING([assembly type]) -case $PROJECT_TYPE in - *Exe) - ASSEMBLY_EXTENSION=exe - ;; - *Library) - ASSEMBLY_EXTENSION=dll - ;; - *) - AC_MSG_ERROR([*** Please add support for project type $PROJECT_TYPE to configure.ac checks!]) - ;; -esac -AC_MSG_RESULT([$PROJECT_TYPE]) - -AC_SUBST(ASSEMBLY_EXTENSION) - -AC_MSG_CHECKING([whether we're compiling from an RCS]) -if test -f "$srcdir/.cvs_version" ; then - from_rcs=cvs -else - if test -f "$srcdir/.svn/entries" ; then - from_rcs=svn - else - from_rcs=no - fi -fi - -AC_MSG_RESULT($from_rcs) - -MONO_REQUIRED_VERSION=1.1 - -PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false) - -if test "x$has_mono" = "xtrue"; then - AC_PATH_PROG(RUNTIME, mono, no) - AC_PATH_PROG(CSC, gmcs, no) - AC_PATH_PROG(RESGEN, resgen2, no) - if test `uname -s` = "Darwin"; then - LIB_PREFIX= - LIB_SUFFIX=.dylib - else - LIB_PREFIX=.so - LIB_SUFFIX= - fi -else - AC_PATH_PROG(CSC, csc.exe, no) - if test x$CSC = "xno"; then - AC_MSG_ERROR([You need to install either mono or .Net]) - else - RUNTIME= - LIB_PREFIX= - LIB_SUFFIX= - fi -fi - -AC_PATH_PROG(GACUTIL, gacutil) -if test "x$GACUTIL" = "xno" ; then - AC_MSG_ERROR([No gacutil tool found]) -fi - -GACUTIL_FLAGS='/package /gacdir $(DESTDIR)$(prefix)/lib' -AC_SUBST(GACUTIL_FLAGS) - -AC_SUBST(PATH) -AC_SUBST(LD_LIBRARY_PATH) - -AC_SUBST(LIB_PREFIX) -AC_SUBST(LIB_SUFFIX) -AC_SUBST(RUNTIME) -AC_SUBST(CSC) -AC_SUBST(RESGEN) -AC_SUBST(GACUTIL) - -AC_SUBST(BASE_DEPENDENCIES_CFLAGS) -AC_SUBST(BASE_DEPENDENCIES_LIBS) - -dnl Find monodoc -MONODOC_REQUIRED_VERSION=1.0 -AC_SUBST(MONODOC_REQUIRED_VERSION) - -PKG_CHECK_MODULES(MONODOC_DEPENDENCY, monodoc >= $MONODOC_REQUIRED_VERSION, enable_monodoc=yes, enable_monodoc=no) - -if test "x$enable_monodoc" = "xyes"; then - AC_PATH_PROG(MONODOC, monodoc, no) - if test x$MONODOC = xno; then - enable_monodoc=no - fi -else - MONODOC= -fi - -AC_SUBST(MONODOC) -AM_CONDITIONAL(ENABLE_MONODOC, test "x$enable_monodoc" = "xyes") - -winbuild=no -case "$host" in - *-*-mingw*|*-*-cygwin*) - winbuild=yes - ;; -esac -AM_CONDITIONAL(WINBUILD, test x$winbuild = xyes) - -AC_CONFIG_FILES() -AC_CONFIG_FILES(.pc) - -AC_CONFIG_FILES(Makefile) -AC_OUTPUT - -echo "===" -echo "" -echo "Project configuration summary" -echo "" -echo " * Installation prefix: $prefix" -echo " * compiler: $CSC" -echo " * Documentation: $enable_monodoc ($MONODOC)" -echo " * Project Name: $PROJECT_NAME" -echo " * Version: $PROJECT_VERSION" -echo "" -echo "===" - - - - - - - - - - - - - - - - - - - - - - - - - - -ASSEMBLY=$(ASSEMBLY_NAME).$(ASSEMBLY_EXTENSION) - - -dir = $(prefix)/lib/ -_DATA = $(ASSEMBLY) $(ASSEMBLY).config - -bin_SCRIPTS= - -pkgconfigdir = $(prefix)/lib/pkgconfig -pkgconfig_DATA = .pc - -dir = $(prefix)/lib/mono/ -_DATA = $(ASSEMBLY).config - -noinst_DATA = $(ASSEMBLY) - - -PACKAGES = -BINARY_LIBS = -SYSTEM_LIBS = -RESOURCES_SRC = -RESOURCES = $(RESOURCES_SRC:.resx=.resources) -SOURCES = - -EXTRA_DIST=$(SOURCES) $(BINARY_LIBS) $(RESOURCES_SRC) install-sh missing - -CLEANFILES=$(ASSEMBLY) - - - - - - - -/$(ASSEMBLY): $(srcdir)/$(ASSEMBLY).response $(RESOURCES) $(SOURCES) $(BINARY_LIBS) - mkdir -p doc && mkdir -p && $(CSC) /out:$@ \ - /target: \ - $(addprefix /resource:$(srcdir)/, $(RESOURCES)) \ - $(addprefix /pkg:, $(PACKAGES)) \ - $(addprefix /r:, $(SYSTEM_LIBS)) \ - $(addprefix /r:$(srcdir)/, $(BINARY_LIBS)) \ - @$(srcdir)/$(ASSEMBLY).response \ - /doc:doc/ \ - /keyfile:$(srcdir)/ \ - /unsafe \ - && rm -f $(ASSEMBLY) \ - && ln $@ $(ASSEMBLY) - -CLEANFILES+=/$(ASSEMBLY) - - -EXTRA_DIST+= - -: /$(ASSEMBLY) - rm -f $(ASSEMBLY) \ - && ln /$(ASSEMBLY) $(ASSEMBLY) - - - - - -_install-data-local: /$(ASSEMBLY) - echo "$(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS)"; \ - $(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS) || exit 1; - -_uninstall-local: - if [`gacutil -l | grep "Number" | awk -F= '{print $$2}'` -gt "0" ] ; \ - then \ - echo "$(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ - $(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ - fi - - - -noinst__dir = $(prefix)/lib/mono/ -noinst___DATA = /$(ASSEMBLY) - - - - - - -$(ASSEMBLY): - - -$(srcdir)/$(ASSEMBLY).response: $(srcdir)/Makefile - echo "$(addprefix $(srcdir)/, $(SOURCES))" > $@ - - -all: $(ASSEMBLY) - -# rule to compile .resx files to .resources -%.resources: %.resx - $(RESGEN) /useSourcePath /compile $(@:.resources=.resx) - - - - - -install-data-local: _install-data-local - -uninstall-local: _uninstall-local - - - -#dir+=$(noinst__dir) -#_DATA+=$(noinst___DATA) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -prefix=@prefix@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib/mono/@PROJECT_NAME@ - -Name: -Description: -Version: @PROJECT_VERSION@ -Requires: -Libs: -r:${libdir}/@PROJECT_NAME@.dll - - - - - - - - - - - #!/bin/sh -# Run this to generate all the initial makefiles, etc. -# Ripped off from Mono, which ripped off from GNOME macros version - -DIE=0 - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -if [ -n "$MONO_PATH" ]; then - # from -> /mono/lib:/another/mono/lib - # to -> /mono /another/mono - for i in `echo ${MONO_PATH} | tr ":" " "`; do - i=`dirname ${i}` - if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then - ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" - fi - if [ -n "{i}" -a -d "${i}/bin" ]; then - PATH="${i}/bin:$PATH" - fi - done - export PATH -fi - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to compile Mono." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if [ -z "$LIBTOOL" ]; then - LIBTOOL=`which glibtool 2>/dev/null` - if [ ! -x "$LIBTOOL" ]; then - LIBTOOL=`which libtool` - fi -fi - -(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { - ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`libtool' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { - grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ - (gettext --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`gettext' installed to compile Mono." - echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - - -if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then - if test -z "$NO_LIBTOOLIZE" ; then - echo "Running libtoolize..." - ${LIBTOOL}ize --force --copy - fi -fi - -echo "Running aclocal $ACLOCAL_FLAGS ..." -aclocal $ACLOCAL_FLAGS || { - echo - echo "**Error**: aclocal failed. This may mean that you have not" - echo "installed all of the packages you need, or you may need to" - echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" - echo "for the prefix where you installed the packages whose" - echo "macros were not found" - exit 1 -} - -if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader || { echo "**Error**: autoheader failed."; exit 1; } -fi - -echo "Running automake --gnu $am_opt ..." -automake --add-missing --gnu $am_opt || - { echo "**Error**: automake failed."; exit 1; } -echo "Running autoconf ..." -autoconf || { echo "**Error**: autoconf failed."; exit 1; } - - -echo Running /autogen.sh ... -(cd $srcdir/ ; NOCONFIGURE=1 /bin/sh ./autogen.sh "$@") -echo Done running /autogen.sh ... - - -conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME || exit 1 -else - echo Skipping configure process. -fi - - - - - - - - - - -AC_INIT([]-solution,[]) -AC_CONFIG_AUX_DIR(.) -AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) -EXTRA_DIST="install-sh missing" -SOLUTION_NAME= -SOLUTION_VERSION=$VERSION -SOLUTION_DESCRIPTION="" -AC_SUBST(DESCRIPTION) - -AM_MAINTAINER_MODE - -dnl AC_PROG_INTLTOOL([0.25]) - -AC_PROG_INSTALL - -AC_MSG_CHECKING([whether we're building from an RCS]) -if test -f "$srcdir/.cvs_version" ; then - from_rcs=cvs -else - if test -f "$srcdir/.svn/entries" ; then - from_rcs=svn - else - from_rcs=no - fi -fi - -AC_MSG_RESULT($from_rcs) - -CONFIG="Release" -AC_SUBST(CONFIG) - -AC_CONFIG_SUBDIRS( -) - - -AC_OUTPUT([ -Makefile -]) - -echo "===" -echo "" -echo "Solution configuration summary" -echo "" -echo " * Solution Name: $SOLUTION_NAME" -echo " * Version: $SOLUTION_VERSION" -echo " * Packages:" -echo " - " -echo "" -echo "===" - - - - - - - - - SUBDIRS = - - - - - - - - - - - - -#! /bin/sh - -PACKAGE= -prefix=@prefix@ -exec_prefix=@exec_prefix@ - -# %%$@%$# why oh why isn't it $sharedir/ -# Day changed to 30 Mar 2007 -# ... -# 07:50 < cj> why are we installing .exe assemblies to $prefix/lib/$package/ and -# not $prefix/share/$package ? -# 07:50 < jonp> momentum. -# 07:50 < jonp> and it's hard to say that a .exe isn't platform specific -# 07:50 < jonp> as it can still contain DllImport's which make platform -# assumptions - -packagedir=$prefix/lib/ -export MONO_PATH=$MONO_PATH - -exec @RUNTIME@ $packagedir/$PACKAGE.exe "$@" - - - - - diff --git a/Prebuild/src/data/dnpb-1.0.xsd b/Prebuild/src/data/dnpb-1.0.xsd deleted file mode 100644 index b9e0e4eaf5..0000000000 --- a/Prebuild/src/data/dnpb-1.0.xsd +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.1.xsd b/Prebuild/src/data/dnpb-1.1.xsd deleted file mode 100644 index 2c065a3297..0000000000 --- a/Prebuild/src/data/dnpb-1.1.xsd +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.2.xsd b/Prebuild/src/data/dnpb-1.2.xsd deleted file mode 100644 index d694ab43d7..0000000000 --- a/Prebuild/src/data/dnpb-1.2.xsd +++ /dev/null @@ -1,198 +0,0 @@ - - - - - Copyright (c) 2004 Matthew Holmes (calefaction _at_ houston _._ rr _._ com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.3.xsd b/Prebuild/src/data/dnpb-1.3.xsd deleted file mode 100644 index 8f31a544ab..0000000000 --- a/Prebuild/src/data/dnpb-1.3.xsd +++ /dev/null @@ -1,206 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Pre-Build is an XML-driven pre-build tool allowing developers to - easily generate project or make files for major IDE's and .NET - development tools including: Visual Studio 2003, Visual Studio 2002, - SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.4.xsd b/Prebuild/src/data/dnpb-1.4.xsd deleted file mode 100644 index 1da50fcc7a..0000000000 --- a/Prebuild/src/data/dnpb-1.4.xsd +++ /dev/null @@ -1,212 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/dnpb-1.5.xsd b/Prebuild/src/data/dnpb-1.5.xsd deleted file mode 100644 index e2b21f0c69..0000000000 --- a/Prebuild/src/data/dnpb-1.5.xsd +++ /dev/null @@ -1,215 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/prebuild-1.6.xsd b/Prebuild/src/data/prebuild-1.6.xsd deleted file mode 100644 index 57ebd2eb9d..0000000000 --- a/Prebuild/src/data/prebuild-1.6.xsd +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/prebuild-1.7.xsd b/Prebuild/src/data/prebuild-1.7.xsd deleted file mode 100644 index c3f8d6bb67..0000000000 --- a/Prebuild/src/data/prebuild-1.7.xsd +++ /dev/null @@ -1,331 +0,0 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/tests/Makefile b/Prebuild/tests/Makefile deleted file mode 100644 index 4a8ddf459d..0000000000 --- a/Prebuild/tests/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# -# Executable -# - -# Executables -PREBUILD = mono ../src/bin/Release/prebuild.exe /target makefile - -# Files -PREBUILDS = $(wildcard *.prebuild) -RESULTS = $(PREBUILDS:prebuild=results) -TESTS = $(PREBUILDS:prebuild=test) - -all: $(TESTS) - -clean: - rm -f *~ *.log - rm -f $(RESULTS) - -%.test: %.prebuild - $(PREBUILD) /log $*.log /file $*.prebuild /ppi $*.results >& /dev/null - if ! cmp $*.expected $*.results; then \ - echo $*.prebuild failed; \ - false; \ - fi diff --git a/Prebuild/tests/README.txt b/Prebuild/tests/README.txt deleted file mode 100644 index 2c2de3bc50..0000000000 --- a/Prebuild/tests/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -There are some tests that are run via a Makfile in this -directory. They haven't been included in any form of unit tests, but -they are there to help test the functionality in some what. Simply -build prebuild (so there is a src/bin/Release/prebuild.exe) and type -`make` in this directory. Everything should pass without errors. diff --git a/Prebuild/tests/include-001.expected b/Prebuild/tests/include-001.expected deleted file mode 100644 index 26374b5bc7..0000000000 --- a/Prebuild/tests/include-001.expected +++ /dev/null @@ -1,46 +0,0 @@ - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - TRACE - bin/Release - true - false - - - - - - DEBUG;TRACE - false - bin/Debug - true - Prebuild.snk - 1595 - - - - - TRACE - bin/Release - true - false - Prebuild.snk - 1595 - - - - - - - - - diff --git a/Prebuild/tests/include-001.include b/Prebuild/tests/include-001.include deleted file mode 100644 index 7f75962a7a..0000000000 --- a/Prebuild/tests/include-001.include +++ /dev/null @@ -1,33 +0,0 @@ - - - - DEBUG;TRACE - false - bin/Debug - true - Prebuild.snk - 1595 - - - - - TRACE - bin/Release - true - false - Prebuild.snk - 1595 - - - - - - - diff --git a/Prebuild/tests/include-001.prebuild b/Prebuild/tests/include-001.prebuild deleted file mode 100644 index 8047008951..0000000000 --- a/Prebuild/tests/include-001.prebuild +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - TRACE - bin/Release - true - false - - - - - diff --git a/Prebuild/tests/include-002-2.include b/Prebuild/tests/include-002-2.include deleted file mode 100644 index 661b7f3b06..0000000000 --- a/Prebuild/tests/include-002-2.include +++ /dev/null @@ -1,8 +0,0 @@ - - - DEBUG;TRACE - false - bin/Debug - true - - diff --git a/Prebuild/tests/include-002.expected b/Prebuild/tests/include-002.expected deleted file mode 100644 index 9849658b1e..0000000000 --- a/Prebuild/tests/include-002.expected +++ /dev/null @@ -1,26 +0,0 @@ - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - - - - - diff --git a/Prebuild/tests/include-002.include b/Prebuild/tests/include-002.include deleted file mode 100644 index 64f4058dc0..0000000000 --- a/Prebuild/tests/include-002.include +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/Prebuild/tests/include-002.prebuild b/Prebuild/tests/include-002.prebuild deleted file mode 100644 index 9e85f20f54..0000000000 --- a/Prebuild/tests/include-002.prebuild +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe index eb4c224ac5412c827ee19ee93fa217eb73f0823e..ad84b98edf60ebbf4fec7fec73c36ebc14c07071 100755 GIT binary patch literal 227840 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

cR}U4@l&a-Riq};ZDsPZhfbh@PYoZc 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 z

}3ggtuOAJ&?BSs}#3gt$C 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

>`4 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 literal 237568 zcmeFad3-JFb z{`CBgVQSBNep9h2=Xr<2*%AXiWdwIG?z4njucYpF!?ys0fBn0kaNymaOnWJBi;t=Y zfBaRK!R5CTy8DR_y7zZS;Mj3p%4@-Q-5DuwMhsoMtJm|$LG+iyzkTHMyhSUIdH+iM zD-W{yI^6K>phy-EUla@nM*&pc;8F9vg0J(p1;w=}IOe1ph{CG}&msfw;xTwzO7OdX z?@HiZ3A`(TcO~$y1m2avyApU;0`E%TT?xD^fp;bF|33-rF7s;sWNzwv&ED4cHF*c~ zKaYPy&&zyqMU!{Q&Yrh>FH>Y-YyG<^KmCs%+485Qqb}~-Zsy^aY`O9E``vNQz0aO{ z%0W}6oV8|`kPj2CD_|%T4fAPpo zKDcVhYcHMolTR#t@r|!0x={5p{e7OF8Wmr^=hfl(2^{f_ z#X(389r2CD!35#ph|j@+tnkyEz!4ufsU=zOCM#G!fXNlgsUH-@DGd2Rk2ob=KbS90 zA@6sO3I)H?>3Ic;Z+J4_(TspbSYm2B# zl~)LD$<(F-?0z%d^=4DKxzs$6@p1*PI?2lf^PrNeOe2`wtXV>ljbzD2?Rg?k2^J9A zeF4&GDrZWWE<jYt_rcdy^V+ zdc6(z^OkIe*Y_rSAGyMtBt;ioQr}7#<#q4k|NG&##FObRFM}d3U$}HfO*TtPH z7rk6?Bgxff1H}CU+>p7K(ApdW`neO_?RzWy3T#KAyC?)(R0R1DkaX=jD3n_|THfrU zz?y1vp;enFKbGp(zzP%nrsICvaW|)g(uEE$%YlTk&eKqeEK2zsPG~+IWA5X)uXWtN zjNE<&%T|UuBh^Mqp$%C~Z4OD`IRa0*b}6Z?S}ZkNGo*P**RBvA`p8^szDDyYc==j| zPal;l3M#h_oOPow5GmD@^fkXJG0N^N2D%?00tUb=R9 zB)VMicZGb)fvlU2>O`_|KPf6WS-81is|Y(69EKZif8?~33k*nWz>fu0YJd?ndL(Kp zFF9xnav_=uA{Q(N5DMYbQJ~gNm&SJ`$hPsR`8diUxJ|N_-Y9@{DP1W!e16A?kSc@` z#-uTippcbgA~Z|)Lr&m#qrf^ErWtm}WxqRR|630)sv^gzqs#>ute{(9uMudk+U!B0Mxn=Ne2W?KPOEQ7B6G0)h+s8-yfrB=uEu?0p zy{Q1SxTR7??cks{-cCC>DvF#7E{ohKv#TV}RcTa{2Ir&9Iwn;Ximw^5ekVfA1+U{S zHP>ePv1;CQQXME&`w7%SEb0A1)q4azy&EQd-O8n+FEhE|BB7I6Ywz+LXmn$D3d35* z;;zT54tgZJ4$OsGpb!4%w=07JwoC=50@A+J>J*9ALwLyOG@_kuqV)n^wUu;qS^xw% zC4iU)L`=XmkW-M;^u-+;x6S3r@7!+e1=>pTgyOj6@wf<44v2Eg!&T7 z04fTNGnt^Uup{A}7Ij-gt7Q<>h?}lbu4hqg3Eb8gRu+QONLL3xh7m#!*3fdkl%E{y zhYpB+2-Gk;UUgmsDdoHO2QD3FDStrs0ZKS3AIVtoV}8P%#(7a;QsGRAU2po1_KEwB zzX>I)U+0x$_jb7J##4tx!QPtAQZcNAxl%Fgin77^;Fz(W4&ug+(=H!N_j3{5T<|b% zKV4zWX$MEip-6S(F*AI_!5_iT6xO3xOW-fU|7YOzSrLADNy^(5STl9ZOPN7VF+0%W1$!X> z;q|C=XZSAopa`5YBgGQ|n5O+-6zj)v9s0pKXqGrHjCTbQtny9rJwlg|i ztNaDt%jsNj6|77%vrZ|Rj+Ay;2(CL4;gk|7>+CKS&+fpOYI{NLOp8E}KrsV$SDp($j#_ZM4(;i`rWrSN82n!wOr zl!7app@na&SX}WuH=cOz93!4YxwThMU?ib+KPtEFrc9XOW;3T5lw9S43*J7mj9DUO za2~~P``E_HAR&;UcPNll?Qu#zR52^y^D+1|b&32-pczb+s#8lPGm^@ORW@%24Fu?@ zKx)WOVYf7q?s97@gceKG1KdY}hka^!NwYT$E*(#@A1h7^`?1!1SITrTdDDp*<5W#Obqc zfsV1!WlWlugM=bWSG$=6Mx9WL=jST4Na@_urqzfU@)@dO+Eha{iPUd_=1_4HcA@=E zbjLm=Sh?O5$Mhw>cLI6NOP&+sk}tum9ham=Wh@Z(`!9+m8L$GYCEJwyBG{}>-sC(`^E`4AgE!#0oViT(Lr zWMBqaW#n`saP&8Iqi1pDRjN)Qcu<72iRL#`+mvrhu7>HiFfcvSRofg#&!R=`p>wfL zU#d-AW$Y{iMeMa=t;0xN_JS86l+m$-1zMx>^d)I;JD7nd`1!T)<7*F3vcxQqEh4eB{EoVEjl`UW@*a28&Ij({?_)Bs{1)Pu6bh2GE(X$di(~{Ep z@<1j>6%)=Sor6hdFQFhdYHGMlod;66DosP!F`UjN**=?07zD3t%c+oOCf~1hPe$k^ziImR6!mn*=Eow07LhTch*ld~t4kP| z$znr+Dlcmdew?jhwz4H5GAx$jZ1%D(Yvy|3GmB=O0?@Z<0IB3sL1#-9{SwvxHgEZE zrv6L)It3nDg$LUXTXGHO2L{}5exL?DGd0L8Y%@zDFvvg5$HdEf!6itySY`O8UoQ(U zQpXOV$+T%5yP1GOaJvMjYnM?$9jja$O+tgeEx}AJ<0XjT5kRWkT5`j^h@jOUL6N3w zFCaFv0FiSRAo46g}^1-iWgq>!>;L%cjU#Z3P(P=M0fvqSvTZ2Qo zCN_#PBZzJ2RkSOV?naujbT8HELA#>k=rxXxV2N?$EhQ?4t}JEBnS8K2VI?sLDMud3 z>IgtAIj5T;NXtZafqd{11k5laALQ2w-DJnHrB!=ELs}ML%m*t~%2u#jg!2=}fHd&L zSnE+f*f64;5B3xHR!AON=Q-|c9rsrq_fNz(-c;>Dq-aMyu9>@i@KFW= zi2-7sWO{nyB)4(gr{ON;&G2w*!_fs2tf}RLOB~euaA#{4>1TK{q33l6Yfi5cd_tOe zZ1c3Sc5(t^1F#Kzj}sW1ux;RtPGD>jwt?Sq0%Ie+4g8xE7+c?M;Ci#9TI=e8h3un{ zcoE5hPX&yeG+VJj-UePJaY}j7Cy`8k22727W_3)ppIL9Qk=_slY2%?3XU>k3h>hqL zJFWuxU{eso>T{UmzRYpE`1d*Rr*Vh*XkarBd3g)8bd7;jl%JkCal{>Pn-vM=E~MwK zkXcbhpmA2G^1&ev-6XanEm(4LLQ<8E>`I*4-sfw9xicsNMeuSp)soAAs>9( zA(Wq+5K=xE01)ytCeSUfQzfQ0z*3I+XD*tAiB6mSPo4fxXzR=eS4AXXDsqo!%yjjC zXtMK`A8nNLH7Mot`OoTmVqS1EevH8$R_=stZi?@DzeEMSQ8$k`5!{D?Eu;SuMK6Cc zjz1GzY-dr#i;kL);bw%os>b|j2o1@4wjsWZZc@1=YrP0Bm|>-Ya*w&uPvv!;1Fn- zI++VbB6l5QTO=84XimF~$f3C`9*NkF%oYDv*3Q%;5hE(2*tC@yyvG!#Yb9~zBn#Hk zjWTR-Y+bqF*TP)_=2pLAwGvv)7-L|1%?0!3hq4W$*fR}0aF8l`kV&izW4$f{A?+3uwq20UqtZR9D5VjxiP(O&BVLNb{3MchL zY-cEDLpwv(v}V_!5Ld8*oyQy7!EMlF0+FP7FJdz`_?8?r#df{gYKVkwAZpVgO}7=a zR=e`Cf+~7`R(gI^i`j3YvyC-tX5@`t!4e>)BU6wZ^=Cr8!tmeD#rN|1PB%x<#3pbI z@U_?kMCHKbi!wZEU=E-ZU~p~Ia3K=&u+W>eOKcDL_j$k|^l$Kxv<1wmSX;n4W@B7` zwBHZIhm<+ua`x$okBo(T0koR$ey%n<*}UUDrc*UnJQ(kY(;Y& z1%5tL*?|~!(Pos>Yo@bC4a=ynQYPa0+sr@GOp8lKUTF^liYM~&r(duswX=}v3QmRW z>P&YqqTeaONA){3xJep+K%L*@<-b1sKhk!X;%~h$gQ5Qi*Xv}`6jfs6Hye>FKN(3J=SMPVLIS! zGXBYTilp0F@G8$hyO5dT*ZwSRp{tmwt-%p|iJaCxOXkQqArX7QS0ZQSU_lQ4 z8UcdM`@>uWcg4=8Y6RUSc0Ln3hZjZ&FT~Ex2STV#=&A@1loln!L=UCBPr)h%KWvPj zkHWQr8_D{$=MZ`A5V)=#%1_suKJv$+bO3uol0l};I#A4?he>WT6&fP#+~~DVqt~*A zeo~b|_XV^0*Mv$NK}i<+|I_o^GNU-t?7F7=PW$Omdfc?%mL5f8r2Xbmlri4sQ52u6 zf2|IXIBL+X(+xtT5nQMx;7rCvmk4zW_eGBwUE+@j{or>Z!ENDJF=9QW`ob_r{pQ=!iF}750ZG*`gZDRx_mTnGSm23eo)aaNC(n5~q>yMyn(2g{w zbnQI=uwD)y$G0WpkC5YZ?dLF(&KbPg@q$64k~&9S@OqS=;2+Sgoj_P2!zLffzdgl# zYFz-TQ;XGfN|mMRH*)6nYCN^Tk^!HsU8%~665k)8h|+$hb`n16hcFbwhD_?ne>#;m zK5tEPpKk7k7g>uC%j?q3y=LkO_TaR4I}SvP3{DoR`difB7BAI(0ZKzBZe2aSSF?Kx z%PpI&y2|;%yP;HKHb-ZeH=FyUPYC)JlRw74g@I`qwCuW9U`uuTjur!K#;ktkN`hC3T(F{^hC8y3OQvRcj6}zv*i3oQd9M%` z%+F!wWbZiR!f4gVBk?eNXjmpLlRAn?lw3K3`8I=XpT^>Q)0+-h*)&N?mGy|GOD;EV z853O%Y<66(QCTvI(y~mOvTSChqk43yxs+k-m2F&*F1WrRWrDVjmvxGf=8#JiCF~+} z)>BH&Ds+i*VR)24+u;Y{l@5#c8tf`X8nq9~RY!ZxDF#l5q=LP}&|=nZk(05YhHjq9 zOxZu1Ibe#}1=k`>yiZDpu|}rVHlqNBeN0S$kE-y-^DRD9XmnSA=PHF8#{oh3igI$E-|5ApGG zl@Ifg%<0tS%#Yw}t)_GKcm-`g>wS-QIZtJx*`T>o;FxO8wlSp&H4k#I!Rst)|J9IWRM?EK9>2oO1+PMJnX?fvQrL5yL>E&Ks zuZez9+Uwy>^FJ20*Q~b+7>XJ_ECp!wFjee4h_&P@ALpaBh2G>nOh2APMwRmgs4cih zTQFmFrXl*| z#?UUkgz2JJ&3Ssns^C2i|4o$(1^FWRxtJf@d26y6&62ipXPawV){G`3yTxkOnDvT& zR>^nElmG!|HHj(47qpOY*!rwO&cP(MlB7Q=jVVXmwQ$V|9OpNWsC9nB<~09~|kpPl(*r$?RB1 zBeH~7Y6-icfsc7PWk-9Kyb`C_MNjCi>c2=%v|BE7sA=LnR7@V&C(UHFc9|tHP*AVw zUK=p*5a_1EYpcGeqs?@97|&%v+?9i=iy>qaszxq2Q!=NuQH40gFrW=ergt=_1_}O@ zM%EVfcLS?vWNpdLPR37W|HL1f-hZ^O{hZXvmykt8>ZCC&1?Q5yu{f#Z^{2o_jqN1q z;ZGodVm9~>kW@ul*_$iIOsSWriA zMq>j+VP$c-x6L#0TKb8=3nGjE)4dwa-d*%O3nX2YY2&>b($gQpyh%11+HD*RgUwNg zX!pgwnV zoAJuj7GoDeF)OzJKzvr3Et#CcRD@qJB5YiCY$VoF%E+pb%oe2V=0|0huUdo#gsc18 zf~kBONlTePLgRBjcHTgy&(v10+M4isYo1xG3V0wX*p;%6v9<{#%l$^pt|Uv)3KrIVdtz$d+2`Al;Q~fU_akq!5RO zGf8*P%Cf;PQ&6R4&Zg!zk7J)tP(Zb>@S_uq%C#{wLuU~Ii-mISAS(amNp9S7dvGZE z(Y=4=5`XR5glgA8t=yh1wVOB{44yl5m}l%UrAeg@n+b1Cxm@;2Wn=JE`=uT>7mh1J z1?dcJW|rxenT4GVOB+TqE^Qbt?7(n*CTws}R?16*W|vfFn3+zSg>1>XI!c|vu~PXy z<79t7={maAfLGqAv{6@S((2Mi<;f02GbzBX;nl)pH~UCEj-tykh2Wg1fTi@xQ%YT> zDZ@92b84x(G_^FjcB6Qvd8KK!n{d@`7VolZZ&*ghp>WI7gDas^nqK=Xp~evGNMztg zEPGBY4yfNE)Nd8)GlDy!Vwzc+S(>4{G|TIh*3o^MVJ$4<{~Y+;wa-h`+xThm*0lF| z!Bdi{xO7TWBD;oGb^Ivp0;Z(tAPeW#6edm8aBoWWoz?@pudUPUYa1#Jbsw-zisGSk zWuu-<#=YvIQo7V>>V9=La~6Gh0$$@q4i=Zd}-Bs${YzDoTzGbm3syclvK^O zwNj5cK+#+3)o#9WyAYezS)OgCbru{=#zjJCHJ$Q>VLH-5arx!h-XQvrrC*unm*^e$nq>-ajtQDuG7fF33pXTxy&LwPq`9!^WMMhxdd4PIl$Lw5t)WpbA z?|~R-FU=ch0YN%?#38-BsDT}%VOol2Y_yKZth3aKR*JAy3hmZknq-^2RcE2s(E!;o z6irp4`WT+#q-?;XVA^`&7{*oN8+aur$ZEVuS%=i34j|Ol32k^pA43Hh5?gc?NZ3A? z*M(^@QI-92U(gRrrOr~HDk1x+d{N{xp9$CeFtIg=aPS!U3+(FU*-Oc1SDA8o)yTf|AJ38FD2OftF1L|e?}!w9xCg6$B&){S5% zhOk@&Ixhs}2eK-XYIATKFoS>{EHYXkhr0-{)`@IvwIJXXHy|=w5HPSTjA8D3nPMzF zQbKe6tR3VWBS@lsRlO2xxGvVhHWS;J1FZ%hSP&9WgLCkidMdX>RQkQ;&!DCF`wz4} zwo~tGe9L@Kq(_tPe+vEw`MzMoaq6((8w9S4`%io&UijBW556;=1NqAImT3Hg9)7H` z-pBZ|Xcob5z%TK?$=6M{6}pT0zezet|L%;ZhL`X1JwoVOJ}=7~ejebfMk>OlFDZD3 zGF)1O9=3zi;3e`NydeU34fS8h4EG{lOjFX%WS}lq<1QJ4ydWcYy~`+L#?-Ha?`1Ll zQ981%*hs#DG%`VILt9X0(^@vj0x*`bwAwH9EUvMw(D@ha-ZpnIogJKnpinq)%XrWP z<@BzEg(zPcbsL|(=zs-*AuYRXFq6d0ZfaN)Ye}vvdC$S(kUgzOcFt~Mgp{*H(`p{g zQAl85Gs&z_G)E?aO(B$sv0NxGhvNk0*&;`;x_N`x^{h=qK*d4F%W@}~eZgFjkWK7o z6(*hitXZ>*N6fWd!G7>2hn&Zh1HdU-7IMIOOko0?77UxXl{-j1EYs69^YOlV8FiZ$ zCfK^7Wl)`7)^?`Czm7k%!A0O2(Ra7np{}{@q*&dJ1rO%f%#l6W=_$G9W-&H~R@=O6 zpu>c%2xe7OcdOVfeJq#kOAt!WhFzY9@rpTO`)m+-DXe*pKpPC(% zEs+sn={Gf64W0>LsShp(_@@WoA@4Yx`r!?Je65VUt;!GC z33;g_G9Ei>HOiWkL{j}0y^ZEW`8ZdJRgX>F-y!QUu{~p~uGo+=dk(P}@w>QVt3|8> zsoLRHA5u*(V8(4P(6Sqi1?sf$Iu_R-heb^PdWnR@o&;lmle(&EsV>29tSv!v_+@N% zmq2yWV3=KdM25Opux-%P|2U&k`CZ{|Qpb5VU|)&s+*Xs(CGg*~anC}v;yF!ejx_8l z%T~s0BiXxaZ8@k*_{_S5)1_vyIW*AzdwB_cx*hyU1gDWySw@ao z9}0}cX>A1_Tb#1hgU8iM-Dstav%xVWYDzjAoQ!)6w>hnjvVG5-fi=pw>Q@up&A{b| zb>hCJ_Ejm2tobBHaTLoC3rV8Ih8=dU!fi)(&*5}>jBGG{qbO`IoNky+C%6iDn6vw0 z^xxK@2a|^)QXAkLOUldkjdi>kW>2EU}Iom77h@%>Ccia|c>Y0dIN=zBQAI7`A*sAw z=asp$n!SaD9Fi)SL8ZMDM4*Wag5nhF4@m`^lVm)fkku}oQOK65iRKgx+Ge3W%mt~X z<}y}RXZgB3soKYJTspCWZ0(aFr=1@PYfMqPRg!dNVCjmrz#n0V$CYo`JEI|x)JQfMg^h{w^2n%2QR)hC%Se!+$YiC*+{whAs9?(G=qavF zO3X*Y@%tQ+hRfc-m&O)um@veaLClJOrnOR{Mt^ECCK&q4 z_zWd#9a|G&Fjo9{wvM=!JCgwfF~G^xg%K2#J6zABuIJ^*BL%IO*qDNjE?qSR5M;KX zsZQg^RN1JhGSGBuWuC^E%t5Wbac&X`a!ljwWq)hXOCq)j&mDN|ZW^sLgg*($o~y_ACO&%&BfiCp(^qql+A1@U-ihxwAv{0M~P)>v_cWBr03eE)Idkt|w9R67_gL7wyxo z=f|!mk`~ zaeMcOfx$}G^N{Q5+S5VX-Ss3yd8`}KFu&)z7@v1M5l4&na*{gD_1x=v8dC4x+ljl{ z@kG>r=m3M?xt_v4PTcKX&snbL2G{ci#}g(IeuMUX9fC4+wOveN7+764e)q~rJS}Sk+}8mHC%K-RT+f}ZC%0diAClVJ^?cv;^zZMW zUFdoeq+JdSuj36bNG)DHs2c^&bwv3I#(#DwK2Y>hOaTsN4#b!moM;gL*jT~!FK=nm zHJ4q%Wh~;|$A5Qjwj1O64S_Kijn+P7Zn+^p@8Nq5-*C<*@CU$4@&CJc!nG2Cx2HUB zFTO|db>Y|J-vjuob?_~qu^q6FVO4hN{{g?uMK@xu>e6|bsmXT0J6e+PN5G%TJoHz< zT{>94y$!(UuJVYEoH_jw%r22Rr*HP6Jx?L(z`AlLrg^R7-sGSd{u9T2 z(!nwO?~dE0dEy~4PT|nl?c$u^z?%+>aX#U=2M&+nUw7OG91+9++i@3;jN$E$+f8?w z1K-nepY6CGcie9}ZkNv1N5yG<%5g6~I);DDaqoOg3}5BA|KhkeIX1?*#&H+k6T{DS z+~0HD3y+I&KJ2)Aj*sCVaopc@+;2GUM^A|HZ#yw`v*k+;#IR#Cn+>O=tjDrQDs6E& z|Ifm~t0lUQidWBRZOfN+RXGt5fB;hhyJ?*qt;_3voEuWoSWTzTRqOQGkM(?iJAo;j$XP%~aoI9ZHlef-*M5-NA0 zL$bBI`E3c0eaPPHEj17e9r}ltp=a`y<;}%r1A?*j}t28yqOfYzY>lClm5@AjRs=ac0a0 z7y@T_nclOYuiI%1@T+FfyR)%M2V0}ui z%y%yTDMMLY^{VTo(%jEc-B3P|EmQ|^kSTc{pcwpuSpZ*^DBBhm+O+Bl)p7(k=*Xb3iEhz%@wplGs)&SDpACb^9iDT~) zWuNFIx#6U}MpnN|tTR%2_Lh;CQnU}JS*(2{ELAN9{VjHJaGnH{8V#a_hWH@9godZMJ!J9yi=})ewKlo7zFQv=vrS_g#i)Qe< ziP={@3%JxO>a&N@52&-PbL zv1hS@aN{;8<#H}tVY#AE&a-sKwU);sT2ikvea-5@mU1CmF6K&wQnB(L6Xva%SLRN+ zR&(?#STi0M9MLSdaek{UyxVuSf6e{=yv-z4+7DXT+|Q9(n3sc3utr_v5+4o?mrd@? zO-SLPWbox4jE|>v4i~o}xriO%?tN<5hPu1EhF^o%!tkTyjB7X^|az z&+7={8|;M~D@Q-Xvy$G1Q|^P$FjJ#8%58ClnMUHIG4z&HL|PglPY@zUVmIP>JR}iZ zLE5Tp26n*r+0Zw1ur#^W;0qBz9z+2kb{EATVxA>{uSXcWLUB;;e?JoiLo2TRn6zq7 zN`l-=bjQ2GzH#XYtjgN!>jM^Q$M2bu+K7Q~iz<^uUTHxib}K_@~5{%~X2x ziGrulHoyb)Gs1MXX_?MV?e4BU1913RiIr!O!LaF7xr~^bcTb`y>x!rweRn95^GBpF z&lvnn?R79SwZHRwm~SOlIUZlPsSXlLZo4tDUQJ2Q$XA1?5`b#C*5&3_me%-v1uKn7Q8|q|Ne^NkUDgPmo4(h?w6<@-J z9)10-x2$gD^kJ!phL*cHzDvy-gjX*W#4SSZbwE5{AS~5o15O}qJ*H4dIgly)>y;5) z=k;;IC5v(=z_*YZL;v3Z;($F=cxbZnTYLz&TtxhX=ZRd4r53KX2`VdDO{?r9!TGG2 zaG*hAb}Uu7CXIoBX;;;)5wB^m^m^K0L$n26uq_lpRg$IVWJ{%<+m+XJ4rN4u3gob`Oi%pwXW%AXI_LGhdVG5;v5S z>*^kwWxXQd-{yTR>jR(h`nL>DA@6#U@GQ~9{i!86kA0Q;XD24>0gt8`BjOwP5#Hcj zq4o`W=fq3A8fOhbf&TnST$`Q7&$j%GeYjWA_myz{IaFMqkGx-(IE|AiG7!_(eS_OQ zTxcunZGZ2$aaIr%=+BwBIy>vx;q>+Y(YwG5`TuX<1(vzSVoG`=ZO@G5GkRX^G{){e zmwizmGV1PpGsVp5MQ(369T3`pxslARslDEi#?`Y^et2q%OTaqKaVlTObo#VIOZ9Lj z*-ub4%%flF>Kt^~0vf1o4Hk(`tbl_5hij&XkB-oS4UTh{O!&Bg znSU?ymL8|a3bgE&V<5wRAT~0oTJGD&oW%^E)N1hdv4bsR)3^Kfu@>YD(vRqQf#iM2 z@-XiAscF8P*2zp;lnrispSOa;BwyuY*4uNzed3-?k|4j}xU27%h&3TS$Ape51XUA3 z9tM&&??Cl-^frD8+3Zf7YK8?OgBBhhK0Qt|cSh{K#c?kh5!&wC$Y%oyIsKO7_CFw) zdfmEmn%HzYtGXA*EVb;*)HT`D#8}fDjMmvybm%~MlZP^QhMa>G=KdkTCUx1yJIie1 zk~r6~iEEbG#5KD#o7y6$ZrQ{&JG89kg09gpZZ0_6alh)g4?Z)-xdt~E35jmQ&}ZIa z4%$D6_K;H$dUaLERwqy^;zhhlnLHv;ElycQt8*W7&IS8wjEkjp*n+)7A(uN4|16=Z zH~TA2y7n1Dqsw(9gPn+KcSVyRLkiGpKw%+0?zp`Vh45tY3=T0ePnJ+F=o93vOs(4y zw|!#4vin~Okx~re_X=#-+z*F^7mRsH_=Gqte#*ec`wd|s+m(;R?h|m^oABd@3v8VG z<1l%&Fn-+F+qImIpzBcU4I4pk9!iIe> z4vU{`uwnkkBAQ1P>qO(!C8r?{-DysGPuLcRe^0IAB8Wf8r?5@a|k9Q zmm$doFR9A=sb-F$Kx%%A+_oieMKZuHa56nxds*Bbu?K{#;CvO+@tpcMaMveKrjjue zFeh*341SEBEl!s1%`v2Jy+?!gU_UUIbx^7bL$T<~gy z<7Qy!c-bG{AP-&VhIz;ZZhp`flJ~iT%v8OOxw?Ur#}`aD$Rt&tmW+C~a^3_OD}_od zGmJScbA~;}oimqHm{`d2v3EjNFp5D%{Q6fT&mm3V6_en*%`-|mrSyn`^+${4;? zPwT5hu`uC1l@N-Abg+k;%6UFL*1U;&tR$0zr#5T+MH0WwhH*)VoTL(C9v2BtnzpE= zG-=ABY-!RAGqV?__ofPeS-5WNDz&*>*S~(83;wBSI&TR}X4j9$V!SkRa{}M)N0uVc zOQ6C;!ie7jxim>%c@AF0T{#WL!vc9NqBNGPL(d0!9m!?;*ueKkfoz>U3lFaZX&ow+ z!UY1Adf8^Cl*mk+0j^Bhk|bnGC^9+;8U4_qmJ152;(Tu#x$9Dy+#r=|m~>kr=?fzo zGOca56@ns*hGau!nT6$o&x2{IC#CCCy5=qHtznnY`w0bZ@@$eQhwoq;bn+BtYeOQe zi4wK~>*y+VB&tCqa6{Fr9#6F0FNpK+%3@UnFVzz&mrLcYQrV?l?z9r>)VtlaSRJvD zj=ay@Ah()7Z}0;$ERm|FP5l&n*j=^D6f=Svk;{{jXIs?XhPD@^gcJ+)QtT>oL{Qp4 z@p61ZaV_+!nNk-M{;t5gP{fSKTnl^x!nYSCN_F|ESLN2sHje+v6usd_bjX{s)NmZy~_bCJyU&MjopJ~g(4c9yvfip!D)e$lwPmHKenBq{6RZrTH-6k=ZYmGBy zx&8+EsZGSRW+0~I;2|gCof+1*t)kM9>K-OO5K|N|a~Ex@!qYN|Zgh*K5#y#D620KA z05_s9fvZ?-wNJ|vJYoGyDD0sR{zIQFnowsa`<)j_o4(;bQZ=t2vT_*dKzGVlxF~LI zOC9&Yj{6+P9gn?ob#Ei}#8aQ1aO%_Gp?8^-e%T@DGBe&>aPy0qi|U2G(VXQ10VSrV zKL-+O`He4$-7&`$ReTI`R&}HLX~%~o)>a4#7O%(czU-C@;zyb`bk-sGD+Jpwc;8CUWyv+3GTpBISv254nOE<>)oPD+? zVeZMXaG6V(dmK8$NjhdHNJPiabX7(mOzJr^!^dLE0hpPkoEa~n`=y!-lqI~dnv?vK zv@~OFa*}7n<@1V-ll)6e6zvM5WP@v5h!-cH%2v+!my-WcqvRKoyj(&WOY!<-?sGNv z61mCi?XK@M_jfEr7h*?Ok ze@q8QT!wN_ykF(kg2&cY3!o6cP>$!*kTXe}lx5rPS(e8b(HbfbMGp4H2B}=b!cX}V zA%VL3JuT#2%$Y1MGYQR9Mul{u-ah?~IF=NXuX5|{nWn0z!>aBUlxixkKYaTN+pg~6 zUB%aJ=XYB;Ci4V*L;QOYCi>0AKLn+*0q{%ty6~y!g(~o^`MU7m6aSO^KMQ!QN78y0 zc2m(K9w*zw_R-2qLkZo$^K~B<$?@7u##A9pgcYroa#{9TUYmk+)bd-aQcL#69-t*tIU^wDmAA-8>v?{BEj;&!@>@6*%Is)w;l-i* z9&i1ZjeAQH)3nl+4@x5a-(rK@$+Y!Jew~qGQd1qkJkv{A$=;{UD1*(%l)>QVXd;PX zV9eR4^|^XXxC|mX4^u?&QBpN!RBrBQu1hRyUiV`OwgBqWZx@AP;RT29@x2w{g&&b)D8~cd`h1^WiMF)P#X&*FrF=_Y1uDUTf5f zw1ICv7M9!Jz4^WJ+J>x2XY~w0m&iO-dz?DBux!4yCOk%cv#o(GH{67q)}=mE(!qjH zV!W3hgD*?TDC_=fs0xZ^+Gtw$rG~$ffI;lPP+DrU8qu1yNpVRXq0MR~t6)N;7Ab#Q z!spxJuNQi{LfWitsaXdC%{87U%!K5i=X+eW^d7OSanSOdq`e|KhG%IweU=K1hjm0OAmBcPm7fa&me0N)Vb$&`)^XmN6NvXPa zwK`v8uv75bZ5nU=H&STPkecgII$(`v~h;`8hNELEq5$1_PVlGZpU~%%2qZw?Nc%xmI0@kIcMk9UV#d`7hV;9v%xJO*zugb_l#9v zos>&w)#ls%46^f&cyNC((x+3-Z7j@9MRz+1Y)e@wYrw^&6OTA9v(7?yy8zS06|dr{Uv{T`g4%Y3$=p zd3TU5_D9l9n>{;St<@uPc@ks|KO`pk-VVlYhp~)fFG?kA7{d`$cS5)oHmxr%FHfG3 z&71e3gzjZ@eNl$l7+jq}>Kvg9o+eJ#NvuBNQ}EyH4Z}av>f~IuI4zt6qB2ru3doKq z>a10Psk-G79zjc)|uFqHpay?iTW46s>(9)^gyE33*(pI~;Y$beNG=u5y92;Aos6b>W$KoItNF zQ*43eSg=ag=I4p2%l2kkY0qJdc$Mo--z{hKP9)EH$+O)P&K`1hbtX>7&41jH}9zQ}r*Kjt`ykTUymeNN@f-piO)WY5Y8|1uvP4j+{Z zRah|_Kc9dNtJl}{X6YS`sfNr#YbNd;^?@+AK5U0BfhaXj0qh& z;v0*DNF5yUIXIRdgzeynZ!8YmX&fB!jm6m{fg`@LI7|f{I^r9P!<5Fs5#LxGhTIO0 z_#B*VjGVVf;E2z`v2tFXz!9H=W9374?4%{Wu{fw@2S{>fnfPEDo$YIO20~ zEI->OaKtwjXS)QB_#7O|58aHDmiWfvu%zkWh;J;;jtLy`jm6n1fg?T#$L4G21djL| z99yQlByhy%;Mjcan!pjC;-tKD(FKUBHJL*!vRPPWIPC79k?Xp0rQo)nDdh4srsup{2~!2q zwC68MY28RFQLbh0rOfWlpMBwX88Q87qf%KdMCuzu{VTi`qf)IbR7%}CrEvXV4?z%_ z`Mq*JbW}uR9{Yu(;n!hebT>eZw#`_AZb0TyB~O{I-Ri|5+jPO@773U3N zUv^&G=RkBUf=ZHc3i>Q1r?@z*xo~>sG#Yf%!g6M%eDy4dnRPHfVN}dc58l?avySAv zW<+>P$#!#2f(=YUNgBYL0Q!_?nQI?Gnp8o{^Sol^ErK~xAmWa4kn+}S)`0&^jVp%> z>B^rd6qzVW?;;C>h01qTwXfmCNJ_xZ==(cXhqrm#?<-xm%=J@Vz;{PUKhdYf?>N)t zvL;rju>wXv)@RM%MG>H+#!@}IEFoZCdais=6E-Gpy2r=YbQ}A2tBfN7#G^Fa&{EyOa-+p*Qm33qk>`$6wy2Ga zQd$lc&lCo`(<@{F?As<{*zh~Y+wTm+Z`i-tw!S+>X3qnfbAnV|=^OW`hg8%x5*@F&E%%44ywCGBZLE7wwd4 z#B@7+1N_5&a0qy#dr6>dn#zc#c!2Nd-hgOzVVQNPtSj>gvSsFbpm?ZOZU58<2F)5C z?jJVwX#)#2JAN|@Id}3HwGxrn(CsWCcZKlYQ;mARt#pjP#XS*%v+wic8 zUcPB{c8Uejfrg-|I^S5G)tBluap;HjlcJaUaB#>#2;axR53h&sYv6~}!}l}rL+j!D z8@LE1%6ALtFE#LEW4P}@RPrwMA)b0KH`8-7EiSSk;j@Ush7z4$l`)jHkyDQHRk#Aa zU`|z~D!(wTp_FDv3NL&;+Yt{PjH z3bjtbl+sn3!ENw{2RWo_lL-+M#Nhb=ttcKR6J`kZIKnWl%0E#KDr z5z5L(gq2l-5%M$kdFI=hn!6>BDSqg5!=&5?@ELg2KYv8(age_nm0x+5I-{mid&`6g z>me)w*sUILb3Neq^?=3K)X_M-9`INlp!N*8(Fj?_QYaB=E9j%z z67Y;B-QQF7Q($RkF~E$8VJ!o#)#<#?$@H|qi)=q8nB&0ut3^uC#sr~Uf6COHhdb%b zqH9n|)Qm@}UjII!ZJ^n^KjnEecF`Tu=FRC1_JVl-3jR!Fv1H)gG6y42jcLTV>|q;cD^vYgnL zZFB>jobSVi7~xTQ$d6sX6ojwkvb7Tda`lGly*HwHcNb+)oHvVHd~zR$j#SS zc989UbNTdngv^r=k;2pdh!6y&4-kp9my7JLRM`&C2gIc(Mm!JJi|1lTJQ}FtVcRd_ zX^F)X&+;Ta#Pb6YPm9+nXT@8Lgya$7X0v6Xk*h%`&s5(xgt= zT%D1_s;A9?pc$iRdIOwOT`4emK`?A{8q!Y0k~TQ8q>_xsKEQToBxkYG5LgC*TEF3% z)MX|hq2W#Llg&V;d85#@r@hGAR5gFHL9&}YskJIp%>ba( z-OYZO?kNDJCgC*ZP00=PO*^b33SCU;=erqVq3U^5Hhso!A>U5? z;U7Jgw*=4De5diHLE++#HGa|m9_mH!UOLahmqAP>U%T)P@rAy?*XMfz-zj|MPvCd) zb1B~)P!BT&X#XbhJqXwd{9lfHmE}|5*8=+j|HUnTGM2iCFP*RGspF{b3){{2!sDaG zPSoBBUTR^Rx!wU4z&|tT-i;2}JXMXEyXON}=VkwnHF5N*iG#VRlFfvp5{NZ>-NiLC z>Z}&PAN9JJ!gsT9=w;1)DU7ka!-cnT2Gyp^OX=h{VPu$<2K@mba*4uWyWih zX_ZBX=0BD0to(^OYDR!E)^DYZj*zgB0lhRRF|L=xgQ6AbK?lwxv!G)xklDC0r0_f~ zI`i!PWF`?Fu~qD7Qnp%hI?Bp9qmO3cTIMui8r@!SJGI;3n1#!)kv-;cesh5py?N5e zFyHrSV_UPmTyHLYI2%`_x_4=-s68hw9;VhT(w$j?FqMwtc>%vUjlEJP(o|HBg^7Bn zU`o0UEc+m&+TL@o*Gq!bMBG2~I&-1>k6tI$j5{lub>GgBDqnLm(cz@!`|+5v@@wJL zo(>l2B?5n=ft6qBCp~-<435%z(w)pPYcLVmo5Jb*kh&thwOP zp)`L+)~V%T`&7>xhcOgo^=SBKl7NWAm($b2*VzIQoxl`KDfbYsCX`2ya-ahd^k{(^ z)Qv)5F}twM++X4{u?{cZ+n3(yrlkQ<2GW8?kAX&*lU+h0*aq8jV{!tK@VWRpBGQ~? z;;397FI1!pAC(!FU-_lvPV|_pkM~emWTwQ${QiifEm}anjuy~|eqc@yD4I|^i&(R_ z?0^)Z1*egU2@4myv}$EdEn>(cn-wR*%!QaJL(v@~;)N_ji%@9=s2$~lOe>kG!M91# zt<;12QX5S?7L>zyNIi_Y$c$p-)dlQXqLxBZ8?3G)RU|O@5>W0vQz1TvJFINVN14cR zh*S#NTi*0^mI>kt^Ln13N=_t4=5PVEL_E@&F|SxyE~OVvibiWz$!aQ$44x)sIlAA> zQ5<&a;8WvLoUfr5q)A$CUI_Wr=qGu>ZzTdVP%c{ApI;fNS)F3#(Ay+!+YC*p73Sg; zaRk?0PtV&R3^0hSH&g2wTT|ehsILIqaxY zxcDgxgw~c}_uvZD-Gf^_)lx@FXA6^pz&;#X6>fl2yYrSi+Ig3KHKR4vbk(g5SHu&g zt8+Ruv)Dr`SHcbB2yHT~8?F#+weUKz{((H z=#NOS5dtIi?omk%=0iJ+r6EvD!_cNti5!LTIDPSvzN~#58Hy&dKE6)TkFEs6b~dNQ z&iBU7_r=cl$IjDZ=NYkc1g9z6CK)8i+bP16q#;9I?oo^PO)VrGl`7$quvt>TOvz}d zQ02v61Jp6WGzvPBm&7~P#1np;cwHLL05#r>`go{%Nl%y`6VCuO-d5CD+S8Hj_H8To+aeZ1lVelt1-sZ8;ID*M9`1N1igur`%LvP$hq1iqL_nw zG!E${MXq5W=CX{Qj5O9CBe*aSQy|tZ6G;RU!ZD)RGs8AeYDXAIMv{S2{9zy_x`?7w z#SqST%AST&iezi>OaziW4f(lJI$orNm;_wIlabjYhJium?9|d2&Sk^+n5{T8m*eJH+4kgn`_n$OUfEnT+D!C%n8$Y%5&n_3F)A_r z5&1Q_206;LKqc4mHMtg7v;rKC-z*PT5Z0(oM{tfvgbVHhGsP_~z?W(nC&B%@TEQre z8RVg^qH&{5_tSB@?=bHY(;t!Fv3VD$kuEGvK3=Pe0gEoRT#^V5GKU zRC417hYD0O;0I@mQ+V^Ijtc93<-If=$kf;M)dVKwrghyPxjux8y#pQRouc`Qigx@q zAQb%(`HhgHHXu;4VuE#DXH-FJ*6TB)L)*eHg?-b)b(valR%cBMr|AlBVt&@Wt}=U^ ze2}-^W{7Vyrb7}Kw`*Uf8}d#EWoX}XD+CWtV>xmY%BGmj)HdbYlF`%f1(t-oJQ2js ziPFWU_kEs5C}`C4}jzA^=llF0Hh{Nl(CMDmnDNJr-I(a#t99< z%~a@D%_5d%te9nM@XEAa{bp`$GnhHi%o*K?q=YkG9>kpt7syzF70Xr7wp0!kND4WV z!g3O}DG;sGgy~@vHHQLYansn3=?m;!Mur?R{?-W>lPe7UaTHr$-uYRWCD3oxI)2?^ z>bN-zv#`y4&8^|=;Y01$9gC4Q$}bYPMdC8exDw`S-Q=sa`aaegr{LlQjf{OWzP?IO z%tkjYVB}-Y$bELh79lvb9dpcUkZ6RpONjL$z*gVV8%Ni z0i9~<>?-nSp0`cM6)pH@m??X71^e0!w3pfoNY1Rdx(laWEm;-=vqA1A%y_e54EHkJ zhORy75u61?35S3$IOvDn97p|y!lJ)YmyfP zmy-71iDYg=N~QA^hJ)silex}e9pWcnZ1f<-7J!1r|11SmNM1k1BhR;lTx5ftB6qrW z5u_Kkn{Q}97Q>w|av+Qx1+EDVK8n+MT+`e{=DZKu4*J|%NoFgNpLslfv)G??FHy(_ z`x6ozC&6L`_-T4)29^{|an?h;mB{c3+U==~fd z*5`-A)(omMR!Ghz7@8Ih!07F*0jr|~namb1Mf8?vgrpWpz_5VvMK8|*Vn zBqm4Soa^_{w1wK%CZnrB4sMbd3LrmMfNYLwwpDjzu~iKTWfZO)O&|C1bK!nEf_nf` zE|wuH7ZtXdDV-qRLN?nb%4QuKi|W`w3QjT%=j^Oiv%tgPPEz0bx08C)N$TeR$)pyH z$<^G?$HHUqow348Way!PJ3}*PN2vtyZFm2Q?6ScYaBQz z(S_0^rqW>0ilIJ|%6=ZmCN$K5MhMy9f*#0P)%`ie!Y*M?@+FnYAj3q_0gd#D+-WwI z7u~CGTboq(viJO?^-{Ej;k8)C%SBru`wL*d`~^`?EI_!|RmGPk83iMoEgcm#w1*sx zUaOYc1=3;uPmSEkoL6_4AlvegeP1^Csb2{R< zFN@r89SwZS?bWS1+I8f^{-A7-{~{tZLl=9YzC70;7wVVvLj6*06HEq<&R3p2Na!d= zYW^4LA=}^V@|__}HaH!+cDqrspWZC$ryKOh;czpX4K5SLvSSl=x@NfXD5JUf9PD=f1x+{)xfaAW|acA$2ai%-&_c`uAi(AJ84YlA= zUkgbXEqGe&CpVFYYnvVSynDh(+2BUU{h;IC`Q8}k3dj9lj{6UeyZ`Gk{+#<__qC3D z(SOG9)sB0+Z^ZE19C!Zy7=F6r{-@(U|C=#R*SBK#wT`?0+cEqrj(foaG5l)BUHVQ8 zzsYgW{jV6lv*TVFxhZ(JdaQ~A*n6l4tVMC~rc1c1%$-i?mN4GX+uOXCc@OpIVE(gr zINDEzuJPDRr~95;Toy*sS{{sKs;1A}K`8^Wz3d9+%vT1x0ydU%;7KPf$ZpG*%5 z)kE2`scLd5187+SlQ@~$#|7mjVusT!4v9GAUSjHLcL=Z7sF3<+-(mE(Fa9jbKprt`~yeC!=Z>}j?&7> ztgi}EE?7ylV4aea*wJpcO>qTcBQZ~n-HsE<0q2Ru3<>hGN3(;k};HS>5Je2L@k|3L%~3uD_D z6nx5YzwEfT_+b<+xWREh>bN)gQH(Pt887$|!D?aTiN;@x`v}U?%v(2Q99EvxRc;^b zM)Q>>mD;al1Xs$OhEiy=A}EZ8w!nxsc;Kp1+8 zrCM)IGn$O?UQ|JMg1fLTU+uUT{y2ue*Kt4KxTifC$qQY-0M6Q z<7^qZCsw^i&t=R#MSnqm@GM&JWg?gIM!!0S;n-f6nAfp%5GVGIRBtXAQ(1FC=hI;> z;QT4kXrH2(%BAW79VNZBya40bZq z@JPCo7$dm!55zBY9^gBPulx!9ZBcrH|JAy&R0e{71oyANLw;nhG|PeJT%$Xri0_hN z?a1CGV=qN@FO5kxHj9T>#poF8Ht4h9kQ`(Efl@VtqH*40ws*lqW0>&iWVgmOcp{kz zI$3n?MO+hI)W$9oDQ{WIaBfI)GaZkk`r+BEIqc>2oo?=Idz)|Z-oTg;CSPPcXs>@s zT)V=i0~lP}wJSm-<{^HI_kV^5de47@hvYgd2lUK3D~GVDRfT?M8G2h;dfp9Sv>5$% z7p9YGEDh60uJP(l1hd9lx9)!<;!CW@QuU?&-82sT=5gSkt%uXTgwCz?a7+J|5T0Cf zJ{bN-g(p8aR-D3yU2~R{{oo9NN@9L+g*b(dKV?*sao3#xwRKpT=PZE1Vd33uZ8XcR z>{@h}Tjd6iL+o;^4eFunbP=^^0NKi3RGpTr_PasXQj9vXVq^m2B|+QIwr27gT;NRK zAi0yV{(PE61BxkK3?9hHI48V-WE0S3iFhEDtIjq~U6-|~$>L{aIjJ{Dt-7h4Mv>f^ z_10;iarUuSHnW?3L4A$F;Sg3?$!!kX9@^OJddutG9(5q=rySUmweSh$D2H-5?_T=} zqB2aF{ogWaoLG((>_nka%@JN^@C)xqc*4MZM|iD9cw^<1sqPP&h^fL(5?zKB4Jq*_ zd6{_wnLblpFxDr$-kPaq7(SO+eJ-Nd67|duM|MPidftQHU{ll7P=3b(VG3Tq{=B4q z{W-2njh2_^x(mkx-)88;=~$X(bUHSCO3muXA`d08!yjHdFHJ^1JgI>rDj*$c!0>Sh^~LCDtJPAX{LE~Ygoc%wEn5D2pcTBgva`)bA&|JKPNsy z;x5DHtBdN`uhjijIi8I&;hd=~ zT*eFz$hzQKxcf)M5khz|=JZRB`&q|*%Fkn*slN!_bt-YANF}~g73gZfdm3rL?V>cZ z!HDCIXYtwK(+>O*#~s^EU@Nl1WrIzB8RkRRqNHf;TGU-pNH*yHRfxq>h2#F29{xiQw;x><38-qF+BH|*nOMh-u;yr{#VC+ z#j7!V!Czzd-Hv;^|Bm7R?YJ-cTMU2LaW}md!lmPOsz=fsBBwL;bYtRv)Obu1u0>gU z$b*dKWNk^t#IF5;Ek_D}g|BO`=wXB=Yek3hb>Sb!FKbH=)WQFRU)GRz!!F|DcVZur zHKd35y6`saBnJXNj;{-U2LF!0` z!|NI0NIkJ|7^e{1G7@V-`;iZ0z&?*Qs}}WQwss_Lduc$nc9b+`<^^J`v{sm8EZs~Q zoGg@N187T5SC=?)tf{{sL#mGo_qoa}NSW(n^4xopcLuNdF{?}YU^J?xd9%`x4?6xH z*4%t>g5&;{{kl&|rNixNQS6bS)gqGM>nLG91ft6;s9^ zNv5>##kQnNQu*K;q?-uJ2d%G<0gV`t3^W_1YKZ2YR%z+GB|o&xY+9JG@bkgXNy>D` z`QVg)#_qVqN4z(`5eHxFxEr9(e=|nC!*Mr2-Q}$q^{0-z0qVAq7RozINcmvcYl`v^ zFBRp3c&Vs?tnxv;j*$=Ib&Pxv_mTM^?jswL7{`ELtRB}<9M^!~oHwfu&34t{ZOrz< ziP6^5%<_S2&o3H#zSO<*86gyt_WXui$M*cFY-4+V1d8qX5h%9j=f|_>XR0TM&BrLW zu?rage*RtazC9->`9EiEx~`!#lKq)JsU^gmL945z!v5?76WjOiryu(Ps^pTo{wYiU zb2{*|_`3ayPycbI!0Y-U2J}psJ@0axOM4u?0Hz z__({cigx$EVUOQWyD>YX6Vvjj$FGHl{r@c2v{F3N1^4VG#-~s|bi|p#`c?mX=LLDRh8p>6B^9 zB8%WdR73>fAs~vNA}T5>APOof6rLN1Y=Ugcs_Y^HD*1lrBzNXc7eMsA@B8CJC%wOu zO5t}L;Ny?2@`Gb4SMOz&-Wo85yh9EsnfU*BBfW?))JPu&829(4WmcB zyzKi7#=l+LFdgn2(B?;y_%C=0AZG7#~x zJ3eCbzQW#bkvAs5{&ipP2&%9^^LR<%>TaNU91dIHA;i(28+mvosSRpQpv{GP_tq@7 zZOXc)7}3UoaRvLY8zMX(h6^nS^&YVqf%guEdOxfK3yo*%q28f(BhNc9idKizCsB1H z;JJ?a$$F+naf^=s4cS&ppP^m}4mj=BLa9~P&mtAiibXPsZgQRxtjUS45+rqOq-8%o zl`Os>^!Bsx^)XPQQRkxs5(%}+49X(-WWcmeiRPEVM=Dc>=@uCRLvzVkWhgzUk|EUl znT1hky?{ar_2L{JUnP|A^xqE~>U|1TW>(*;zGt=YqQ3lNy{wKRp>Ks^ET0J}K@zHJ zFBM1mn=)Ecy2YX>Um+!3Z63U@q!us*I%JqCF~bt}!&-Eq6mtyq{_Ybo)bfQ^sCPO7 znc3KdXPaTZuw%Rbf?90V0bal!4^;d%@tEr@o?AnTvHi{BImcPd z^LiAq^>Z0j=p{-v)H@6TO}+0IT8zuH#08(o^!Mp>sCO50<_}eL78(ZmYu;K zm}&%m4p5?qj)Q@jwNT1FXER`FI5MFYz5_`lzM&}81_)(``Ef7Rs#-XJH@^ZS?prXu z!)GGMo$sAxsJFF`Gx`f(rO-CNa9Zq9QiYopXB+JwPxMR%=cZ(-;zBbOHNbr>e%7_H zdocHS0)Di{Wu+%zyrb`m@5W#2T;>7Ls)IHOKXcAPa|pT?>!I7fZ`xnfys~B8Hyu;X ziM1`K_j<%q%Vny*W6Hr&yTWo*s5T}@a=HedM)`mxCD7)BZy?RODLp(P9DGdLjq+$m88@AlrKw)Qe2|OZ(V7*!0GK*-)y%|?`YpM>c}eC?SX=ovf$zL z&OqcSz2M_F^K>J(>f*as7V0aXAWrYg4NL*4$(O!(;nzde6d!t*L~R4h zi%~eOJBSuD+J=Cuz^+IP!Z_KVhIOJI1QEOPqr+mN!`rOIV^mmF_+0E(iwVaky;VHT z5t`Ro;yd7}aTPz2=5I{INJ1Ouz>N+T4XWbFL&$O>fo`D3EV_KKryYHg5Rs5rF(SS_ zJ@Nqnai~J|jRm&BI5)0X{m23ggcYD2EBKvjnV+-T24>-(;+({MzGFz#FH8s(dd9$hU1YHoal7 zNlByxqIowZm~YKb)2q%8q8H23+Oo2Q1LQeNNdFQ_qCSaMGE-@kDL&7Yq`DUwI)cFT z?kF)LD#Ut>G5Motqe3{VIE*QE7sA~R+FblK>43DaT%wZhYDcNBMdC`?PDRk zxemis5O8vl-J24EwS-$*Ll^%<7Q)owS>B(#nh?IJJ(%gU)4EdF`{1Zk*iIqB%j6wl z4fH@6fyxy>XpR;n1I~$K@oHNRo5OCTHqbN6X>-(N;D9f6R2;QqwW>g(k0n^jQE$|1 zlzr42`GR3-=gU#IVjE4aslBD0Fh`vX9Yt2!VR6)n{>9sffYN1Y!B;5*!Z-vc#Bkd7Ki?{lZvkhETq` z=r6n>&VY!R(`JCJKRU*%AQUxU7Z)9#aHnaShNF7%eHI@-7p3on)!HK zb^irt@;c$|jvT2wYiWKJgA)!EC7 z^o4}f4eAr(SdsEOLi(|k6Z14J>p_(7fnMS)F(UE;{!ch9YC6P=$6O7^F?*k-=MeQA z)C?^vR6V~zbd)f{#Kfbk$C=R`a8TiJR47y`zH$i)1}ZvNI&l1b4_wUm2IUdJe-?6Q zYWud)t4z6y?X_Q72L1gq=y)q1IL?k!{6945^xgog^5P+;+x2~Tl#Du_kDky}sLQd9 z_LC_+IuwomszcEzC9$VweO#S{%=xTD6=b1PtGqfBaX+%Gb}b;Q6j5zk&`ZxayFZ}A z3()hR1P_J@o`R8{7eAp_wM=lZC3Flatm#vDP;kKTY9tj>KvYjBQuKs6A%z%Wb)!I- zinh^IG9d*-^`vrRKyuU;;5(`KRqdczK5h|vqVKfJ2;IQnHFE+L_qUm{&E&dMDWKsfK{+;wllH2k-(<2FJ>bFtI^ggQvc%WGj4+`Mf z13%TUan>4cF2#LoOy3N;KHy7LD8~;t-}Ng~22-!cE56%{)3wZBmqFiI27OlZY@rKSkbo?r=$Cza{tk!*M~lhB~-F(cbH+! zvekL~&QDiov;T{E#?L{Y#fSLkr=iAiwP;t;AK#sSs@{64^ikzzzHNMW%|u1t3wl1@ zwNv!&mguZE)u1;eL^Hbdn0U-=B_3|4~K%p*S546y@T-QiO5 z5W?G&LOdvKeF(Jv01mu1UG}O*YEF87+DWt=!^P;!zwY^65>I3+lP`pG-e3^X4 z5)DCTP|#-npwul)Va!44X)MtY^hFBV+#i&B(kYBNC_RlO8iKB4xu}~^a?umW`Tzn2Y90Vp!5$XFT! z2+&_;voK{(?EssFE>6J-%@kuH?yysqdMRcLbNQXjK5e$}nWkkME+K7b-2tyfe6~wD zWi5oNTVZKxRY>hdTj-Q=w410PZcOnDDJ9Y71>zA@2*cDGE*51%Juw24j|W>^!tmy1 zI6~f9GUPrLl6>eO6$;rIA#0WlNxd<6l8-W&U@;+NmB5g6aa>RV5yw(D&6(uc1G3OI zT)pxMQQtOT`z=i%C~tT)ClF;APK}b#Dbl~*HX$nGZw~&}#$WV_{H^w8;6H%Bwg;}0 zJ`XwuBXJURlqmlrI|lin_c7=<`J+f&ghWd2P^yl!%=^jdd(w||JZ)fc*Q1UC=k7*5 zk`Cwz2=^a~%6*1<R-L=M*X% z8@`61TcK1FgoPX2W<1IwCah98KJ?4h{*JlW$Xpe?sx*%b(L0#TZA-C;V%0(5g3zV`@ldj1-TT2V2?pewka^~>$_z* z8aCY^7F)H-A6=tqs}ft~k1-LJDvd&l#$(hi(4sJ`*j3`#WHUt}?vttvD4YjtIwou1 zI1RO;GCBl*Up$Cx+SrH7pdTrNezZ6ps!RNTE>73!{^Y0I#7#(dD22E4+1=1~LB)dx z&2MoNs(1&Yw++MJt3Aj2aSmVd9Pf8QA4_@G=Xg^#^*7a&Gn@Bg3P73B=XjHxwrXQ3 z8`f{C1LguJ;K^mkHZ37kaxvTWWIz}~CBvKw2t$a&*hDWB#8fWN_+`*_+|ZU3!i`Za z?8b$7!wtQl+c-AF+pEw76;Wg(pP(i3D&B)!B$3|Z{MV`JR7AyPJsltip^{ilNBOhuGUH$ZjRJYg#`2)8xfZGV}F=qyP_+^$G}xBwGxwv8r% zL8Cv47H=C((t}2S6b&o`!lW7DZB>)$ws`NR=h8nbXx11f&pd*)6KO$st#rN(-TbeJJBiF zMpNA>GChH;mH?@e6q%ktR`V;W3q__U7}?}ImTHbHZu+Y%Zl>@mp&O~FRYJZIg~Bfk zE!*5?76IlqEYr)Z69%`zW+2**=rgyAFBKM|dQ2mlc;TYQkOHEOB?S^~Y9M}y)zF9aGFb9~(X|@Vv5eF8eL?P;m2nX*wugz#O?5j?SR+B_JjF}+Ag z3@J{+w)+JAtd~)#r_yFTYq+wkS$)+b>6Xp= z78G(U>$-OpJ+dMz)0-+&-zZ4cq#vnRZ22g;u(4E0no5;mn%|Iv?&UyL@fd@vK45Ub zw-Q$*hJA*k$*po9jXVx|y&Dvh-;b>PFp%-`v8}MF3G;50J+C3rnAubFMDjAp;SH4RklZAM6E}G(mgWY@L#8Q7ylJDM-XqN501xcRx@vSAAyKy zE;!o*B0|2NBo4p)QrE!7@1@Wx6W)Vh734u<52Nq|o<%b~{Qm9Pn(6uAXZIiq{ zZexAow0vcP1hL@21>%7^AQ$w8C)V>LCu&~yNp+B9%4r)Nf$~JefV)0*8G}qS4?^m` zcD&+JRZCZ4QbY`qCGPs<)UM*L&mVNb(O4R8$}_G4i9`4C)DgDv1RC8tt^j!%ABktd ztN!E5(IeljL-GDibDu_iWHj;+4nM%0{kBRVI;TnncP6~`q1L#kL zh$)xQ9nB@wa~~?6IvahSBk@2(xHBp!w6BWNH#*oBsvi4<^o|0W==vriyyU_cWFY|;oXFC4c5(*C;m{o52RNMuk#yRD5$oTOQQOVz}Rix6eR= zNq$kQT;jbJy3IY{;KY?URr-3cX&8H-6wxz)01je_ax@8x3Rca_Z1ZTZO&vHlCAJT@ z%rK|-9=vsDW_(ZQcT`|BtBnx2AH2YJpO;TT+0g1|S9k7ge9mNI0!m*y}y&H~r zbYFN|#kJhn>ENvz>P=8Z;T;N-dB*5zEmPjD5vKcks;|aq47q78qwlS<=n4Fwh9S22flv{)5A1YaxtOQwAXH}^DvL~E;V?X* zugxCgxk#CEB!)Z8MN>#GA_ zFv$N3_HUZ{MQVGi-uL!v5>cl`xo5B9%C3JY??#t(tSN;uNRIK)?D zn7y>~-8d!lBV5yV;qcy7NQ1o_p(VsW#Y-Lhi0Qv+b6W2*+-`;kJG>F+y*WX=-|sn+ zU!SVj3N|jz7o36s`Xk>U{Wtz`)(7*`Ux)W+Fyyloc}NdSXoTkQ3uvDE5ir8RUa*_# zYUD6{*y;@JTeT0}Y)mc1A23Gsv-IlZ;}CVWF&_dKhEWsW1baMSM%^|Ah;&r(^}x*o zr7`c$qdnfRJ;n2!C-0w-C)n~8fC%>A+7*$|+{s2tm?EkVhSV2uFiR@gy*0{V#UR)b zA5L~lT_lJzueH&#ZcjC*niFD3gIXbi6DAF+lfH+ttK&WF-UM(cJN=tVNx!OTdeszW z(&2V*SMUi5iT?@g_4h|UNmgBrB)sp;CS2mS`_vkkO}rpdkDBkNgX#WVeWs%2YMXKi zt$b%H+VHInEIJ3?4oAYWp^s9zT#6m77=-Kn0#8=_5Zhx*KUqh&lcVpK&rtVOtAU-71q0S-2A_A!ks>7Dh#-@nD@#Ro~;k3OG z^a^(Gd@4;zl=5}?5o}y9Zhb7byUZcFZ&P8W0^ZS16hC_FV z?V>0f;(d>gH);g`Te+s_#1t(7%!;RUBh#*w5~Xt!(&4dE9ZBf*eS*xJw(R_!G42L_ znp8HDtbbD8FdOd7poXpbV(K?)qu+r3!F;g$ue>YQ23805lJI&PMrGPz;`hbPqm$u{ zmhbZqC&m@Q7&9OK%LY}V!x5rPSL(?6V&WVHliITn<>gI9POCnN#Id~0qYhI26n4s@0qA$szH|Qd z$0-!N3I&hT2PKvsItFtwOvaF7+Q(`Wjm3hm)zXzslou!eG|#vW7I$FT?M2lN`cw$) z1GPqC?ISoI$DL!vgPzL!o+|KDaC|iWhM|efrbb^M?J+v6O%d6R`u-HE49qWsRVha} z%lWQOxe2XriZ4}FimKc6bLSVeVuFe*~DFXunrCMEoHI5K4Q zbx_d}ZN{UR@L2(MQqe)GlS1wAY00{m;>#HB(H)rSR}0~Jy%ckMe9=p#K;s|X&rsd& z?T@svK1tf3^TmQERJMB`gBN0`;?N(JBYo=0D0bUCs$c&40y8Jy7o$2?>Kp-{(D{z9 zq9iM!Je~$)<*)ioklyqaflA2k{Q#5@eFQ+@N7tI_`=FZl>6=-KuzNQlrutl1hxC0w zT|DHz;vs!sQx^|;#uqZ!GYe%^GGplX9Z^)z)cg3&^f5P2yzzNcZ*278hN&zC z`lx`qN{W0FzF93ZsVnfM;_`7(9MZ-ao+?66Mt3 zQ9i1)Yc6!(;qMvSK@zL@y3_Uc2R&4E9%dZNH5_dlUF7fQ^;K1+r-eZ$X$*}yLSSM_ z>$74yw5$UD(m$eCwF}|K-*NbBrGE$9io#;>u+ql>w@3Jo@z?tPg>0hTpwaj2CY@~4 z$>8yl8q-E1LqVP|s2SBo4MD@sQzg_<&oR;d=W6tfR4}*%`S;*PB-C{Js|KqJ)Oo9c zU$sl8xjBEw)tL8o@2$Qhk<2!di$+X;GW2E+^N3yu7GjwXU2QU6YnBH1(z1IWv^?7@ z`Lq3ylKZ>vJ4X%N&Mc!Piyw+lhb|hS9e$cKH{neKl zs|{j)wNB!H?f+`M^h{auKj{kjH|;Ld{Hj}pnu=<6ChZ2$e6?Vy;bNuL9>K1$v;w8D z7Erl1711#Ss1kNo7fZ?7Dy=1|)x(Y8N1qUdk-TQ`5Ks{8M8TPLC`Dhc&X_+&W)ZYJUPCHsBQKjd!Q4$uYXuPU~ zA9`s%w;0nY{zvpY{IJwQYglSRg}+4KfFIG%;b#qx>x%eYycd7X@ruH`fXCtQ^Z08G ze-4=V)I%UEeJU_!Iwj6fj1sD#?fx#j8`rQ_S&lh1C z@&hjTaM1ML*YV+|mfOwUG~5;ggovtY5kj?3pAaE-XM81QXYLolb-PRl-)Ry0ty zKTy5gh}?!JL{>E7+u|wA=7^7_vI53x4ZVgu2xA!ES)ew2Q&DUnAQt*vZ)H)drMa&5 zSJJ6+&FKWLuTMZh@cR0#S}wi6#s5t!)RxK^y}#N-K=C7}eiS|0Pgi^2Vidg+=!ucG z(e#(!(qJx(S1anJ0=*ll4<71$1&4vMsKqn9xeZGwuObG%hX_cwvYD~{Oh#-gnEo6aee#ZC=C^wo}dgQcTFU;nDS^ZxD`DX zw$@S#4t70I6!qF8P48La)M4{`REjRK7!;J6z?1|?h}-cay7?~} zTRiCZPyAc|pZ^RgEXX^aJLtaSLk0~#{^rusDEIoSZ;kV2KfQYTle1pfwqwf;R{v{# z_7n_j_b*ST{Ns};^6;!qa@X)MIpU65@}p0S`kOp2$y4?x9(!j_aK-6TRDMGSm7gpJ z4Vk!W&%RAqvif`fataDNjn27Co_g;=xp!tKxzigeN2k@6AAh#~9+UH-pMPvnuj%ub zf;#*ptL6MItM)r7BcmqC&%gMTUMT;qe^aJC-EsJ!KJwIC9(nNT6uI5wlq1q=$xqf5 z`5Ms9ea9NtXtYFD>?dVykCd*Vzsk_^kIT=$T<;5WR^sEdYxp;D@)I3L4ZcgBc-%MylcGtWW$%f{BPfRs8RKVH)Pa3f5=+7Qr5^mBP+%}A)lZBd`~mUUoKs` zrt}}5^5m^!h7OP?UmGm9Pi!Q&dMnEOo^9ls_1~nMyq_AksD`WQJ2L9-i?YGUKV^%D zFUVNeY&mWE)4j|vr!W0!|K+>YEw(>;W6GZK4U%_0+%WmOhZ9Tv?EroEL)Rsrcw<=d z#|!@T;D{mpBSI(RGb0>XZX^ma@aYo$Gcm-aq`%@XXWuv=gMPipOuG;=E?*Ac~GI6S z)8&`*C&U0(J$ojA2!I-XTO!J*1aW%_3JFpEV@^28(UlM^i+_A-EWtlEPGMP zW1FNr{+0Z8&08|2!85Y*-G9n9(~olzfBH(EJoPR5nH93&-Y)X!yfnFaWSrbxSWS9+w3nZ} z{k*(%=u7$Mp|x_y2d~O%i7&_oV~~GJ|8+|LIXU&IX#wTG``;PMw~URKr;l%y$B%y} z4AG|tCUfB4mJp089a@})J$*87FWV0Dkwp(yX-uddEGP=$)^4+)I4oLs|nd!^7 zjER@Wk8ML5yX4`sNc-YpdHA&92)AA45Gw`TuaMl^d%UO!jLTVIeeX`z(iu4m+i zPu65ox&JAD<+g98e*)|m%_{lJ z$vyJ3Z#K&Z2X>Pu<|fM>xxw<-*jBQz_nq>CrE}$J)ZfLQx61>cy(aIteYou3yT5#3 zNPl_z4aqXO>EPq1P8`Da8~;Bu{gcPHqrUgb!xs+9gBOm-lYg9$r_cW^PaWSYPwxLl zp4juHJacM~JSQ)1U%T~-#e;jN%H<<&m9zTQk?&=t%)IAr**l}V+`sE< zd1lvY`TPD2a`VTp%L(}d<;>|*<$;5T<&#f5E(`Ct?w23;Z@tSZ!}rkt?P!0L$FuuC zmlyXG$@9C`$&=gH%2Rv4S#sjw-f|0`oxOjAH(!n&F-kr;ZTb(N6|L{~;)^dlICjEA za@qSURPyaCnP6e*iKZ+9b~$-Ym}@+9FT?u<87puP!?D{>u0J zFMH>m?qhQYoyhEQr|fcP$4dj;1CQnmam&e*ACp7#JhE%&RQcT0N%EJ2Tjb=&C;n&W z?%j?P$4@LMTDwjzd+ROv#fH!24+nlcxM=Z9gVXNl`pZWjtwVbS|??wq;u>y2Ms+_Z7i zu4T(s$i=TLmgC2bll}VimW71{DBB{rzG%JNwR0DAY`kpKs+D~8l~*nuICx+X@y{AK z@awxXy2)preo}7UvPJIRyKmzAtKUz5=HIiPBmeLIjs6Gy|4(Oj$|L7~kVnzhf4Xo~ z{vuDmyt-)B;AvBzlCQtkruKlnht|Ni@O z{rV#L_19m^XJ$PkpPDvJ&VOOSv1jJYSwC#pu;ZUEUo4l+e@d?Tc(vTJb=%?Dvu7Vz zzHAxmA*H_=?f)>wngi(fj$Zspp8DgIJag&HJKOi~=>M;W$6Z?U(Z_pMfA}FyRK=!E z8*Rwb#*xE^%f}yoTrPrMz4_*wa>a@j@{>TL`A%44Nrmvv#KZ^7ZA@9d8{4CEP{gZ#5kZ0u?x%lNd z=cYdT_$RYx&3^N#X;YWx4a@r`vwwe1bIFn=^4Vvfl`p;Yl3eh@0y$&G)AGqFPy9Cd zu}420Gjimb3F97?nPj7iWL?!O{V1HhrG_#pZ8Pm%q2N z_u|(VPk(;iv#Xw+_xxj@t^KU$+D|`jdick^#)WeytA4fqT3sHbI{FX+L!TdwKNqUU~H7KKb*JU9bg?zGMwc&li6^Q|Ht# zzux}qg-cBjA3f3L*oo6O7Y}1%EN;!0@=yGc@~78_$*m8BAKX2uMX>2lf44u~>)l=X z7377bUF5mfQsmi1?c}+|?d8QcQ|0d~d+xiive)aszu)_9xw`K=7gqLO^81SJ|2ey) zllRpPFH#H z{ho5~QE~s!ue$thYz?_>TphV7+b+M%DldQe zWJaOC53P83)Iaq*ymHd0{Vxq3v2#{>!I2N17Q|^FO2ccj9~mGju*zmzjDIgPXQ!)~tEcK3zJeGp9PPf=usVcR^a_P*;( zfF}8#LhnHLAjESw$#oYrRmtZ!&GWhk6lUjSHE!Odb(4|#W|G$!`PML(i!zs)o9ija zEI=U;MbWZ60}Cmu7P8CL-jg@Vn>~0)fh&GsLl<(?vN4?29LeSCl37qN#67~*$&-Uj zAxLHp%4i_*b!8T~hIk6|3-H*)<@LfD=o#8DQO8Wq%yo6~c)ac*?#wJ#d{$;|vl}ug z&fuY$**PTw56{kWbt=rt2ebJ5-MLwr!`&3vH7aw6$K%TK6a+AD-{g)auB5EYq4|y5 zdvbEJ-Cl@xf961nGEfl;+yjUB;)Q9Unxv&Z}xC^t_u~@m}|yW;PK?RMhwXwI7IWw%*pYL$aiJAhr4q;c~CY4ak(?|vvWqd z2D@|J-pm3w;(P9Q4=iwbysn{{54c@}vU5;`NCohIk5{uwO-^Y5IdZdHESzRZ)x^o> zyRvf!<`k0pwsrN&&WB>U(hGn+Dm?0{g<0fyzCMvz;pv7%SNf1lZ(g#JF%gxK>+ylK zq}+l;S0A(s6f@FBCA&JN^>if_7I-MP`Ay6sYnPtv>YP2$oty7&YtnkSv$FFGyx9W^ zl_G#aVZIxZx|EVL%K_QBnch*9-=X=5t`XSwMY)Ts?hp0o{1wPptxdNrjcX8vVrt}l4%tXS*Y zpS=vQ%|&lVB}7SN7NT;A-6$7I(KWzLYJmzw+sMuGc%dTjMG`|js(B#S1=NbDy=A!u z!9$gLzGqOu2vn?2+|-%;Joi9S8nDPFRq~R$pq-N9T@#so$;hs*9b8>f zdbIBZUP=1CO8X4Tfd8pI$^)`= zMnBOlrF|+MbXqBWQjqtg9(@z39NKqHOHb+E6G0Kgm7LTisbfmIE8breuF?tt<=wt# zkCZMXA99}Fvt4>dYDUkD6j#TtU6a#wN?@O!(xX>u`;_#XT%Eg8!FO==OixKfIvGiv zJQ$&f;Ek~DdZwpxVWp;Jr1a>~vs*@L*R+PNPF;JWARuWHqEbC3ySk=vb)u%b_ULOS z)`3ffi$2lSyHg5$QO#+T!;BtDR6OY!JyP3KZR#3g2{O9&$gt$sm6p=6b85$wwDu_^ zQ&-~BJ2gF}p)09JD&*^^lLKSYsNP9^U0tCi$QbDzBvg+U{Y>O~bftE1B_;O)Cy1{C zqyE!VwXSd>w(q1XKsCXen_{33Xx2RX6E$%7he%`-XiJBi>@9W7VX%(hK*0E&m*XCp zF)Gikh$>#bdsrcCC?745o7X*vn0W@e^YiPthGyq>9XPPi3wsHc*U-$7CMwJw;3>>S ze_qGc)MQ=?qjXOW4=R6=6Bk8sIoS>>P~(*9sBWpFEklbCrG4QU*5Iq^ zzt(cDTHk4S#>Aw!=3!jErH&WvI@=r2B1>xwWbO}lD>W*GRhBtvO2#}!DK$+vRNKb% zfz3p-`Q>F647nT+OZ}H7im&yS$dFG8%=l=|ch!xy)CO3hcK(Tm_>Z-m|KAME0p$NT zgJL7fH8+DY#;)T1-rsBo)EnJW2a`-p6H4g@{;u(0O54Ld$n7PIl=>*M&A~eKm3N@PZ1MkdW~GwS z*JitwZX%Q^=anZG#S*xxPQe^uOhcxaez1YVPHAdP36@gSrK_LGsx(HI?<6i4GslCa zT3Xw+$T0v5d+tok0W9@OJW5NsY)dO3a%pWxiN!vasgb5yrlG7x+LrM#{a<#$S?>Jo z!C0*A;K{)nl%=4|`I&DtwG>%tg@u(}ETDDtdJ6L}Jt@)cTrHb2YWr%VXQK!F8>u5U z=804ve}hTcYU9gApn+bx_6;t~E@kZSD+#S|6q{M(WabVo%p45ieJQoCtJgM6CC|^M z^^FY6@`mZ-byJPo53Bj4{D+4olY063JXepGGk?#LpsZe59SuDM?bN@o<&e;RJc)M`b%-sWu z1^q7;xVJF30IvZoW!@#5-ZEiP`+ryR{v@xm{OR@3|E`P%c`-ze@OU5SrQXz93Tt?a z`J%gOBn_(+XH9O z`cFDZ(k+v!7eiucqv2(FWaj6)hYrXYl~%e1b=kP)i`OL0BQvIqhf%NeXr?V6EGi zRnv_93pwrP$uIb)c=agEEzT}b5?>?in#*aX7Y^i?NPZPj^;){wru-~6lk4(^o7Rz% z23fJxi+Av4#!Jc>kvR%VYSBW=B&W1=y5c*h!h)W8S$N+b_#TWq26}O4$xlErkY8!# zP`r1tNTBvL>9>8TjC5WF_?!A+RkbAV;J?{M1NGzY^Xr}I&BdFw&a~&H*fc+&G|MPV zvwOBwf?uh!a|_&qF-^2GG9y5*Q)!z{K3)IZT}=5&`6*s6_GMUf;##`L^uj#smCDaI*;?3LLl>kP$yKcaSz2Dn zL8+tOhm~yI^=1+6T5{TFXb#vFGb*kjkNm2P>=Q4x-tcQ#U#ER7V)bwj#y%yt7vpCt zwAAa#`2rt)n!r+ zmVs!;orRUz+KauGy{yKidD08AFf+BVxt7|z(>?01X&5(qpJ~OYnB7^tV<_2LD8+o; zw~=o#24+WB+~CxMqaJE}D|*HH-fP$gf{mvG@uoP?V7S72d(LH`gx6jeS5X$+1HG~*EK9^0! zeB0kcmwhR5S&uA5V68?y?v`GB9MM-Z)@Y?wS$^SwjKJkOp1oM3sf?GN80C`KS_HlJ zx>EBdONXb*@G=FTFmC>p@agV?0+@vuDy}|_ zp7}JM<`#H8up~=F`yc5;PIm4CrHv*5@|31Xw4FJ_qf9AF<4=QOT-<{FUp0MBx@1X~ zsZV82ugZ*pc`zz%xI4`~0?YaT_iBxdVUnYm4ePT7u2_3i?ZqOSri~>o>!8~lY0N%? zsj7Pj7@C+~Y*beq)Zk6=NfiQDcGNJec$05224=$!9CS^p$%@T_l#%oq1A70zJESWy zeO;;^H_Lc;<}0q!8VTaSST60ISy^vtOXK2o({|TV*KmBJb>J#v={Z1}u;bk$OKb0c ziP6=L`;?i|#}V?m`Z0t;m(sJBI@XsFwybf!%;0Qum1yB*1i!-g&aJ?bU9%;jno3`F zVX{vF&ES-{k9h6YTxo2sXckbU|6)~^Y6_H5*c7%5GoZ{EWtjkFM8Jj?es6!Z^B%rAOMO9K3NO3cujKVF$1Sli)WrzR&Vr^XY za9>)jTzRNx$%~Dgp+iiFY?CZXvS?d<9iK6b!=-*X{y5ofS5`SN4gXeVK_?J&1avsB(XjKhS zw`aPjw9w#tdFyuUnVJm0dcbX}BYe9Y&j1RHe>NO&*89GNp`moD*~ROwr{m8k^||=n ziXVN<;YVjo5}l4Q18?6Cr?Kf=ImBW6 zKD$GlVD}=sK|w?bWw#Q$E_NHS+mhX7K?{Py#5hO3!y&EyEm|#nUI$7qbS5B2}nI*A`XyV3%8^AnJKnJN~<2b_7KW-dLp@_ z5=q)e*qzV5>)71|x4hV&xGfAhh3gRZ#>8QH9g5YRp9i!1L7jc}iegvem5m`)6ABa2 zgu+yV8zydQatF%){w95!go($SQ0>fx>k!MDEC%I6rhmnh=W0=o98D?R^rmSE<;BzC zX~@O$ro?S4yLFqq-8>aLbFS z*As_DpgY7{?0&%RXY76rH%#nCNQZd7CF#bJmXy2C*!_y#1MJqgA>xKG(eVZfIrIk7 zxA`}az8%FgG_V!%soaXvZP==fa+I%qT^*AUs_ zJg4vo(u)!g5CWGcIrTh^o?$KpC^iG}78uKo+F}fNkYr!OFG`FRVYaBwr~;!oqLx9WTgyhJJ6F_Uzc#iMaXV0bMkyR}p=ipe zJN$xi!u<6d?;ei#vS`PCLpk2dq9daRIppi28>2~#mWY0gW;4$>L^kJkp^b9;o+x0y zcMvi{tQ5l;easClDy22zQAX7mt<&f_MjHsB zlv)8*fz~M0&Q4qoh(+wz$4+@aBwjZ{k)9iddg){mOr&rOa0n|UJ z3bZDV-G|tHlHEB$)j|I#s21F!pt?SHhU4FOp6i$c_o$=C`jPYu}*cNV+P z!!^XB5aK+CxxLQM?}bpTPeaba{VIgQD9+QIm65w8&Z=-XI%~lF#!2ZOX7>`@+M;o2 zZP4!uJL^v|te??q{0w&Iu)C1m*V%oK-F0xAi{HZv5jP^7QmGz33hs5`wS0Wu3$G5z zSF`&GyG87N0k`}3P2pAGo`72$NB5Fckr8#F4;#zT^PX~)$13G1N2%=2X1Az3(J!*w zyaGKBV|N+5XW5O5+yi=-NQyf-lESQK_Y6~RjUxJlD55W6_iLtvS0s8GyEEDSrXq!r z6^YyR(d7GB^gh(AD*x7%!*C%>++wpaTA&-*#dDW?3!VQkgOcSUsyzmwhb z?3UFk%{E1C)31$Yx{-0jO|_}3;oxuAwS_9xhH=zVl;lcgm6y^buPvI#oj|^nUMblg zh@-sZu{$a*%wAiJi)$5JTTF_(HP{TfBW{#omf_L3yMlX-KhEx1cK?8D`idI&!8Z)9 zNvTjH3zSOiR%N#)T$3~PNSJTbAh!v-x3Jrh-3)f!?B>+uT3G9wA8wlJhg?Ac6M!&`9*eD)UNHI*6Q#5riP_C zdX0as4!H~2eGRTz+Ec^QL0?*j+~w?k02h6Doj!19#?UkM6;Wbeol&qsj@BuJd#27= z^duYWz5`#SV^*2RU1v%Q0|@_$f;(V7gaM5I6$N(&qS+e#D=OC`C=xd_Z*mcu=-kNY zh(t|1_GS*F z31U%jPuN5)Td9!Cg73lYamzIN1b!97VxC_Y8B{K?7%{6xNf=ZvQDUV+p;Rsv#U@76 zMWka0P$!xU!DF0Nn3>y93wU}$!f1jZIjf2>?Z|I}=;r8& z3&!VlP>3Xp6Q?vH$!dtz9m($yOIB0d-ieTstd>~I=nzZh61y0wQgTr+{3|Ng&+(9O z@iUL{{Uv@kv>IxU5B7@@974?*#c*n62 zR{wa7zHlstP1NQNiZ_vKtiG7YXp-}kBNC_0&tp_1h)aDT?xc{1j0=u;VZS$Gr1B6i zS_Gh5d}t+3Xz%Jnh$Zg!p^str4`D>97vavpk&LE`P9a~5reYplA%Gg|60$`!6JKi7 z52(5LL!+FKotT|0>7qi8gkKAhmPSZPcD?AOkk}RS8}3GaOd%&}$c^F!jWVI-H;R=S z9SR||NuzTicH>5IL?fru2^4|#94hN-jOuCB%=sMR-K-Fo=Zzwn(FD;dv;q94X_N%i zR;<+M{?LZTO~OSBHPEvMLz^47iar`W5!%YQO{~`Fnb2E|Br%gux0@iA0<{;n^EuoT z#FwERF?;$_qwjz^iVQyge1bTG^ioA~FO|Zj&@RRu;(Lu^!&-|jBCoIVBQ5VD#_)Na zs^z4Kvl>y$=_)qxx#QDC!?2;EyZD1o>YR=nu||k=F`m!+Rc*Sb*rCzQVM9c3(f>Y` z0=23>qDqcJcZ9VQcZrcB6mp04#ND9B9w9Vc6o&OQ`iUctDL-m)_lcVySBP3%e~~wt zkZN(6!a0SIYH8Uw`=Mzch_@P~mqO(j2Q zWcVbY)f%OTPc;UKPERSnd&6fL*gJmUfJ*wf@UNsI_zVC0B38a*BUijgb& z&=qCiIXC;dZ!phkN8(qj{0&xqTbt&sK53j>Y@FJ`eZ*MEjQ8H;Mj;* zn~93bHHwJDUEeoz>Z?y{7Yib8wv7`lmnpP5BE>ddq-eA;qMPksVx&gLBkriYY$yFWWTnJ)`NONx7$NGepFDD!rs~ zGi@`)?Tn~rf7bSI@rDn*YI|0!@u6k57sQ5@D!rcNKCvwl2R=~f{&Mq-#p0e-3N0%4 zh3!=lw^||6&)3B~jYvP2h-n{^pBk&)5LG@>h{mcn#S4tk)0T@AZ;6!}1(k0Av{s`A z<(MKasZk32mWyc`-3`CxVxC5m;I~37)95+)tq^N8+5o@z z#14)2!0$bAKqClyfks>4w^~fm=tuai7PB=9i*gztilrLWi`s1aP^{J{9ey8) zEgIbqzmLQ|jiyFLq7u$)^juT}prB6#{!MbOfZrMsr_rbITO;B%+7F(eh}$(f2cDmZ z&KkKYI*m_7mPV~BZnk|Y@-)hV-)G`6jmE(5Gci-6SKzl+EYWB+{ML$<8tttZDb|Ti z8l9}z0O)&-DnxI$6^XMN)sEf;BtBJnxHZ~otQS=@x-)vSZM~?+Xgc><8^lWG$0Obb z(d;u7Z+`Rv+Xj*6Lq~1@5z81&5R0Q5U>)y(M$4j4+P)N7YblfZ`Cb31M0hP(`7$e1HlW4M@UL@6Uu~O3#0J0A--=C)Nb1`5E#e5HL&oaL4eVQm z>pv7ySx;NV9gHThWZOi4Mw6UJW1Pk|F_O_N=cSna_HAOC_9Gi*n>epgcQDCs3Y7ePhQWy~h|$7eiu0g0_jXj9`bvwiY|Y z$S){`3E~k((=>V`wtUbI(fLc|_W{s%;*>`JLCBrrxv!Mpx3LX?mNJ?ozKyLEv`e)7 zn*0dW4B9QeN0Aab96Qh0D@J~+(1lpMQ4-&46kMfw(0*~=huQ}HC~n@WLhcGl2|6V9 zZByv!@YdppXt|TnA)`VSLY)|`1=?&oB4#TjV&QjGe935%a537(Na^)a@q_Y19Zd*2 zDk67r3eI<{IE`Z>UZan|^O$I<(SP7~Ty)lGGyIN=ks9rS-w82Iqa#%w4>}jjg)fc2XoOBp$80P@EKFG@4a)PS7c_Oru3r=NYHPF^!g1ZEl@@I^HcD=AiiXzLS7Kf4*El06m1mZ_I^=x z)93)=T@*tYsdyK~980|4#Znzo#6^nV#Rf~r-$mjfe+qwymI3HCA8H`}5O?~}$Kp@X zhmo2QNil>`5zp-nW4uOW4;sd7jmRD}jHMcpJ!lvkG$MP@F!pIg{ik7^XS7z3J!lv$ z50jilPO=AWMrTIKPPQ2@D8#cto3T!+q^vckQROG{n=Z&&3pFw{qPazw;rdy{qxFIaVpCt2&oxEC1V~VHDjo3yvs08d8c|KxFs5llHC@A4tP$084Py->m4_NeC9F76>C$>g4WqM0G^?v=%nVU} zG^=wNTbv3}$=5OZgc4G-x_ZV^MyllN8zXTioLTbm#*wNDQOP$n`XIyPMIZK!vNWQ8@Fru7M$`}9WX#lv zdefVXB^puBcayP}(FD;ct^#;IhU}Zx)9uF6>sc1=2a}AQKGZ-Y8OIdjzOJ1S)RIC@ z5SekU@jmf3Mn!_w*4i1}HKO@Sdm~FBj+bnVW~B0-Y)n+hIX$ktJ=vJ25$RyEu}mWx zACiqPHJXbaGub$x(ek(s!O6xSj8spXY)otA&qIpwfe$qhDaHAPFG?G!4Mvv5-2wBExG_~erpqUyiujw>87)vzTTywLn zgRxShliRszq zpqU!o8ut#+5=P2u?r5ylh^%JBYpYTqE$C#-)My}N>0~TnG(n81RU3Yf-9#Z(O{W?M zZX={D<2#JV+nEdN?w!U?A37C$rvde4ZJp$3jr{)_Yj*rL&P`1LT_By)Ps0tiL@m{AOw)*3quW@l z5w%peu|^}Bxw(xU8j&WujZ+#`t<}uoHsU%d$*6U>jg}f6sZD+v8r>O7s6eAXYg5Q6 z8b#J2zm*!*s6&36G-_Js2KXIeq;%eGdGM-lmy>M$W#8~P> z4S=G$a7g&A#6FICK9uEnz?h=Z7j<$SxyE^ocGhVv@{HPP6i>~F@{E>@)Ql+4n5YoX zh=v&}8BO9D(J*5zqghTz-4Tvq#x9L&)*TIWfRUOld5u4`U#q&~9bThSS4wY|vwhu1 zfD$z7R(CQ`ONB(gy3-u_Mq)P(DTdUY;}~IluhHqC$~NA(xrYk*UESr53C5aqg^nTKzYJG~LN|x4a!fP|d}xT6WX#m)eBD)! zM~$;SG(J1T389OwpRd0i1no*^fir2W_SB~k% zY>isi+wPcY1oc*a9qR3MJY)3ND81fc$6VtDjRw^_?RehUz({Gx3ls@&^9Y56n5f8j zu3mFvq4p~>KCV|T=om%LOi~|Vw};4#`ndB=tEJ9xR-j> zh-IWwf7Ng?njp5;s}=I9aaN-}^%{h{Zp7b3@h0F6!1W<-8cQ`g1;3?6-rdSC{e*V zb-A{W3^7=te4sVPOF0VBTf|R|vqKdkyY4fie=Z?q*R3@+Fj98iI-{9~{n-92GCDF+ zc`q{hD8%JbWaMc?eNU0`m`0PYa~eg)GL056I-(KvL`8V%PbsL@Uu5JkQX}4aV-_Qo z-Ub9S#Fy9k-Ea80EO$Hm?uBa;>X}@dIO3yYe}(1Q%K3pfN=3yz&SB1Q+|v1&{3(3d zJe8amIgIsLGDW${*IA$VM8LI)Xns!gxi-;~pKoQ~_WZ2EL`G07<*K|a3Ly@2f~bAG zj^`lp9^7E;p`yLEpTaf7oyCE#UxOS1nbmCx$p-g{}DG&4Wqa~iFF#Tz!&#^o! z%5zLnlDx!WR9TfQXQJE0<;&a}%U^?mwV?Pc=Cu4_0`=!@mTCoDyI92`OH$Twn6>P? zfn8OqU-I)#c8|cdiL?Anc{FuEg;Y7UJ}cS$QrW~G92bl3;DcpB$WtFKYLh9}XNqeV ztu4OoIeZ#Z`fzv^W-wD!TI$)#%}=*mT7gYaNV~Y7v;C$H%15VJUpl1i1#JWDL~>@TsvdMv94_`gekk>w}XCSK)d zDl3CqmQAc+ifZp4Se~siD__-LsXpN>Unw4!_ajs`g0XZDNLlQXz^>Y~e6_*j3!D zVf@c_ahk(ifNSRF|JHLj9D^(}sRu;Y<6O}Urv>*81j z71G)dG-e6?{e~f|+WYr=?+7l>tLcrEgjU&BAki5vc8|j~>qzOaRT5Pfif+{nrMJpgX|F21{>)9a4pmmxSS6o{vyFQj zyBOypsj^tA8F;4Ms-^iFLZvtaA#LITPSN^YG8HAK(tpV%pUbhV_3mYEM6v5}Sy4uC zNY!4foE5hR;S2i|ZjhMHAxqNVve5m{*x?DfO{`^K)xNecWe-!7j;UHZbQKgTE4#Sh z3u)uhGlZXyA^v3kp$#cydAO?HZ9-8hm7u7ejY`i9Qw3pygbG<3&opKKgAH% zXVo4{wn|gm?by>7gr5W7l7)y+d_RCae)vUWM_n{G#`b|YxF;Q3a1 zHfWb%65P$URJc7t`toxo+y1x{LYIU7T-&Lj!TaXqPxd7`A&8@$C%U1xBbCk{BtD8pGg*+Rj();f%6P zPi!rsY{V_fb}pfT{iyK_eB(IXdYo=OPRlUPB~aW~5<414jkglBA?1)&l zW64R}5R5Ec%Zl}iu58CmGAN`igvS7dG^K&k0P`^^6bhwzK%zQJgJJ5dr|5|6Az0W!KUdf3=JD>IQzUS<-A8W6@_F8MNz4qSMez^8Z$Mr!z z|7z{EQs#CkbGwxJZh`aN*eP~R-LAslqMR3^3)gO~TU}5%mtVWLuBY&dmbamVeef4$ z_+)e;TGw(4khHG*gF1vQe~xfR%X^TwwdJqsj=7s!2-5?iGF3sG_R=V z^G1pJ&l3KwI~J$;3FI08wCj-Or{m`@E*L00*7EvjMAD2DzSDx-sru-A&{~uen zEOhhpu(0*k`tyR5hYOoqYoqgp?X5fAqf){#cWdiU)*o}{Ti;awXyLKe zx7R<3`1j!Xxz-QXzYu-9b#eVOg%?`Cfbc@=61O{syrJzI_`0->E&a^3e^I~NUD@_m z2uUGbg4GLAbK56`624#GB^bUC?QA>cz9Nu(r7+a?)xuW_uaoedZ5!S50?+e>C)@Tm zJYV=&TW$1w;d5<04KEbF)wTp*zuQKP{javSf$HXM!JY$Gzh&8iZ%b(}04Id4Y0KRW z2LzG}(G^>MZNc}YzrJ5++44xkg~Gu6pKo~H?cMTR;evb3miIMWaFbg;)bN6PXbaXn z3vb$T3RL>!mQO6$jgmjo@D6F|JKV>%e7T`t+VyH_*Q=#1FSy5AYZs9Me{4}*4STSz z=0n$Bh35}ld+nm0!tZX`jjuO=D&FmsO6#}0Ct8Y>J5kHuZ+U&R8qb}J*44DOziQFu zn%A@+U9_u)qoAYar`wmf%{A|8Cv3!dd*SK!yBGD;ysv3s(d{){KkX^}e)|^}yx_jp zP8eESPA%FkJ^n)UH|>*)qQXD6Zv?KEU;8h3ehtRd_Y3p39%_8SE#LYYgj==_HjW6) z=cSGJ)x3V|y^ZfKynE|pDxaNmjf3flV!bzSj)Ngyb@!7&kgoNR@8nIt)+ZP%yxVCN2Hf}Eb^nx!pzC-Xp zO8dLUCkuCN`=5<%ZjWtiX(zfWbr`*i8CGIK5_P*Qw!nTE%JypZ;`xNkS z*=5hlsQkFJ;$fl8kJo%-+ltGcN6a~tBPreYw$(;YIa)%WF8uShjR==)|9kkMUA?_F zdb+S{`%c94Y-jvYgipEGBL4e@;`aTQ-B+02-h0`F=)vu$T)(vX$~YvQ_X~|Z4Gz{W z{AY3f)2?;h4=;NbY3^A3tb613=itHf&h6hU41sb^E*=%ii3+qYz92APaDTG>Q%j?H zf4}{irC*Vfzh6_cqqp`epuP7*UqShc>+9xSz2k+Y->?e4^mEeoDTY2YXG&d=Yn>}fY|OMT6?QvUPq(H+kf?kjw| z^}Wk3MDN^j3RLm??H^k9ZTb3b)cC1oFSw_6kV1ZA$Cs8pgYohe#C&eYA1}M$zOnoae;dxyXJW^I~Z0eZzzpiOP z%>L`PA?C`q>k&haeIG{Cx~3k<6&2`Ta-TbWT}RWj;CW!)FJ1@8=l$VzFD$JS%juMiG%ALzQq>V^}80;Wf@L^cknR0dE zx}B@sYS1LP%HEw{UVgsts-5#zv={E#*|6eiv~KANa+q_CFBFD%K38~)@PT(pZ@x?T z0C~&)%ibbzzC~(zk34@+!l&IEc7E;h_elH)CA?60+s@ZVPXel?E1#UV5PWzM;+t14 za(pI@HLtu*W~BB)q4xSOF1X;qw3$6UwtkFR=m-aXg97tb7P#LovMJ@cNr z9#R#O?pG!JaBZ#I?*1A&$@T8L2zSH3rq<0!%uh-tBD|AE9i_y9rMDlmRgf$5hNn0~p$uafvH3xut?K-jJ-5VmV2qo zeA*pHt_S4#5eeVy?tR6edw)Zr_7Q|@>b~QaE&9j0N22#P4AyTbEL-%x#TyErU-*&5 zop@fpY!Kni%W7(tE&68DhMEu8-L(7zc;3JK^9WzF{5uHmU0yS9*`jmHJLkQ>;f>1& z@%+T{NAUd7<)24*c*S=RzIsK?{P#C}dc}tM%NDJ^{Hpm4=y!NM;tV8&oB^?Mqv19<@7neMY@Ec2>MEF0J zJcF=d>9-MHu{5gt@!CyG*CD)VX$QhPmJT4CSo$!+pIZ7P!k=CG48o_DeqlXZ-POYI zgA!8jf8rIF)h?^Ov39!l7i)i`_B*wITYFjEPMqd&tnO6Zc-_0|K3ez5y3f~rvF>Yi z->Yk=UtYhleph{e{cGx{>L05A)%xG6|5E)w)?d}ItKm??sfIT-e4^oR8ZI+i6=zmFzT$UQJip>!R$O)Y=F7KTe&F(v%Rh4Y7cT#o%jd6b zSh;fLH7jpedE3hVmB&_&uYA+W_pbcl$`7yn?8?ur{HK+LRSQ=wUA1}D&Q-ft?O%0t z)rnQ7Rz0-p?W>+$^+&7zV%6WTx&T()w0h_2?$vj$zIXK-R~IlptifE6^D6GjUx3p% z7J{EP$Ugk#*bTJ;bF9m;*J%y*G+mDobtC3kH(}S(e(bKk4chhreCc&R=I+3b`#W8; zJBGbMKaMdsfVtQpcJT~hK6ct|a-%p6WDNUp&R~R|b=Sg+zXf~Ww_?ZpHmta9caLM| z{V%xdus0sSjV_~-g1Orp3m?vB>X!Ge;{G)g25z>rhLnSwMquNE_iN|V}A{>_Rd@a*!%3o^uB;w~%@8=s?+V3{pS6tn)st?ZxRvkn5A8KBMuz%GM!qHXtB0Rf_So(qFs#(pvwGu8}{Vsf6 z@Crh5)hh^<_QFqI!RJ4WzKXAZ89j&a9bgU4{hY-AN%W_Pc~WAYlJLJuyh8Z@$aDRb zEMe~bqV;N-T8{SDTuRXNad_pL`GkBu!as?wMVN6RUqF@!ym1 z!rEsMU)#)nyt4Vrc>aSczk%?Y=D$RE_m$s6sPv%FZfj=kTUY!5@pHkIVpZGnsYT4& zzmDMv38y7|K*F$=ee0Pfj~Q*X(xk$6VeQSZ!z=uK>-jvois8_Dwx}dA56bhK)^{QP z+*KD4zWJ&jB7E0X1z75oV}#fa>;2f(#MtK~WbFm;#u{+Q`S>G`WVitQF~Wa_b@(fQ zb26+4&y4WD0ndxTJtO>Y#Pdq*AuWI>E=A1M;GYHXMTQ%}StIbp6?oo^RIuoQn-;+F zu0VJ*xN5=O0-joM9ndEWZZCLh0h-Iz2)mHG01mqu;Sl&~!Ht8P7Tg4OF&5k;_A3^k z{cl4!1+H3fC7hvB0O#F>8h-{HyZ|3YhVPW~Q{IKJ;2uMr5jgS9czzspM$k7I{ygf$ zdZ&a>xNgL}2Vudz7ZM->$KH?U_hGkR)Wgv&9PFTjWR!w6SJzl`vT=wk@4j6RNVZS<=M|6TNJ2scKbLbxe<8sX;X zGYDUa{YnLQP4u4;wnWb$Y{Sl=0#4ES9fY?;zlU&t^en=j=t~G+75xFi+oCTcJb?Ll z!SzO8LwGRyI>Ni7=MWA@&m$a(zKQVO=+6+I#;%M4P80h!!m;Q(2*)um0c}TrgK#o> z0pXeGdkD{C??VA+#{50P2eA{O0H2-zf$-mBcR|6uF8T+Ak6^}Kz!@dTEC7vITRwMkm=n91Ij@BUj`DiV|C!%!--xF;>_}=Jhguf7NL<#RhSa81> zZASQHbPd9%q85Z7j@l4@Bx*@p!R4#obb<{{`NR z1^29kUy2Ul`S+vS5&l8chwu-hqX@qo-HGtOM#m6-CAu5oSEG9nel0qV@Q*N?EV!>n zg9!gPDk6L?8bk1`=R}{`5TvIrQ z@W%@05w0yffUvpn5W;nZ*F|e;TWjyCeQoUzYvY2cVg(wXz?b8BO2v&+ScOzMc30m zFg0A9_K}?vQ^i)fz~bZpE&_6Q^lja;Wn0-)8d-9Erv|1byLjEp#AKYXhnFB9#3`gM zc}S|28u+c`j@TX1hjHJmB;SX8qc}IQC|BjC!Ajm-=jc>?XPxUik4rbk4i5~T#=Vmc zw^~n3nCd$}c4A^QDWFwgzzu1oBI9u5G4DK@m_lo<+&lW@?vjzg zq$J)EQcBvydyW$DB^D<=|)!}^Pv4L^iEi#Vl%tlA`nrnfweM<~wKS+-^%DBFX(KDnM$#`I5 zSSsSLjJA@)qr0^@3hH!vUgm*`iPL8$Q$xv`-aBv_SFz#BR2`{lq8lp>PE3uCoQTJP z)7uAK4-a!5m>M`ST6Df!x^YtjK8@n6fBDkWHBy?KD9Q63yh2sL^yut8GdevoI8d7I zDvlP1Nw{}TjUepg4aN>^<2Y}~a1xZ_7Tfs2m>N1WIBl`N{vInar)5g9O=pooXLvgY= zJ|qAMH%aIUykmTbe96byHBMPbL1iZ}9E23WO)>PO>G7ko=2m2K_%A~tX1SUa1j-y^ z$L}o4jT*l}qSyF(syBozB6oV>%P+26b>kdQkc@U$yo>MRB+nWtiC7*V7$4PxbCq3HtCh4myrT0ub}N*XS?~67tb8kY)ygy`%;5CNd!AN{2>=+^K;Q0OL*2%D!Tzz)!|EthsENz{7h9 zT=#uvK+6XwruE?fn$&*^f@MF39PWgWXN%M%!558)$)q1QaI~V0XGRC6y6@*%;Jo*# z#AX-ocO$$NaHyy(jS*wVF)B%S(8dN&<5l!Bc`{TgFNzUe9AaW1`cNOVEDF}*K}gd0 z5ds|J_x|ZlsKJVK4?==?E0?5xq&R?EOsQM27u}t>A*yp=YDg|5gvOkz^p3urTcBg? zY)5cCpLQ{5-(s3cS8)(+mY&;-J|5>W`vX+xMNJC6c7vzuH_?yXY1K{9D3Po&djNF8 zGfcen4-AVqh|B94w-4oGkH|F~xPNiWElTl4U7URtk*Tfh!9KB!{QUtsV%_a4Q*s%h&VWke0 z#+YZtDi%8hBrG$eeIv!uA?ig|DkO_Ebr^g;8%MPy8>a=?9lg@|;ibJI&r=bos_ad? zlC{DosknTuvE#uVyi!K^&WzzZgnM}TsiaTGFh@EDc~TeZYNm9Q4u{CeZ8G#V-5w>W+L1`RB@vsIF&BA7ZA zkz`12FAX#K$RMMS96O%9t5h=QBAGcCDXbg!_lhJUjjMhougnmTE6~x#x6WR0F@$BuTk~9~| zJh@1aMeeRr$zCR!1(b2-%-b6MWBo1ATG2XQEuii*|S^k-Jo5#bP6!%{TDR)a>5glMhFa z^x*kO@$3k-U_8onm9wTHvG+ik8B5F)qB)pd3-Po}Ax;fxcTP;5#@yH2(_(5z&$KEK z)Mxc6MdKPpSZ(IZ!Gwt|VoZ(kUs<7;l#H!dg`9aNz)%N=P#wS>Z5<~uKY*EH1hYBH zX;F6fPfeVejAe8-kqj?R+KC12sKl5j?*=Bn5e1T_0uuPmHzG($2$lN61{|0e7>beA zIe?zCnRtv#SXs=LXwxJo=?o-!A@XRQ6Vu_|0Z>^ofgt(1o_OXeqdi856La4FqF77i zS*CL8ly2hi@1bzpf@H|l0a4gK^{3~kOg9TPP*>VQZfEPxA9io zvn2o9ip5F%bYtp&8|?mg#Jmh_9VW{(^60%{n5l;Mg=Vnr z4#JE>%LZ&RsUE@`4Az($f>z??4>Gb~0Ytk6-xDmRJ4L9=+LNFn>>HvcRU{+g-r-|X zFkcJ`O{1{!*_tQ)n5r%=DJi9=q`6W#&^#b^VEW9I4hR3{pU4yC4ozv2J=?D!>Wt<_ z1$fdBQX#HzKS}B&xrm^F^sYt{SuavU3Y)?dG^xNMS1N`KPCua6Wvyr{tY@&eokY*c z!!T#?u=bsrm@2s`Tkz8{A+via8>s>DDc2JdtM)lRC06K?qft*%1#!YGV7fVc2D0Gr z#3ZKfSf&^m=TBmmDxPq?BZE^DrHPZ%j%!f3$_&=lv)eS-;m&Ty6L^7D0Pa*O6~|7D zo{w?TF*(@-1psLv#$jC(rb{hc2|u<$fZE~(G$a&`3v9+~ODNq|m+%qXXKMP)WV~F1 zR1*`^tf~Y{C3zyshlq^j70zpO$@5k|p^T1JKV6a_WgL$_kta1@J%L5UE&K?hsIh1iVL0=#B$ zn&8t=m~LsBmQvM1mkgo6GC5b*GUQ_IDccqh*T6ZM3V@Jevp1}01Es?Q7%@W*Yl?E) zJtgVWhKlK zKQgu_S7$m#%*rJ0jlqaA_a7;9@B znP&M5qU`a|6pfs0f@(8yb~Y~+!4$b-7?~(#o|dg_6&$KX$0WfV_E|D${i&*Q)nux$ z{AP`gi?-;XSXuFiXN<0UY6=Ucl>8hdR5Qj)6ZnPEi6-LMgzQ(f_l=VE4~i~>O-srkH9=^Czn<~46Q?nW=_s8a9|ZJV8kOhHfzi{VIZh?Aj7@zcSPL2Zyw zMod_2Wo*}vW0Iz(qq}4U9LtFrkC6Te&q?AEh>QLSo%a|ytNp^>I!D13tX_2Q)P$}M z96mKMejc=YU}A7!lb=Tzn$fB7BxG z)TAhuIZg`(3X+vi)+Apj3aC6Wg)OGKQF;n!j4WJE4$8|}teQ;%){*-irv-y>DcHws z6LgM2Bik8lbt6OfyAoE~iuX@)h|7AX(j?3PT>g$%)v(kAMyUgKL>KnzQbbOtep$VrohtRD3qo+A$f=FW^;0-QU3iqf8J40_H1A zt)Kx1x$Xwr-QZR?RvLEGbgn{!P830J$`IWE4L1U%t;&M0jf|14!*KwUD0DGkEV)tj zhmy5)GC^TR_J#_@I0xvVKXBS$o-AOCTn(L=;$kcs3KAm45|sW4;c5^f|9zn4TYU(`D$2s}v$iVot zPh>o~e`GqW(W0SSnzu#h5r!O z-!(EYJdSm{kwJRMoH#Q)OnurX(>M?`d~eb526apq>??HbR7eS3YA!{$EG0_KgIE3j2iSV_z)(v;df(MhuKU`C%j(<2UI9)8FD69*>FA(iPAvHIi= z43wt1K7Rk9lXP%ZwvYfw<l-# zJ=UnuJTLa4vCxeInnsCEIZ|K`jjn97>z^8-l`HlfOZ9kPe@Fi*${^os1fVyTsC*XL z1Y*ZLpE66Z7E?wy+0x|HNU506M8z-4R_G0O_{@n>TEh1a491RWd{jfUK#txk0e6t` z@FAF*c1bsi-c9zRwa6<$j8W2whQJOB4<~@DK22ygt<`;?X($wwFEN0a>$Kh_yja46 z17}CzF^YcHLi{@t#`@_Lw48wNo%$hCGr!@p?#-{q+GCV;FWPUK%rT8m$x0%0?v0gg`n`tH1TcI@#eOEL(nd*dWE`YNlqD;hy1N6wD+uxtvwd|g zcZVTKIn(Lsk`MNZF>&W9&IcyRfnkNmYDIDC&{WsRFa`{27p1QU3)eL5Ql7K-V>*nv zj*5qAvL=Ebyn-{4D@qxJHT5DhIO!%4RzWArJ2V7Q^*GlOrYxgh9;rXbLx&1A`3#{3 z|6+J?8w(8>MNdfvd-rHjyln+;;VG$@L`cOlo0>rX1a*Pri_T)fS5g_{^iphR7xrO@ zC?ocax;UpsN1-poMU?<2?3kmFey< z;P2!_ke#gbE#*_zsy{H8|DlsdFbjkY)3!7*m#{O!lgtQFZoEc}Sb#BgJ{gdR5X|A1 z0BJ>_Pbx*2;=}?rS*Y#hv;i8YOjpv?Qj61`izx-Q0^*S&Fy`@LAE%Ib^2{id`ng1^ z^X2m;CbnU;&|I!8F7VDo2Pdud`I(7K3XZktba!-ImyED9J)|`6lkV??N;rx6ZK;$j zU!z%=ZyXpn4+-rlM&EA(wMeJJaH|B6q&P}DNAl*9C*^S%j{{h;j)|RGALT3hL581r zsFT>VM^v~TE*4LFT>`$%`>^agHds_q!OIGmvz~y8`b^uC?k)N3(18uOGDV7Sa&^kqi?~VYubsY zc0BO}oh{f$zSFsdTji^(+bU_c;W*Py>`r&R54e5UGv1BZ?Fc*Z+akHz5#NGRz)kSp zg1zkfkYX>MSO?Q>N6b#_Pw&R>Uc@})qQ*h&wVuQd_6c{dbB&-gcPmOi;&3@_;~hxV z>JB1(e_U@nPA6fRTky-;I`P|%um!O@5OW=#I`D*BTJW?3&wByQF8L#TTO}XsJ?l>R zdRN|oUEw9{_a49rCVLTL?+5mhW20xyjW|A}6VRQ(mm$}TJ@^waJ2V4gsFQde#W^R% z_#L(li62K^#!aH6X?F^{LYuK$d<)v^+K!@x(^ASggw09&no-gKVul5ZVdQ5ncg=2` zx#D5#LwRQa#|UaZ9AmAB+NN=$fLq#(9Q@mDwQb|s1^i2=#W`(&jS%j^|Ml(wN*k26 zuXk=oI?oX5WBGST+lZG5fm?HGtB@h~8fYeCpIEd#ld^6mK7*`n5lwd^?Feq<2UZ%ShOVt zRl2NOF^YRZYll%f>H7eFvDSy0e0lq&h9UNHcV(#hkrRq3%D|)&^&7nzR6XDrJ22i* zN!E#cuPgG?6eaQrEavBjg(f5?;S*MoqNqmE+}UKOZ!2#}9}d%%<}(2@_7EvG$f z!69kqq=eb=m-Ois9H+&An!AO&kb+z?TG*1x=?s#j%r%G6f)YybV7 zUvlhnbuK}Zo#cS&!rET1RM=d65{blAfWnjR9$BVKc`tt_9;-C3@MoiZ8;-9A7$ z1&mTYP62Y?lA%;guD%vu2HTxZoh{GZULFeaUG0f8sNHjO%TG?mlFRVJ&T=J^cd)#1 z{3=)Hm?Brev?`CYwM;Vxic)SnCA`P-gLcdIcbD|*8IcbvHB1I&p-lRFPbFASfS$1~ z0$w);nx>vo2Fi78m8R?we6hzUxvgH88o@?41`TPAQU*?1D2EW|`tpj(Y116u$|f9? zDAXXdOmb$=19CO2n=OaeXsizY8ecbVo-220Hib*^b1RFf?gYlB0C%p8b>vvoDO6j; zVtAaAbOcLAplw-s{5^ym?13@-{|R6rSMKU;3Q`-X+4Y9yRC^BP5hXJ9)LcC)%B6CH z)yfUO9RWntK{!C%4^$Y8H&>;zhytNH3|-g3Fz@vydP&n#^WI3h2ynyEj)zM1f= zGUH?8-15yGBmF`N#CDbvI)J5aeC14N3eP!=teY)|yS*9)!f)x44ge3t%V@sN)s<4Z ztHbijJ-1O4Z!7nOal3JbSymTE`u57{*%RscRf#q1sFcIvcVjM@&FMPq>ukRj<@KC# z&3+B%1r71xaH^@m_XLzOEa5{shueqh&}u(N04xkTVC@QmHml zLaqnP(o2dSR#D*#!JhbSkMaQkU3%xQ59hmbL!=5|cDYT&4CiS7_ z6vmom-fh+{v!FFgZ*q)z8q>Ks?QLPL&7!Z<)&V`My%m-=o(WFs3u{d02`qIB;SvRk zbERJJAZnzX=T4wZYPn(0X5s8Zsx*Ao;%kvpbs*KTSq^m&Z&g$5yW7e6JpMKX{jwQl zm|d)0I5bOTzwwmi^*D1`-zW{XAttt&6|*)#N?$)tH-VFcHD*WLAaFoDTJ0Qt)auf? z+|_l^VK_?D@#(tUigIaO<9=Xm0%Mo@z8kKC9nin0OV|X;NaL8=Vfp!|7oFGrr*_5+kvKz9DWzj-IyC7%$BZ$EwPe8$QsAm>>s$7rSZz#LwP)n1Jz7RIg z9my@pO{vMTuO?GmA>fYS-PyF&c%qH4QfAyXOKn_NN!OI(-QdJ$kk8ef26UWfJFMQ6 z!0))Ov<>S3o1kT#1I^z6nXAv&a0Ed6YIANwxfwvS^bd6k$~?C&JsQ>n9&!uv`Uy>O z1>@B2M*c)eH;EpW+;#jW^PLS@ZNE%OtM{YLgQzuEN5ekheVi@0I?fc&@M&Qu+KRQP zhF<(0L=0@f3wsd*saDquIK~Ax#NWNtsvd6KongORw9-X~P{31=rp?+mHSwlXO|N36 zSrjUQVv7K}Ji;_=3=L!F0+CBXqRMqjkVG>HQ!pim$^Zrm3Fs_HjrkN74kMOljc01I z4lg44wH<7uT}nz54Tqd{DVHkOQw3j5WyKT~9i}wc;mcw&J#V6OiwPsmAWHmhF$bJi z=iOSbTC$sSisj4`UN16`G+4zVGz#j()GNh)g5rFBWipy3;1d0{*jZ&o-fOE%hA48J5Y#jnnKK^}>P z!-(f3`h=^qp*7h-N9H&k2MLqspTe)&0+onL8FF?j%Tt7_L5-=IrPj(h%zpgm&`H&c zKGS;DPMC(Cb69dHPux?f*13)O@A+W{Tq0e%JvwAL^9-@&KwacQmNxZmPqPdtKakia zQn;>8=IJ4o8!aKH)mExCH1!?SM(o?#2wTna$)ibo=kPp~hV{l~)Er_I8((53V`~&- zTGWoY!jh^D)JM&oearR?;Cm(oFp;HY9XG({W@VwIBlc%WMuyquQ}x`OhY@G!p~fM= zI*1nAh|-yijsB!2z)5->hjiSEIW4iG{2@sJyt2pii&Az9g7`bf8m%_eYf|4+^Wxpm z`tKKv`B|BRbw+8B7~`CPrLf(Tcqc8h4dg>)?krm|q!6i|plNkx%oJWMkmCH`ZdlA& zv#zdkY9D3h3Ktf&??Ryyy#1%Y|@p@@H<XDY%tEYOjP{AfbyhkW0JW0|E_DlgPtLiJAcjaa9kl|KtFYJ(JHTe@RN z)wY26T_F_K3O^Spuf|G!v6|PGFB9@d|EkIH@_hn`UT3-a>mfdmxAM>^|0+k<>GY;l zdtEQxC$SbI6wXoLX$(*e=VxD+lER5`a!t3il#Clv+F7X6twM98C9eCDdn<*xrdCi` z#=ELfzv*n>)sf#$a@@$%AfFm39Vlg3lE$A(QjEzHb(qK*aTpq!sT zsQpd-WE>o}h^Yzx+|i>6teiD-qM}-l>hP>8^P%)E;r<)f(Sbgo z{z2VCCs4-0Ov<+4oAIKOXaU$Hi8iwZH@K)LTW?6;`rMDQO&2#xFpncot?pbK$~7B6 zz7)oIDkZiELpZnbUNiu38H9g80O&joRzyfFbJpY!PGJ%v;;gSu~4QE=v>AWwGD=&#=Hr58I#AcU=h_PMx?)?v~=PZ}j!tqNEd>_hYX*NSi}iDyW3<;8*j;%tt&15dsf>debVMW zhI%t)pXmb(?6-~5y;;stp7;4NG=QAs0&F>nTNjPar4Ncw2Z=8s^li72hc+JitT}>r`|bwfo79 z+Y>S+?dCiqB<<%J)eR6UET3Y;&2MwB#6+7T>@XlB3+3XDy2kb+1xbffB{FkatX{}& zMi~oR_;oBuuXae&c-W`eUZs8@E4eG;j-POWT4)@58{s zeq5{8iK)~Ez+hLG;KOFMi)#bk*K)SuaWSpuld4lN`LU5tB#x*HMLVUP7!Z`^X zxhAq94l(}cvJS-f>a3yoAaF)%bgRQsNL!>QnsMBoHo%cBi3(`-r6RgNBKOK(l)~OO zF3eKL;2=J?QnR@`n0JM>Obrek52v8y&aFgii{|ZP&dqlU^{BE@)jZ$c=B|P%d@mNt zdmzNR(6e25Is&t}ehK@Taju5{uXSz>zds=IM^zP46DQLTF;&BzcviE5oBwJ|r`<}U zw$>EA<7RG*G~`&@fmVksl`NMdoaxciO)cnmGTceTDBVV@yHOumjba8DB(6tHMqFQO(@*P!NmqubeW1v$3B+Ja>VN`h+|j}X8VS;Zxyw~Jm4h8aWs$o zn+2+LCTb}5$w*WODJNT$U2}k>t-5SRfYQ2VAdeusntEKAdxLu|%FZ(|HnbcA(;==T z((Iy|*McNeC9&0iKXkKDCSR^dchFGcBLD)qLZvY!I+i!w_AlHS` z;>xW_VW$oY!;X1V#o z+-o2(SJa_*PlK+=VhW z)m+lY^?SQ96(drhhmGS;ITClL#WUo^T8~<$krsGTTeXzBkY54KeEzzP>`$+cw*c$9 zRz*e1#t@XL&N|dYMU&I1^}=#h>pqH+MS(`fOYNQ$C6=lFemWcF7=qxr(ZmT;QUj(y zOqX&TJmCPw-G21dX4G>dQVG=XxyYxUL!J9Cw$5hUj{YF(B)8&xvKb4T*m1ayy_3aN z3Pab-4MS&8BG;Ajttr=b^wZkPEtj%jp_{F&3T^7?1g^V*ZB;M%+z06B4Z;#HLREpC z{33JgYQ-2I0KC@I!hamr~D+ee%`sA9Xk8t=`6u zy<)BFSL6xaIs%@xO|4e>5@=NlmEynyWNB7TxNGui{&9i#c*1|ko7m&7fvSJZ-)ry= zmCMKAeJv%Xa+~{+;}(4N@3(-aZKdRR>dPKb#sjGsOvtu{I*O(!pPNdWrgfW5H(`r! zktt3mR6g>GZuI#KHtozOc7xgiYv}e+32v5Y>25TZ4hCcAGK9&2EWc;{c(UqWE=&6 z)PIlRt$Mk}5Tl+vaj3{;hipo98RsL~8XB>vsHq^L=o!ZHPCkya8_q#HKq^{VHdmey zZvgpulG_u%VW_TY5u)|VLNkWFxt~UjYAPc3G1RfiZ?5&BI zrpQA;R)&Kg zAgv!f`he;I-5bcxscLToO1vem8GTEIwHc^0Yuv^-&j6M)n7;)=lH-q)Sc(OTM6H|i zY)efwkQ3(?{4#9`T;(-*qJ?rJppMq%n;*6eO}$#XlpV-XK>osCQt)wf>mi{Aw~O{p z8jrO+()b~wqmYF%~ZG*j&T=lCZ`Jjtlr~s341^n zGP$qg@;&?4!2yCcW2*OafusZ&#-ZqEYHnmHNttkZO8@2I5L+?~C#pob`IJnqJ&k$x z6FCR_e-p5hEd}%y=P;|O@<&p_CZR6&JT28G$*bqsk35`oG6yac0?z0R?DiN{s*N_R zBRv_?eB}JJq0*3o+&j~4>Vz#gOHFF6_fQIDciNc9_RV_8(yNlzu_vewGB(>QZrIAO zk!3W^@y9WCM5wtFa?R{~IyvR2U!P!&<&u({K|MNkrtM#`L0F@uR!>3!m|$e*1FZYX;A(SX-l%5z0oxD(Gfg{;OJ{b;W=arz4`^ z26+;iArbUHx1(Ry&7Pzz~D z^~}sV&LJ(!;10)=u91Y6b&jcWr7)gt0QL2hA0g$|Tf%;4ZZ%jK|8!$%u9c52WjbYafA;hPHU{%Lb%&i$N z*<=NtIm|Bfh(@)Y9#4k*9yCNPrRBf+lU~s2Yx7nIlAGF;Ksd2l8WMRv2g+F&b~;Nq zBI1OLs1#Eusf@A_=0O=12qD|PkO-`$8A9mv?5iA^9)VDzGSdS#+@0zJPnPb+>Sb{F zbf!d2koPv`&64$NgT0K%8SmqGJzuS<<&(~N6aCBd$_oqFCt9*@K|q}%Fsh= z4SR++oeWyfc<*=np2lmc=i-THI4&($SSm(Um6T!mNZFki5_{2)w8xa=UOZ!}4_`V1 zQH4@EUR)^(J+07gU0x6w#?{8|cGo*{0 z69C${ycn?jvo(?fh|7THTj525mTa?!+0&_Hc753)sJd&lIzr~GbCt~SJZgi$ek(JI zbjJ|tG#La8Ll~}=$lomFq0X)NR3@SQsQ#)1n=oq6;Siw|g=Fv1T;X=_K z*a_6JFg!4X7Eq$4oLx>A&9rh`Vr6P`HcQB%~GXQq{5Ll>>o#Y^v` zN=zJyA6aMG%OI&O@hqnhMhOvWCAQ;DQucQXQ zGo3s8mWL^}Vr_GJaa3}D15Cg#cebPkF@t=jmIDkS!>?yVn zp^Sd?Cqr7SxC~D_xtlKne(eUlO@IpWwqC*Iig4kUE+Z|#bF?dr?L>ZaY@h|(`}uK` z0=KD*A&#yX>tS;abK?E>@Le(XO7vq7O7!!Vu*7iTh*ra^0Kca*lz3bD5@{FrK0{n( zN%xO`GsO&Lohx5f7s@KXZ7W;qRaIqJGkU~Nkd(b~;o99(zFxYhgd;Uv)bjB2sj}S` zrQ?WVzZkFii1YjsR=Q08mM=YRy+j=q`n8;GIEyo_hjsXMDU`V4F#4J9ICKc1MN4dl zt8K$jIvx%K^M!sv-=q$@pOZ>CDWD?+rM_4k;U`GplZ)>oRnzr{_UK_uOKFkbgq)jU z@70a!E%DQJ_)=}Tw;#1}q7>~+`_-Pq7(Ryy106@`)SF!>RLB=Lo)Xx2|FEP~12oa-W}eVOIq^_%n3YcGYWX2IXVJ7>kh}9M zk10`?IL4~p=eNCuT!FfYx{9%vbaF%KKyT5oj`iq2-xOM*xc&#c5oStJ-PMrIru#4X zRegU9`JAznoXlgLMYAMZY&1-eS%vd8b-()U}@#kdqOme5MXb zIeapCXBS(CaRa6LMAK81>6w;%l~w4T1npY#Y4e`8vBC7(BXoJ<$^xlPJeX(RtU%}> zWbdoVzC8APL8_sIX)K~Wg8lJ6jqwVw7E*Yn#vu|c8>NPdst;E2R%pDD9WPrSAJ^fuilyD zGLO-Tyc?POpq1|f^Scx3A}4ed+m4+K9Tu|>D<#=ci{c9WQPE7fVn){+ z>Owp+^pN~=vaV7q$mpMvU~_tACn69BO9|b4XyobD^u>plN#4- ziWW9YJBv8y>T0j_0=+r7>PmopUBo_d%&vQaNMms!`bZN@V9Bh7L^ko#i7)DbV;!RN zN%iF7SCRm`lUTMU`f5pm#4%G5_k2^lvO!#uBKQE#NK^@u#Th7CA-gvO#z@=HU2dRg zDMn>S1&}<5+(1PqJEDgjPVDi?N_I`zA&BugUp)1%-T+=f=2cbyxq@=V*d31-CWoMd zG-fO9mAc0BX1M~lxBS>iF%B3$`WgDsazIQQ~xHX z<+f#{?w)(S7e+zsq^4}YNs8EV4w!B+){ZhUBkINp;#LN6=*!m zmo1(%k5?)(T}>y@!0Cx-F6Ya8@h1@+q^{4o-W zbIVUxL%%taR7R;>f(EM?Y{fE&Va4KAw4EuElcZ$;p=*hE5B?zs&q@j%a;J zUB9P%`>70ZeN{QU4swb@PE>VmTL$5cm2xwmp2o*X8;3`30MC56eCDjAEGPMR{AOC7 zb_7ygWxd~;-3yxFRBH@UZ%kCDeE^BaIFO@q$v<0KxjHRRE3}*JQ9~+5{_OwM2KB+I zk+dY{9VoRW41>O6X&hcv9SQwWsbO{<*iwguZi?rv5s z%j>1##=Y`BEaCQt=!yZ*Caos?&q;j=)1!E+#|HAva05O$BRgjRY2qzVI1H0!p7aG_ z>_%$STsz}&0&F>17-LkAP;WGy>6<+&y*bmC*y-uY17olza!qy*FpU-Aal_O8APBSdGI{md5?Yb8w;xLxn7q&;ftWD>kQb$eP%!h7(yRQArpbhMdjEGE} zR{b_ima?`>dgl_0gZNL(=B=CIch|_-A?H$knAp2II<(Ni!!0JY`Rmo(HR*TaQ!Oa$ zLA6oYF-ESt2YIc_!3F1VP+n_5_s^8$KbN-0}V9@#a`p)@n$ z`fku6A?B<}X-DU1W_G~|vuRGY*d?wouVNKTO#zAQE^YqFyM@gyFtyO%guQ?9}+9(oCF&y>^ zF*og^&TOrA6b-3JRT$z(EwoBo+;GY{E%^Yac##}oWCmgQIAdMnB(_zWcdEQKC>6-_ z%%dIB?YrI00NLA;iPD?lRi{QpvL0HcIb8_Xd`ZxD*bJ37qCyEyC6N*x&Bknknj%U5 zBtSY3dPXXSzDo-V4XGT7YTrzQ#w7`Fiq%;FEvB5}vhU1V4X|oni49|%Y5P%|MU>~i z&A6a~)Ryn#jfm4Z5K*&HP(Zms-k|7JOXx?C6U8+ z92D_tkdg@4y0Ao=7PuukTEorMiaTPB3pIg^*+_~vYPIkCkdu5YNVnQBO!vr5;PBUg zIA!hfDA)e!y08~=ius1{#F8l0*~6Q$(~9s9$~d9C;|dKA^Y@p9wu7ZxRe)=wu`TDC)VQHVHCL@rL^POE-vL|rq^Rn(sr!b>BXg7yW5AjEl9O9 ze#Ql&xXgqXh*IJl#O?|jTkk~Z7VZUn@Hvp$cA#`x<95O-$4g3CD{aQSuJn4u>vg3} z!`iw5$#wX@9e=zobt~Yw4!+H(Z8293$gg#izw0B;w5B|+G`_Vg&ODA=1v>%8j=$J` z(5XiD^3+_9H10zS*t?Vy#1DIb*EDvco%|!__r;jnj;|dOw+q;ycQ<>8F}slGI;7ez zVK?#sKQn)kKlHi_6?tO`XN$hEBtnmh^&n|g_qd+KZ)r;zO&DA!q8dxpkn2!cVx;0S z1|^2gJB$BZ7gAND4e=#mM@rmnXqqkvv)+EBQw!xbXDG46JcN|j zY-|Tr4x)Rm$A5Aaj@ls*pK=w>7g~^F8@`i{+4)-}%?XLQ4kSN5fGq?|yy?Fh9rrrVAfUam}{KY^SNRq4_Y{%GcXzPVJv%Uf^tbQ%>9X8IzH zQgD!QRL)6PE>840)!!)3q-c&#is)ehvvTg6Ft{J_03HUZlCPT`ZZ@#8>B|E{t%aBM zaw$zoBV7xCNIW-pgA0{ABCiKHC-TBUFk4EOc%HG;w1HpkeTo>$F-k;oPO|`FfZy!# z!Xr{HI)A_*vblXN%7loO%4ys~9+GUTLx7n!bi&V`qavwoGc6&Fv2-iulG`QzuRI=? zb&cm>y$Lm|>5MI@oXU;)mZSv;?G&8jP|qhbVyk#O=S?ns2{Ox{Yfd*&skUmDCEp}$ zo;qi~uIl;RaHaY}@ffn&n=r4|%arqVRnFsN69nthivZHA2{&Q%Qshu8vr@Au+ zu%5i-pt8ugxO}eWxC`Mv1mH`Ic{^5&8{6m&;0 zl4!BAk?L>l2urP&DlDxJCFx3K_8R1{v}&nBCBdibz&IHOCb@>ok)slmGimmG^>nVq z}veR$(~|yv?Vkg-K^1RnlM0^n^lXd<7+HRz(Z*#Rrs2hi*S}6^##y z@T@MSlmkBqp5~<#MJmN;l%h9tN8+5(u0+_2kwzttml=e8*@1XCh>v9--kln9KFhVGS=PcPJ$*s~MH9g@%+3cv-b$>#LLy=ng6w zRF*3=B^i17u`yf9kkeH5FScBJK3*{FM?w zUmANUeds24N3p-mQWjr4ws1YD89XM*>&q~?j<1U;rGocl3^27$?)^2nA@r1N;TN~g zm){oqWRZ3#n`wVGNLXLlHU=|>^vpQl;&SZ`3>t}S*Eaap`T2&A^L^}F><_!lwmAIa zYW4=#N?7i2S428@`it9R__Ca7eC|u>u{ms~G?Lly1>CRIwztasA=DY;3lswEcMBi( zYl_4_Eu-`-(iO!#wFTHu3_98_a(L=LoZhRRM!hLJo2{10b*3@Z2S`r9xMhYW<_%k< z+Fv@2OW|v_77}08>vVE?Mivs!O||X&rNtZtHaopZMn(zii6)82&54hUu7)v1aQvKIOf@M?$x06 zA?%%UxUH0rbl4_m*rn^{T0Pg$(^O}1Sx%g7rRUz+FD}y~#0Nb$X#fwYy$kiTmHz6k z5R!|@rAIbUTGLUMvkfk9rui`EY5r&jm8Ipc!U7d;HcYV(SV2RX?4dd&7L5trE2Bwe6|Wt=DMJo6>`Q@Rz*Y!+o^V>6E>{O5yZa`vDI*iFkc8h=8M7WOXMW&m9whj* z)m@$Ds5s7Ud4FlJUE#oj*vqOYyeIkPn9+tOgL zXxv#Ty}4l7;x3)M!dine&R^WU(2DPqXfMrHsuZZBZ`Me|iYqhTus^xTp!v#wbF)C4rnnaeZ-u+Ok5$JN&w0^l?oejj%!&&fKWezJwsXPD z_4#4e7!NHH0Z!zk>rrx@WoDN6m|%X`Bj8R}nZE^rU-+ zF3{S;bfVT87^648(dB|~JhD>vxAAS8ytzB;GWeyc;y2FF0XGeiP1dsgkcNnNExTjnMyI;bEiSoG;VTlWV%F;37+Z1{Nxqh=^~px+Qu6ybuq}N&X&oQ zLXSIlHJwAcpeUpzfnk)c84%)q>5})x)7#M8ZaMN$=4DffWwwH&N@N_D; zbm+MxJUupwVFP{BR>uW!E@f}U^7c-Iu5KJPaT4HGPokwXTv@Aadha^&l-LT~vDKt| z-E2bx7q9vWm*HA5Uc@V6L+EbGiI-AgD-=t%wF^^G*IqddxjYRs#Z>9;no2nowh$7x zu2R}V=wmL&yPlmW{W{RcRlZc02X zd7Fz+(mtfv4m@|Eq+Lkc1#Dl3^el;v16ooCV(8km4|VLr_r1uq1K+R56Gu(dLx&qW zDbWq59dU$-&PXhiE;xhG>spX{E7H(`Nq_mw*6hQ7wq`F%+J*ddexPH+7Afg^sY6R* ztJx;T?LuCKsRMC5y0IHyw@O>Kqohu>k?uYF@Sm?{@1xzJ9fQ@2cxjAo(IRvaRcP2U6Dx^;snna+eESJu(4 zW6CW)gRg-j@){kTCgb=^&aWKb?IA~~0kJGh_P`+l)!xj05CrAALZC?u?f4#2LBI4i%kuvw^?BhZfYxE}i>={iqy0x@_F z_1=p7qr&^>ak~jm;rCnQ)Bw^Z`+@NCkR)tSsGH==P|i!ZD9vdsWT~6r?yrVF-Vj(s8Rt;~Pg2k;x)L~gjv(d) za?odt{PL9KPWQC!DJ7?;>$Ih`EB~ZLM>_%CtMH%OED1mT{>T< z)Ye-n$wmFVl6c}9TgJ^W^)aV(z2&f#9_cKJBX2T>M|G?0c-I~yZQ?SC)!CkHMZ4uo zBRPb5jJgKZ4>%HC6UU$}sZlS6J1e#j*>XDjn=T5JJ(I)=?mFQHqY`qtUM?9ZZk6*= zrw+@@-(7EKrkI>!KIOIUzJ8%#-PU4wCbvo7F6HOuZ5TJE{Was6?HLE8ej^KERTnIS zZy0bZS3^4==#`c*y`^Noa_0cY630}wZXIdqnpM)KDV0!G8)x^dI zLhTE;Fg|E)=GXL04m}KGzj&n+aeAVP4)SoK&utRyqEUboqRWoNP_WG`eXitYx#8F8Bs+lCI=3>aMv4ndL&tGyaQcVS;%YLc{)EA)hV z2u#&a72RT%?^j~nYSvEXZ!1NK8eT`%OQppvwWq_VjUB7EZkDsws#?zyO;JzswC@vm z*j65^!!&*;2dB)sW*(Soa4nyTNS1|xb~SCo6bfW9jN=Lt#TKo$s`_J+Hft)G9#&1I z7c-%(%^LtC4SmEK`!GBGRoCt7F{r8P(sZx|3}Kf%@n#3cQkivE C~-i(lxIZ%$p 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 diff --git a/prebuild.xml b/prebuild.xml index fdd024abde..7dec8ba788 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1,6 +1,6 @@ - - - + + + TRACE;DEBUG @@ -9,7 +9,7 @@ false 4 false - + bin true true @@ -24,7 +24,7 @@ false 4 false - + bin false true @@ -71,23 +71,23 @@ - - - - - + + + + + - + - - - - - - + + + + + + @@ -108,10 +108,10 @@ - - + + - + @@ -158,17 +158,17 @@ - - - - - + + + + + - - - - + + + + @@ -190,9 +190,9 @@ ../../../bin/ - - - + + + @@ -216,9 +216,9 @@ ../../../bin/ - - - + + + @@ -242,16 +242,16 @@ - - - + + + - - + + - + @@ -270,8 +270,8 @@ ../../../../bin/ - - + + @@ -295,13 +295,13 @@ ../../../../bin/ - - + + - + @@ -324,9 +324,9 @@ - - - + + + @@ -347,12 +347,12 @@ ../../../../bin/ - - + + - - + + @@ -373,11 +373,11 @@ ../../../../bin/ - - + + - + @@ -403,11 +403,11 @@ - - - - - + + + + + @@ -429,13 +429,13 @@ ../../../../bin/ - - + + - - - + + + @@ -457,8 +457,8 @@ ../../../../bin/ - - + + @@ -480,8 +480,8 @@ ../../../../bin/ - - + + @@ -503,12 +503,12 @@ ../../../../bin/ - - - + + + - + @@ -529,13 +529,13 @@ ../../../../bin/ - - + + - - + + @@ -558,14 +558,14 @@ ../../../../bin/ - - + + - - - + + + @@ -587,14 +587,14 @@ ../../../../bin/ - - - - + + + + - + @@ -615,14 +615,14 @@ ../../../../bin/ - - + + - - - + + + @@ -643,14 +643,14 @@ ../../../bin/ - - - + + + - - + + @@ -679,16 +679,16 @@ - + - - + + - + @@ -710,26 +710,26 @@ - + - - + + - - - - + + + + - + @@ -752,14 +752,14 @@ - - - + + + - + @@ -767,16 +767,16 @@ - + - - - - + + + + - + @@ -802,13 +802,13 @@ - - + + - - + + @@ -829,13 +829,13 @@ ../../../bin/ - - + + - - + + @@ -857,16 +857,16 @@ ../../../bin/ - - + + - - + + @@ -888,16 +888,16 @@ ../../../bin/ - - + + - - + + @@ -918,11 +918,12 @@ ../../../bin/ + - - - + + + @@ -930,10 +931,10 @@ - - - - + + + + @@ -954,8 +955,8 @@ ../../../bin/ - - + + @@ -963,8 +964,8 @@ - - + + @@ -985,8 +986,8 @@ ../../../bin/ - - + + @@ -994,8 +995,8 @@ - - + + @@ -1016,8 +1017,8 @@ ../../../bin/ - - + + @@ -1025,8 +1026,8 @@ - - + + @@ -1047,8 +1048,8 @@ ../../../bin/ - - + + @@ -1056,8 +1057,8 @@ - - + + @@ -1079,8 +1080,8 @@ ../../../bin/ - - + + @@ -1089,8 +1090,8 @@ - - + + @@ -1111,8 +1112,8 @@ ../../../bin/ - - + + @@ -1120,8 +1121,8 @@ - - + + @@ -1142,8 +1143,8 @@ ../../../bin/ - - + + @@ -1151,8 +1152,8 @@ - - + + @@ -1174,8 +1175,8 @@ ../../../bin/ - - + + @@ -1184,8 +1185,8 @@ - - + + @@ -1215,11 +1216,11 @@ - - - - - + + + + + @@ -1241,8 +1242,8 @@ ../../../bin/ - - + + @@ -1251,8 +1252,8 @@ - - + + @@ -1276,23 +1277,23 @@ - - - + + + - + - - - - + + + + - + @@ -1313,20 +1314,20 @@ ../../bin/ - - - + + + - - + + - + @@ -1346,19 +1347,19 @@ ../../bin/ - - - + + + - - + + - + @@ -1381,21 +1382,21 @@ - - - - - + + + + + - - - - - - - + + + + + + + @@ -1403,24 +1404,24 @@ - + - + - - - + + + - + - + - + - + @@ -1441,40 +1442,40 @@ - - - - + + + + - - - + + + - - - - - - + + + + + + - + - - - + + + - + - + @@ -1493,26 +1494,26 @@ ../../../bin/ - - + + - - - + + + - - - + + + - + - - + + @@ -1531,7 +1532,7 @@ ../../../bin/ - + @@ -1542,9 +1543,9 @@ - - - + + + @@ -1568,9 +1569,9 @@ - - - + + + @@ -1581,12 +1582,12 @@ - - - - - - + + + + + + @@ -1610,11 +1611,11 @@ - + - + @@ -1637,10 +1638,10 @@ ../../../bin/ - - - - + + + + @@ -1652,9 +1653,9 @@ - - - + + + @@ -1674,11 +1675,11 @@ ../../../bin/ - + - - + + @@ -1688,11 +1689,11 @@ - + - + @@ -1709,8 +1710,8 @@ ../../../bin/ - - + + @@ -1718,11 +1719,11 @@ - + - + @@ -1739,14 +1740,14 @@ ../../../bin/ - + - - - - - + + + + + @@ -1757,17 +1758,16 @@ - + - + - + ../../../bin/ @@ -1780,12 +1780,12 @@ ../../../bin/ - + - - - + + + @@ -1795,15 +1795,14 @@ - + - + ../../../../bin/ @@ -1816,12 +1815,12 @@ ../../../../bin/ - + - - - + + + @@ -1832,16 +1831,15 @@ - + - + - + ../../../../bin/ @@ -1854,14 +1852,14 @@ ../../../../bin/ - + - - - - + + + + @@ -1873,11 +1871,11 @@ - + - + @@ -1910,11 +1908,11 @@ - - - - - + + + + + @@ -1934,13 +1932,13 @@ ../../../../bin/ - - + + - - + + @@ -1962,17 +1960,17 @@ ../../../bin/ - - + + - - + + - + @@ -1994,8 +1992,8 @@ ../../../bin/ - - + + @@ -2004,9 +2002,9 @@ - - - + + + @@ -2026,8 +2024,8 @@ ../../../bin/ - - + + @@ -2036,8 +2034,8 @@ - - + + @@ -2057,26 +2055,26 @@ ../../../bin/ - - + + - - + + - + - + - + @@ -2102,21 +2100,21 @@ - - - + + + - - + + - - + + - - - + + + @@ -2141,16 +2139,16 @@ - - - - + + + + - - - + + + @@ -2170,25 +2168,25 @@ - + - - + + - - + + - - + + - - - + + + @@ -2213,20 +2211,20 @@ - - - + + + - - + + - - + + - - - + + + @@ -2249,18 +2247,18 @@ - - + + - - + + - - - - + + + + @@ -2287,18 +2285,18 @@ - - + + - - + + - - - - + + + + @@ -2322,17 +2320,17 @@ - - + + - + - - - - + + + + @@ -2356,22 +2354,22 @@ - - - + + + - - - + + + - - - - + + + + @@ -2392,20 +2390,20 @@ ../../../../../bin/ - - + + - - - - - - + + + + + + - + @@ -2427,22 +2425,22 @@ - - + + - - + + - - - - + + + + @@ -2466,27 +2464,27 @@ - - - + + + - - + + - - - + + + - + - + @@ -2511,13 +2509,13 @@ - - - + + + - - - + + + @@ -2528,15 +2526,15 @@ - + - - - + + + - + @@ -2557,12 +2555,12 @@ ../../../bin/ - - + + - - + + @@ -2583,13 +2581,13 @@ ../../../bin/ - - + + - - + + @@ -2611,8 +2609,8 @@ ../../../bin/ - - + + @@ -2634,13 +2632,13 @@ ../../bin/ - - + + - - + + @@ -2662,13 +2660,13 @@ ../../../../bin/ - - + + - - - - + + + + @@ -2689,13 +2687,13 @@ ../../../../bin/ - - + + - - - - + + + + @@ -2716,13 +2714,13 @@ ../../../../bin/ - - + + - - - - + + + + @@ -2748,11 +2746,11 @@ - - - - - + + + + + @@ -2784,9 +2782,9 @@ ../../bin/ - - - + + + @@ -2810,27 +2808,27 @@ - - + + - - - - + + + + - - + + - + @@ -2851,16 +2849,16 @@ - - - - + + + + - - + + @@ -2880,16 +2878,16 @@ ../../../../bin/ - - - + + + - - + + @@ -2917,9 +2915,9 @@ - - - + + + @@ -2944,8 +2942,8 @@ - - + + @@ -2961,15 +2959,15 @@ - - + + - + - - - + + + - - - - - - - - + + + + + + + + @@ -3007,8 +3005,8 @@ - - + + @@ -3024,15 +3022,15 @@ - - + + - + - - - + + + - + @@ -3062,11 +3060,11 @@ ../../../../../bin/ - - - - - + + + + + @@ -3103,12 +3101,12 @@ - - - + + + - + - - - + + + @@ -3143,14 +3141,14 @@ ../../../../bin/ - - + + - - - + + + @@ -3161,58 +3159,4 @@ - - - - - DEBUG;TRACE - false - bin/Debug - true - 1595 - - - - - TRACE - bin/Release - true - false - 1595 - - - - - - - DEBUG;TRACE - false - ..\..\bin\ - true - Prebuild.snk - 1595 - - - - - TRACE - ..\..\bin\ - true - false - Prebuild.snk - 1595 - - - ../../bin/ - - - - - - - - - - - diff --git a/runprebuild.sh b/runprebuild.sh index 3e1417aaa6..b3b5c9d1d3 100755 --- a/runprebuild.sh +++ b/runprebuild.sh @@ -1,7 +1,4 @@ #!/bin/sh mono bin/Prebuild.exe /target nant -# needed until we break up OpenSim.exe -perl -pi -e 's{OpenSim.dll}{OpenSim.exe}' OpenSim/ApplicationPlugins/LoadRegions/OpenSim.ApplicationPlugins.LoadRegions.dll.build -mono bin/Prebuild.exe /target monodev mono bin/Prebuild.exe /target vs2008 From f7b28dd32155eac2d55ccf0757b059794d6b5f67 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 7 Sep 2010 03:41:29 +0100 Subject: [PATCH 02/35] If a scene object part UUID is changed (only possible when not in a scene), then adjust the inventory items to point to the new uuid as well --- OpenSim/Framework/TaskInventoryItem.cs | 10 +++++----- .../CoreModules/World/Archiver/Tests/ArchiverTests.cs | 2 +- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 10 ++++++++-- .../Framework/Scenes/SceneObjectPartInventory.cs | 3 +++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index 2cb78957f5..df5b936126 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs @@ -348,15 +348,15 @@ namespace OpenSim.Framework /// The new part ID to which this item belongs public void ResetIDs(UUID partID) { - _oldID = _itemID; - _itemID = UUID.Random(); - _parentPartID = partID; - _parentID = partID; + OldItemID = ItemID; + ItemID = UUID.Random(); + ParentPartID = partID; + ParentID = partID; } public TaskInventoryItem() { - _creationDate = (uint)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + CreationDate = (uint)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; } } } diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 58698ee189..32b3724ab4 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -215,7 +215,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests public void TestLoadOarV0_2() { TestHelper.InMethod(); - //log4net.Config.XmlConfigurator.Configure(); +// log4net.Config.XmlConfigurator.Configure(); MemoryStream archiveWriteStream = new MemoryStream(); TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 3ed74e1f36..3753dcbba8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -494,7 +494,14 @@ namespace OpenSim.Region.Framework.Scenes public UUID UUID { get { return m_uuid; } - set { m_uuid = value; } + set + { + m_uuid = value; + + // This is necessary so that TaskInventoryItem parent ids correctly reference the new uuid of this part + if (Inventory != null) + Inventory.ResetInventoryIDs(); + } } public uint LocalId @@ -2756,7 +2763,6 @@ namespace OpenSim.Region.Framework.Scenes UUID = UUID.Random(); LinkNum = linkNum; LocalId = 0; - Inventory.ResetInventoryIDs(); } ///

diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index ca089a1b94..87c48608aa 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -119,6 +119,9 @@ namespace OpenSim.Region.Framework.Scenes /// Link number for the part public void ResetInventoryIDs() { + if (null == m_part || null == m_part.ParentGroup) + return; + lock (m_items) { if (0 == m_items.Count) From 910aa48df3efcb5c1baa6429b65dcfd05796e2ec Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 7 Sep 2010 11:13:37 -0700 Subject: [PATCH 03/35] Corrected SimianGrid.ini and HyperSimianGrid.ini configs to specify services in the way the ROBUST loader expects them (hopefully!) --- bin/config-include/HyperSimianGrid.ini | 12 ++++++------ bin/config-include/SimianGrid.ini | 16 ++++++++-------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bin/config-include/HyperSimianGrid.ini b/bin/config-include/HyperSimianGrid.ini index 87ffe69f0e..49ba2ca0d7 100644 --- a/bin/config-include/HyperSimianGrid.ini +++ b/bin/config-include/HyperSimianGrid.ini @@ -21,13 +21,13 @@ Include-Common = "config-include/GridCommon.ini" [Modules] - GridServices = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector" - PresenceServices = "OpenSim.Services.Connectors.dll:SimianPresenceServiceConnector" - UserAccountServices = "OpenSim.Services.Connectors.dll:SimianUserAccountServiceConnector" - AuthenticationServices = "OpenSim.Services.Connectors.dll:SimianAuthenticationServiceConnector" + GridServices = "SimianGridServiceConnector" + PresenceServices = "SimianPresenceServiceConnector" + UserAccountServices = "SimianUserAccountServiceConnector" + AuthenticationServices = "SimianAuthenticationServiceConnector" AssetServices = "HGAssetBroker" InventoryServices = "HGInventoryBroker" - AvatarServices = "OpenSim.Services.Connectors.dll:SimianAvatarServiceConnector" + AvatarServices = "SimianAvatarServiceConnector" NeighbourServices = "RemoteNeighbourServicesConnector" SimulationServices = "RemoteSimulationConnectorModule" @@ -74,4 +74,4 @@ ServicesConnectorModule = SimianGroupsServicesConnector [Profiles] - Module = SimianProfiles + Module = "SimianProfiles" diff --git a/bin/config-include/SimianGrid.ini b/bin/config-include/SimianGrid.ini index 65d4ea60df..9b27cc7a9a 100644 --- a/bin/config-include/SimianGrid.ini +++ b/bin/config-include/SimianGrid.ini @@ -21,13 +21,13 @@ Include-Common = "config-include/GridCommon.ini" [Modules] - GridServices = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector" - PresenceServices = "OpenSim.Services.Connectors.dll:SimianPresenceServiceConnector" - UserAccountServices = "OpenSim.Services.Connectors.dll:SimianUserAccountServiceConnector" - AuthenticationServices = "OpenSim.Services.Connectors.dll:SimianAuthenticationServiceConnector" - AssetServices = "OpenSim.Services.Connectors.dll:SimianAssetServiceConnector" - InventoryServices = "OpenSim.Services.Connectors.dll:SimianInventoryServiceConnector" - AvatarServices = "OpenSim.Services.Connectors.dll:SimianAvatarServiceConnector" + GridServices = "SimianGridServiceConnector" + PresenceServices = "SimianPresenceServiceConnector" + UserAccountServices = "SimianUserAccountServiceConnector" + AuthenticationServices = "SimianAuthenticationServiceConnector" + AssetServices = "SimianAssetServiceConnector" + InventoryServices = "SimianInventoryServiceConnector" + AvatarServices = "SimianAvatarServiceConnector" NeighbourServices = "RemoteNeighbourServicesConnector" SimulationServices = "RemoteSimulationConnectorModule" @@ -67,4 +67,4 @@ ServicesConnectorModule = SimianGroupsServicesConnector [Profiles] - Module = SimianProfiles + Module = "SimianProfiles" From 5ca4c238e0e5aec6d3de74a7155324dddf34cc2d Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 7 Sep 2010 11:33:46 -0700 Subject: [PATCH 04/35] SimianUserAccountServiceConnector was not initializing the user cache --- .../SimianGrid/SimianUserAccountServiceConnector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index deb86951b6..991c0f3c9e 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -54,8 +54,8 @@ namespace OpenSim.Services.Connectors.SimianGrid MethodBase.GetCurrentMethod().DeclaringType); private string m_serverUrl = String.Empty; - private ExpiringCache m_accountCache; - private bool m_Enabled = false; + private ExpiringCache m_accountCache = new ExpiringCache(); + private bool m_Enabled; #region ISharedRegionModule From b28d1b6ccd3e8728e429528ea87714680e6ac643 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 7 Sep 2010 20:19:52 +0100 Subject: [PATCH 05/35] Fix Simian regression --- .../SimianGrid/SimianAssetServiceConnector.cs | 37 ++++++++------- .../SimianAuthenticationServiceConnector.cs | 35 +++++++------- .../SimianAvatarServiceConnector.cs | 35 +++++++------- .../SimianGrid/SimianGridServiceConnector.cs | 35 +++++++------- .../SimianInventoryServiceConnector.cs | 47 ++++++++++--------- .../SimianPresenceServiceConnector.cs | 35 +++++++------- .../SimianUserAccountServiceConnector.cs | 35 +++++++------- 7 files changed, 140 insertions(+), 119 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 99e69838ab..6d5b30e6d2 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs @@ -81,7 +81,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianAssetServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -91,25 +91,28 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("AssetServices", ""); if (name == Name) - { - IConfig gridConfig = source.Configs["AssetService"]; - if (gridConfig != null) - { - string serviceUrl = gridConfig.GetString("AssetServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - } - } + CommonInit(source); + } + } - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN ASSET CONNECTOR]: No AssetServerURI specified, disabling connector"); - else - m_Enabled = true; + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["AssetService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("AssetServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) + { + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN ASSET CONNECTOR]: No AssetServerURI specified, disabling connector"); + else + m_Enabled = true; } #region IAssetService diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs index 68f73ee983..51a09f82da 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs @@ -69,7 +69,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianAuthenticationServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -79,24 +79,27 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("AuthenticationServices", ""); if (name == Name) - { - IConfig gridConfig = source.Configs["AuthenticationService"]; - if (gridConfig != null) - { - string serviceUrl = gridConfig.GetString("AuthenticationServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - m_Enabled = true; - } - } + CommonInit(source); + } + } - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN AUTH CONNECTOR]: No AuthenticationServerURI specified, disabling connector"); + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["AuthenticationService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("AuthenticationServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) + { + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; + m_Enabled = true; } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN AUTH CONNECTOR]: No AuthenticationServerURI specified, disabling connector"); } public string Authenticate(UUID principalID, string password, int lifetime) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs index 7e56bd19e2..3505c640a0 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs @@ -74,7 +74,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianAvatarServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -84,24 +84,27 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("AvatarServices", ""); if (name == Name) - { - IConfig gridConfig = source.Configs["AvatarService"]; - if (gridConfig != null) - { - string serviceUrl = gridConfig.GetString("AvatarServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - m_Enabled = true; - } - } + CommonInit(source); + } + } - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN AVATAR CONNECTOR]: No AvatarServerURI specified, disabling connector"); + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["AvatarService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("AvatarServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) + { + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; + m_Enabled = true; } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN AVATAR CONNECTOR]: No AvatarServerURI specified, disabling connector"); } #region IAvatarService diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index a94620b983..4409d5ce00 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs @@ -98,7 +98,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianGridServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -108,24 +108,27 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("GridServices", ""); if (name == Name) - { - IConfig gridConfig = source.Configs["GridService"]; - if (gridConfig != null) - { - string serviceUrl = gridConfig.GetString("GridServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - m_Enabled = true; - } - } + CommonInit(source); + } + } - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN GRID CONNECTOR]: No GridServerURI specified, disabling connector"); + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["GridService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("GridServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) + { + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; + m_Enabled = true; } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN GRID CONNECTOR]: No GridServerURI specified, disabling connector"); } #region IGridService diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index eb118ae557..470eccd716 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs @@ -88,7 +88,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianInventoryServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -98,36 +98,39 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("InventoryServices", ""); if (name == Name) + CommonInit(source); + } + } + + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["InventoryService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("InventoryServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) { - IConfig gridConfig = source.Configs["InventoryService"]; + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; + + gridConfig = source.Configs["UserAccountService"]; if (gridConfig != null) { - string serviceUrl = gridConfig.GetString("InventoryServerURI"); + serviceUrl = gridConfig.GetString("UserAccountServerURI"); if (!String.IsNullOrEmpty(serviceUrl)) { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - - gridConfig = source.Configs["UserAccountService"]; - if (gridConfig != null) - { - serviceUrl = gridConfig.GetString("UserAccountServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - m_userServerUrl = serviceUrl; - m_Enabled = true; - } - } + m_userServerUrl = serviceUrl; + m_Enabled = true; } } - - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN INVENTORY CONNECTOR]: No InventoryServerURI specified, disabling connector"); - else if (String.IsNullOrEmpty(m_userServerUrl)) - m_log.Info("[SIMIAN INVENTORY CONNECTOR]: No UserAccountServerURI specified, disabling connector"); } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN INVENTORY CONNECTOR]: No InventoryServerURI specified, disabling connector"); + else if (String.IsNullOrEmpty(m_userServerUrl)) + m_log.Info("[SIMIAN INVENTORY CONNECTOR]: No UserAccountServerURI specified, disabling connector"); } /// diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs index 074c80f719..077be3c31a 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs @@ -99,7 +99,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianPresenceServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -109,24 +109,27 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("PresenceServices", ""); if (name == Name) - { - IConfig gridConfig = source.Configs["PresenceService"]; - if (gridConfig != null) - { - string serviceUrl = gridConfig.GetString("PresenceServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - m_Enabled = true; - } - } + CommonInit(source); + } + } - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN PRESENCE CONNECTOR]: No PresenceServerURI specified, disabling connector"); + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["PresenceService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("PresenceServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) + { + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; + m_Enabled = true; } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN PRESENCE CONNECTOR]: No PresenceServerURI specified, disabling connector"); } #region IPresenceService diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 991c0f3c9e..446ac717f1 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -73,7 +73,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianUserAccountServiceConnector(IConfigSource source) { - Initialise(source); + CommonInit(source); } public void Initialise(IConfigSource source) @@ -83,24 +83,27 @@ namespace OpenSim.Services.Connectors.SimianGrid { string name = moduleConfig.GetString("UserAccountServices", ""); if (name == Name) - { - IConfig gridConfig = source.Configs["UserAccountService"]; - if (gridConfig != null) - { - string serviceUrl = gridConfig.GetString("UserAccountServerURI"); - if (!String.IsNullOrEmpty(serviceUrl)) - { - if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) - serviceUrl = serviceUrl + '/'; - m_serverUrl = serviceUrl; - m_Enabled = true; - } - } + CommonInit(source); + } + } - if (String.IsNullOrEmpty(m_serverUrl)) - m_log.Info("[SIMIAN ACCOUNT CONNECTOR]: No UserAccountServerURI specified, disabling connector"); + private void CommonInit(IConfigSource source) + { + IConfig gridConfig = source.Configs["UserAccountService"]; + if (gridConfig != null) + { + string serviceUrl = gridConfig.GetString("UserAccountServerURI"); + if (!String.IsNullOrEmpty(serviceUrl)) + { + if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) + serviceUrl = serviceUrl + '/'; + m_serverUrl = serviceUrl; + m_Enabled = true; } } + + if (String.IsNullOrEmpty(m_serverUrl)) + m_log.Info("[SIMIAN ACCOUNT CONNECTOR]: No UserAccountServerURI specified, disabling connector"); } public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) From 029c9548040e0206640f41151f4a4643540bfeff Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 7 Sep 2010 13:43:36 -0700 Subject: [PATCH 06/35] * Added sanity checks to the SimianAssetServiceConnector so it will throw a sensible error message when it is misconfigured instead of a mysterious "Uri is empty" error --- .../SimianGrid/SimianAssetServiceConnector.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 99e69838ab..caeabb7abf 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs @@ -116,6 +116,12 @@ namespace OpenSim.Services.Connectors.SimianGrid public AssetBase Get(string id) { + if (String.IsNullOrEmpty(m_serverUrl)) + { + m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured"); + throw new InvalidOperationException(); + } + // Cache fetch if (m_cache != null) { @@ -142,6 +148,12 @@ namespace OpenSim.Services.Connectors.SimianGrid /// public AssetMetadata GetMetadata(string id) { + if (String.IsNullOrEmpty(m_serverUrl)) + { + m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured"); + throw new InvalidOperationException(); + } + AssetMetadata metadata = null; // Cache fetch @@ -213,6 +225,12 @@ namespace OpenSim.Services.Connectors.SimianGrid /// True if the id was parseable, false otherwise public bool Get(string id, Object sender, AssetRetrieved handler) { + if (String.IsNullOrEmpty(m_serverUrl)) + { + m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured"); + throw new InvalidOperationException(); + } + // Cache fetch if (m_cache != null) { @@ -243,6 +261,12 @@ namespace OpenSim.Services.Connectors.SimianGrid /// public string Store(AssetBase asset) { + if (String.IsNullOrEmpty(m_serverUrl)) + { + m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured"); + throw new InvalidOperationException(); + } + bool storedInCache = false; string errorMessage = null; @@ -375,6 +399,12 @@ namespace OpenSim.Services.Connectors.SimianGrid /// public bool Delete(string id) { + if (String.IsNullOrEmpty(m_serverUrl)) + { + m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured"); + throw new InvalidOperationException(); + } + //string errorMessage = String.Empty; string url = m_serverUrl + id; From 9be1c0ff448d4ea650ca921937905653b4017d61 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 7 Sep 2010 14:41:13 -0700 Subject: [PATCH 07/35] * Cache null account responses in the SimianUserAccountServiceConnector to avoid repeated requests for missing avatar IDs * Updated to OpenMetaverse r3442 to fix a timezone issue with ExpiringCache --- OpenSim/Framework/SLUtil.cs | 10 ++++------ .../ClientStack/LindenUDP/LLClientView.cs | 6 +++--- .../LindenUDP/UnackedPacketCollection.cs | 4 ++-- .../CoreModules/Asset/FlotsamAssetCache.cs | 2 +- .../UserAccounts/UserAccountCache.cs | 6 ++++-- .../World/Archiver/Tests/ArchiverTests.cs | 5 ++++- .../Scenes/Tests/TaskInventoryTests.cs | 4 +++- .../SimianUserAccountServiceConnector.cs | 16 +++++++++++++--- bin/OpenMetaverse.StructuredData.dll | Bin 102400 -> 102400 bytes bin/OpenMetaverse.dll | Bin 1691648 -> 1716224 bytes bin/OpenMetaverseTypes.dll | Bin 106496 -> 114688 bytes 11 files changed, 34 insertions(+), 19 deletions(-) diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index a4898061da..9941a7f147 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs @@ -46,7 +46,7 @@ namespace OpenSim.Framework case AssetType.Texture: return "image/x-j2c"; case AssetType.Sound: - return "application/ogg"; + return "audio/ogg"; case AssetType.CallingCard: return "application/vnd.ll.callingcard"; case AssetType.Landmark: @@ -98,8 +98,6 @@ namespace OpenSim.Framework return "application/vnd.ll.outfitfolder"; case AssetType.MyOutfitsFolder: return "application/vnd.ll.myoutfitsfolder"; - case AssetType.InboxFolder: - return "application/vnd.ll.inboxfolder"; case AssetType.Unknown: default: return "application/octet-stream"; @@ -128,7 +126,7 @@ namespace OpenSim.Framework case InventoryType.Object: return "application/vnd.ll.primitive"; case InventoryType.Sound: - return "application/ogg"; + return "audio/ogg"; case InventoryType.Snapshot: case InventoryType.Texture: return "image/x-j2c"; @@ -147,6 +145,7 @@ namespace OpenSim.Framework case "image/jp2": return (sbyte)AssetType.Texture; case "application/ogg": + case "audio/ogg": return (sbyte)AssetType.Sound; case "application/vnd.ll.callingcard": case "application/x-metaverse-callingcard": @@ -209,8 +208,6 @@ namespace OpenSim.Framework return (sbyte)AssetType.OutfitFolder; case "application/vnd.ll.myoutfitsfolder": return (sbyte)AssetType.MyOutfitsFolder; - case "application/vnd.ll.inboxfolder": - return (sbyte)AssetType.InboxFolder; case "application/octet-stream": default: return (sbyte)AssetType.Unknown; @@ -227,6 +224,7 @@ namespace OpenSim.Framework case "image/jpeg": return (sbyte)InventoryType.Texture; case "application/ogg": + case "audio/ogg": case "audio/x-wav": return (sbyte)InventoryType.Sound; case "application/vnd.ll.callingcard": diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 9cdc80b707..0925222fb7 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3529,9 +3529,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP private void ProcessEntityUpdates(int maxUpdates) { - Lazy> objectUpdateBlocks = new Lazy>(); - Lazy> compressedUpdateBlocks = new Lazy>(); - Lazy> terseUpdateBlocks = new Lazy>(); + OpenMetaverse.Lazy> objectUpdateBlocks = new OpenMetaverse.Lazy>(); + OpenMetaverse.Lazy> compressedUpdateBlocks = new OpenMetaverse.Lazy>(); + OpenMetaverse.Lazy> terseUpdateBlocks = new OpenMetaverse.Lazy>(); if (maxUpdates <= 0) maxUpdates = Int32.MaxValue; int updatesThisCall = 0; diff --git a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs index e43f7cf57a..194c064be9 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs @@ -140,13 +140,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // Process all the pending adds OutgoingPacket pendingAdd; - while (m_pendingAdds.Dequeue(out pendingAdd)) + while (m_pendingAdds.TryDequeue(out pendingAdd)) m_packets[pendingAdd.SequenceNumber] = pendingAdd; // Process all the pending removes, including updating statistics and round-trip times PendingAck pendingRemove; OutgoingPacket ackedPacket; - while (m_pendingRemoves.Dequeue(out pendingRemove)) + while (m_pendingRemoves.TryDequeue(out pendingRemove)) { if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket)) { diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 9eaa758bd5..5255d30d3d 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -252,7 +252,7 @@ namespace Flotsam.RegionModules.AssetCache } else { - m_MemoryCache.AddOrUpdate(key, asset, DateTime.MaxValue); + m_MemoryCache.AddOrUpdate(key, asset, Double.MaxValue); } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs index e1bc243c9e..e7cfda1bf1 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs @@ -36,6 +36,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts { public class UserAccountCache { + private const double CACHE_EXPIRATION_SECONDS = 120.0; + private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); @@ -51,9 +53,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts public void Cache(UUID userID, UserAccount account) { // Cache even null accounts - m_UUIDCache.AddOrUpdate(userID, account, DateTime.Now + TimeSpan.FromMinutes(2.0d)); + m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS); if (account != null) - m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, DateTime.Now + TimeSpan.FromMinutes(2.0d)); + m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_EXPIRATION_SECONDS); m_log.DebugFormat("[USER CACHE]: cached user {0}", userID); } diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 58698ee189..0f0840868c 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -48,6 +48,7 @@ using OpenSim.Tests.Common.Setup; using ArchiveConstants = OpenSim.Framework.Serialization.ArchiveConstants; using TarArchiveReader = OpenSim.Framework.Serialization.TarArchiveReader; using TarArchiveWriter = OpenSim.Framework.Serialization.TarArchiveWriter; +using RegionSettings = OpenSim.Framework.RegionSettings; namespace OpenSim.Region.CoreModules.World.Archiver.Tests { @@ -135,7 +136,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests SceneObjectPart part2 = CreateSceneObjectPart2(); - AssetNotecard nc = new AssetNotecard("Hello World!"); + AssetNotecard nc = new AssetNotecard(); + nc.BodyText = "Hello World!"; + nc.Encode(); UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000"); UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); AssetBase ncAsset diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index da8199ddf4..5e491c2403 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -75,7 +75,9 @@ namespace OpenSim.Region.Framework.Tests protected TaskInventoryItem CreateSOItem1(Scene scene, SceneObjectPart part) { - AssetNotecard nc = new AssetNotecard("Hello World!"); + AssetNotecard nc = new AssetNotecard(); + nc.BodyText = "Hello World!"; + nc.Encode(); UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000"); UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); AssetBase ncAsset diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 446ac717f1..23f2b10d53 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -49,6 +49,8 @@ namespace OpenSim.Services.Connectors.SimianGrid [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] public class SimianUserAccountServiceConnector : IUserAccountService, ISharedRegionModule { + private const double CACHE_EXPIRATION_SECONDS = 120.0; + private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); @@ -141,7 +143,15 @@ namespace OpenSim.Services.Connectors.SimianGrid { "UserID", userID.ToString() } }; - return GetUser(requestArgs); + account = GetUser(requestArgs); + + if (account == null) + { + // Store null responses too, to avoid repeated lookups for missing accounts + m_accountCache.AddOrUpdate(userID, null, CACHE_EXPIRATION_SECONDS); + } + + return account; } public List GetUserAccounts(UUID scopeID, string query) @@ -216,7 +226,7 @@ namespace OpenSim.Services.Connectors.SimianGrid if (success) { // Cache the user account info - m_accountCache.AddOrUpdate(data.PrincipalID, data, DateTime.Now + TimeSpan.FromMinutes(2.0d)); + m_accountCache.AddOrUpdate(data.PrincipalID, data, CACHE_EXPIRATION_SECONDS); } else { @@ -281,7 +291,7 @@ namespace OpenSim.Services.Connectors.SimianGrid GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName); // Cache the user account info - m_accountCache.AddOrUpdate(account.PrincipalID, account, DateTime.Now + TimeSpan.FromMinutes(2.0d)); + m_accountCache.AddOrUpdate(account.PrincipalID, account, CACHE_EXPIRATION_SECONDS); return account; } diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index 54681e4bfed65437999cf10f4cf7b64c91124b49..7909076907c483a8e9f7f8c60580e42c837ae0f8 100644 GIT binary patch delta 213 zcmZozz}B#UZ9)gL_u96N-BT9TGYT*WGTvlxVF+Qk!@vmS$$)v`3{Sy4bucf2;RBeb z59UQO{08$Z!MrF2PDYSEM=&p%K>*D21oL7Tq`KbaHVtc5!xd+&*2AG16Q>w@rHH+{BH} R^LE=P?p=K6*Rn`Pa{$)fGUEUM delta 213 zcmZozz}B#UZ9)fg?!&B&-BT9TGYBvUGTvlxVF+Qk!@vmS$$)v`3{Sy4bucf2;RBeb z59UQO{08$Z!MrF2PDYSEM=&p%K>*D21oL7Tq`eGW`Gm diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll index 59e39bbf6019b264f17837be18c092c771dfc35a..12a2940f688a3da87142344ae88559db4a4c326c 100644 GIT binary patch literal 1716224 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�yA!@x-kpj&sq=*X ztuVE`Qh*+!yombjp3IZuHl*aU^BqiXdKa=7SLIrOzhw=yLTejEfE>o}E=Vo=@4K5Hjpg)r&BWs2+}SM7R#^ zR@_aEh6s5T$Tb;mwaMqpRU94?tT?6Esdq2fjJ0^heTvhH!$m&ZvqQ^%GU{h>r{d%R z{+-(YxAZ@-s5eX4?{|rRaefKgQk>#m1K#h}{y!+)0{_wq8lSKGQz^JrWL!*4`z zL283aZ|~yX>R!B>SFga-@^()Fy|?P=Nu{@H;+Rl@A1tq}+Bifqn=;SBFi2T3CH`}Y ziZ1h-_`qD!CEj8^Ae(i8H>?NvnzAm^4PKIlE(iM-_f;SH>8hGmBT0)i)`DT>6J`Qt zSsJcT2&HR@XCjJg6~_;dZfM?>VnwY7Hg=wFM&8>R-gX(Z^0X_=`x92uCu!V6g9%}) z3zNTZ(~n1`i~9`-qBFQSuUIaQ7~rY%w>Y|(*896`+C#@~zv6zT#Ii5-|Cd-h)&83j zyMJ+iwS$zJAYJ!isi~P#(|DUaAg4{kcVKbtVs3!v&{?gDN-YhEbPh$j!iY3PK`u6h zO7hU!shA%%u<)5uJ7~c)g|@#qve+~rDy9wIy13>bo~8kwS6pw9x}Y^t=_ppC9gF%f z${;x_y@NfAV+U~7Ev}p#DsjfVxaEK#Ueo&;>+3BHv&XPgb5jTN)0XB!s0^pvB+k%b)P}DwP9E~Io#HTd!3TX#m$SG z57zg*iwO(AFOg;k6c13FLIhi1OK*6mFDch^+J0&HCCpF6Oa5AK! z(#|lHtsoDBBt=3F#gIb)VaWAcSiU$(k03)Ds`xn!hfGqQ4-kfzG|CXuz)p#VT5m{( z58U58R32XLG31wZ8j7LlLK@i%?C_`=tD$!6k`V7_csx;Ja5HOQqYs30qQ9X`S zX{gNts=NKSRCx@%L_-}EP(6iIucL7{4CXPb&5~PS++t5q3^kWlqJk1bJr4o}Jq`FV z33f(cjE6z0e!8Oe2OaYvsZ!gOXsBr*V5rU|L7`d;Q$4+rd8-n2n;7bZfa+zWdLIqi zzJjb&lqDMKF9FqP)T2sU9o5E47S&>jh8hO~CIx1b>JBt$tE1Xjx>CoMXsG=IswenV zX{)2!n5^u(m1w9dK)`P7>y`}dGBCQ{bHy`M0S}B{wHOZX#!blM-ZD! z10{{KP9+*@Sd8f`R7b=1!j#f-r4RP`ufhdmB&uGs%U9dO)}Y{mdb=*yHl& z#<^g^(<#wV?=;HAS~D#k*ieFx=X!{CO*>5e;P}4xb zq`-DQRocD+RrX0sG*l&^x|CEeqCs07)r}i!+S%nT(NHS_s!#h=X{)2!SaZp_KbZhj z?}C8o-nFD4=9)BU`wCRqNiNY)vq8Y5>wFSCgvRk-jVk-#va+Gh38>yjg747y_^VO9 znpA11LfV&gZCLAf0~t+bR-(UfP<#!k(oma&lu6eg*Hc|<$KlcyU4ayCEVr&DRT}EB zfa>q-sd9$^2{umkI#Q*ft_!F>T2B>Ah_k*NRi0uf(NJ#%RFfH`YmvrO7+;}e-9V}| z)D|FMx*a=_V3o#Unrg5d-B`N*kyL4@r66FsNT-qD6*TT9)nLa&qq%h>snSrd1XNp^ zKyW=8--f{yU`C12n5-NamT0IwK)}?kBS}zd!9|9u-SRe|wK>X^g++C1K=lQm>agao zlv}ruDh)Lf1WYZM0jnN7()Ja~z^$Z8Lw!f6N{5zK^+Ykp`ool8C!boDvQ7icn=WRV^c6 z*!v#?ZPVCf2yTCHN;Fh2NSX4z6{+q*!-e6=>gnGG$~VsQJ0%+Gln~YHNcGXLMir-u zu>?k{uLo4qSr8meV?7vOK~|n@EzwY0fq+SYfa+dfjp{H`rJp*{vFQ_pexNPXRLq%zWIj4Hpu zRHC8AgOs7VDX9i4JN9XsTN;{7=GmYU4YdnM71XaEFzU}r0W&T@GAuiFE~v_eKy@^w zXk@~N$Bjxf)OAC$kbQ#HA3Z^`Sq)POpWD_|4By*s zjNwjXNJCu`Vi+8knU(p$Pz>`PLwu3DF@`&nAq|tHcMqDR*nk?u(3>~CzwzGqd~%^- zq7`rnq7^C|9+w9i=kh~xp`jj^#3L8=DGj@L)WyY{=6|qpF1wHm4b|DsLMU7&!>Tr? zu`LYN9L^1R?Wf1(p~kuJ{9lQNnh%0nD+cO7YsFBCnF@P2!Z)N7c%-mILtW803+_W! zPd3WpCuBiG#YZx&f`NwQi0qH&KD?eFt?c?U$}7&J8!gTY$dHB_Eexl@3~LB%(6lqh zX4vI1>~56dUSvo^Z7K|R8iXNQgrOLY@fa2xWypiHB^s&4qLKE9$9_vR)Z~19EH;N*Z4YCJSj>l4L$Tm#;t~yY zN{9uiEAknF#U+ih*pDn|s8{%k3Nn94wPu&Ll9%~o8_oRv$&iNnR2WKMsk4CStW9Hc z7(FK6MfWt;|KM5h5)HKr26-OkPPEskgDAZdUH|_H?GrphP^~XZ2*EM zoxe>6^J(m3xO~ZU=BfA+4Rt_3^=K0OJ&lXL8daXNFVRp}{ST?Sq)J2G395EFKS^2N z9Yj_yogZmDofne}4K=)zT%?wahgHp{u@j7*pq4bcCa{E5X{duiK+iS>g-&c=VV3z& zQl+6z8j>nxUD0EV#%c*~W+>56cYhw$FIm!f&qIlZdhLHm^%tZ{L#4ZhO4lH_8Xc+e z&WI8XHTi!?^$1d>AuA1L{1;kj5LsopL1eWRK1+`bxw%-;(2)B`GNd7k5QgDg#HfA| zLNbzN1jWN<$buydxsK5g!=uQMhN?=s$rwL4>vB9mu<=IYjn%r);6Q?n%$CD}zwFL;6B&SvFM5C&yF1Z<` zVT2C!47vH`SENcq9S#B}1x_Qu8)!VBseaih;1fudhI$DEjI1A%AU=3$3SE!_4IUCJ z{hCy1sL7x*fGW##Pe8TNqI@E$(ohu8E_6W!0o9?ZBju4o$LKax=y+RCiH6!Dh{k-T z%KqG<;iL{!#~h_x(cN^ z+VaKw<<22P8tTWOZR-6o^cIxmRBt&GF7 zG~R;IBZ~V=Y3~b2mB#;+DnIQc-*=Lh#uV`ZElr(9^v?M|+IXeEh+Jr>&k%WA?~Wde z6j=`jihQRuWpbBGLxuBVQl+7`0s$lY!6bMpjf+TC3a1qLM!Rg6kSYyzO+fWo5`2qB zQ;$a#q@dTyFxa+K$Eon`+}~?=n)QVV8+RNN}){hT_&xx?Vx5 zG}I{|rDfH%|K+78Rlo}hFT}i4m6r*i&YhVi4ZLc?d{8-~9?J9Di@jp$Gt4WoH zdexU*r^u&Fk=!_4qp7WRvNTjCt|3(#YE2NZYsDa<2#+(H&K)SV#~kC4Sn^(;(6 zu`8xNYLvyTWI;o9j<1h})R@Ttdr)$yGX|+K;VU#spCVN0Od7Y+2$vXBVLqVWVKg|} z9uUe@o5$f-{Fxl(8xX|Yt0C-!hMZ0dvom$*4Km@)(>N_24q_@0cl?!>Fv!ma1Thte zN3@E26n`|p-`rSmKK0Y9tW``1g7r50vOngz;W*M}uVJr+d)6L5* zf>Y&#ouIA{(fIl9((RO#hN^`mJ&BTDMoGb){dO4KW8rOkcmQ4v)u%hif`%G4p}r*6 zUHoBK=qhXJ?#{687R@Oo?cb1TKwM2xloWZ80mPtl5Doqs1ISt3lLn(@N+Zvw|3CKL z1kSFa${&Ay-|M&Zmb`wQ*I6L1SrVG=P6$EvEdfIy2%<*p1d)iiL>(IL!}az= z;xaQLj)=?SUm`XL*rsTrqB&&mH~13nVgcwz#b z^CAuP&|>4_L=*kS1yTgluq$!hylz2}%*Xy3&rY_{uUoj6qKEFKng4AYJX~t)A8m-3OWY>nJ0TmR~!{x~aH6fbM*B?KPTpU|5K$}pC&kSFjeVo6m2H{=uuHG$todr z#Py)NjJK0gCjN;rN*|4~S&K(Cvg6NHV*XrXW#jV3_}K3;S6v59+p9|BipKL27qz)M zy>Y2}sY~LzUVop1_qVM{T+}bZYBtVqY)xF$FT%P4Xs<|I6phljq;U~mVHGD>FSoC1 zOduc-zo?hnvY?J%Y;RvbPgXPWpB7`a8}`V|YNZR*6MJeclTZ!Xb^a8FqVXiKJuV=6 z{YL)_Z{U4G;<|R1)q?5h#%YP`n)8oGMB>!MMeQHcufuzyE=^q5>ih;?KPAOq(){-u zYa1IAH%Is%?^b*M|AhQ!;^Tv22nE=;0KA)1{i8_Kn&@y4MGqvlEC0j1-Uhs1GNBZ- z-Ff{f5i;>_18nCAjekE8_KYVH+Bnx-u1JC_?ox?NQ4JbvT`_FWo1c+XCjKf=eeYG$U|v))Dvx z5i;>#s}QP9w+|54=b7B=AXE|DY#Xr;5GoV@Hx}xuqXF<(Cfkwls3nj2euCZjM5eg# zFA0^2|9Aj!gl*T<``W2jv~m7r}V<{ThYCjJ3{ zl8rEb%@k-ohRJp$hZ~k_k;%aF93*LsiN6Z~1gdN%T}`Mj*H9I}>`;3Mm5CzIRT_%c zH)*I8kTjddUaEm4VVMS!AC4Mh;(s{ohOdsce3{+&fkv1ELQyK2bRR!OHO9pMlY$zW zX2l_ugaA25vgy78p)&E0*brs;!%_BUkjw*WFQGE=uLl5^*TVq;AFRU0`3 zY0vtlKi6|U+Gl$3p`R$2_%Gxw&Qo&M@^pBHY-K_BX_aK=?$ZDfGSLXTc)IJW*(bmt zu`tnCLe4n`b>v;!-Dzgdj{i?~Ec~w97!&{XYJA#EGm5j(9~pEVzZ5sd#J_bBq4K+P zV@&+-Eh5w^p)&CYkKyzQIp8-?_D@G*I&U~&`24l(eCGG^#+dlK0MJ^@G|h3 zU*H>K;$OFjQ29;2F(&?777^+SLS^EA9#CCA-;J{W2PAPm8@2iM?0l{h3lo2I)8g@& zUmzS~;-9UcswXTiL$=N6Wpl##y~Hslep5kJF0*}sA|FPIb0ou@SVO2xe1g)RmV)|n zVDaC81W+S~E6jYpD?6VLAr>b7y8%#R`79BruMMfMso{XKKH8;Lav5kplu()YUjwL7 zdHLh72(@}Fl1U^Hj$~U{ttC_@{+R%vpwlQZS2a{u zKf9)sy;P=@gk|!)#)y!KestLy1pBye-&ddDA~Xa0jqC$^7_l(%f2F#WhK2r@83%Y` z2Fu;qu^dh;O!NcN7K^pnZH(JJ*|8i!EKK}mn>j=wmWbF!`eG+(+9!ZI#avQ8E7CsP zawI8Z;vcc3l(qX{NqfrHkuoO!sY^?l^R<+0A*%JHjEVmUMH!W_9Y~d(VPWpc{JC;qv!o=Se_C>wa$e%&ke<>2kJh< z?F{V$h)mAVu|&wkf1^UUWW(CEC~PKWO#BZh%EDK29CT4Qj+8O+Z(CBzx)+6qkTNFz zx0aT&u1E8DQpUvpjiM}k1=B$v%@ar&6Mw}+sMwZ@vhGLoL{i4YKXGX(>v}X#B4tec z$0*9e7nmIM(L9-yG4Y?Vq?C0(nx~L5CjQ?pEoEJg=BcENiT@!*S@<#8gFc$4kuoO! z7Zhb&c&fLy_`gBfUv_+Fb9jw0hc5((Oy=-(B4pwp1=w|esaVnd^f`l+G4Z!9EoEI# zpEF4r6Mq*d`*T`>Y$0V#{9s8b>wYx1k}@X#o0gWcu1E7MQpUvpjGAZRrc8Tf;Ci53 ziK=iMCqyQZJDUiZ_;<|*As3hmA;&or!iN$e6aQE9LCAHZLdfCEgz#J(5Vlsmy;?!r0#-2y0O#Hu6P*v3XO$7KMCjaF?H506M6wULtlP%09nr9AQp2s1GAlCjM4H zarC%iEJ0yP_RE+SMW{#F2}3$2$B;4_%KoKW?7TG>d;blPJ#p)&E`6hf8h z;VzIPFIgQ?#QPs%`z)`Dy@V*3_&jNgEWe%!=YtqG00R8bk3_qPV|3iu@@Vd+|7;VB(+1Tby28fU^GtByD=p%8KGL zqF~~`KSbf*N$B5WasbKUzrXhFXQ&}o$imNaeJguBQWG?jdAf>F znfOf$^-Tn5-(6+iZj}AtOviGM3Vr60@ECw`K1Gi_%yW%Q3o;-XpQ84jWo!+j;7KM0$>JYbjBm8I< zGyf8zVB&Ahj)FLSz7akXikA`v6aQIVqTq45Oeh$FA7kRbL!p>kaXSZ&7k_HJisUfy zzuK0Z#JJ(D-KYC}F?gn_@oJ)A;vdM4Ld`zD7(5e-*AWF1|EMz}j!i^sAB?^08%Y@x z|I{U=tovBQ>q!|C|4~azS=X_K?~^hn{$5a)eIa$de9yCUlKeM|9nzp4^&&RjY+Jto}5dsDAnO=jnt&Ogel3CV`^655W9^D46)qQgc6j7s6fFc0Hs1 zNEA%`cM!###<0r?`zL~D;(s}N5BRXFTEt`uhwdi|CVpvarXF+${s6%<@sA;R`^A_J z`bP|9=E<5vczukCe_0nj$PB)R;F#MUI-sX6ihOs zFghwTio=P5iT}1gGJc(QAXW8(-Z-X}ol%d;Di=o(1rz_pYDUeC!i+^`6g*Eg#zY;* zO78_}SF#Z4#XqtaSvC!MQfrKfe^=XHL{XStWI!>o*$ZA;$o0*@QR|!7;f=4(<@&rP ze5$?{>nASMRr%)2QtIHf=ytg^oASB!2#(~vTvcGM>mUCpp(zCU!VLV6zP@`(rSXrU z_8Y~CT&`z%F6ZS2bIT9Sl^9o9v&qX{fnPlBV_*z8FlOLh^v%El=o_3|F`OTVvF_{3 z7iVBh`=$!T{(Cl{5@xS&!?*7l8qV*pAKH^!Gjk%b-BT(H+Tp_f6%ABZ3lpV@oh&>)LN z(<4E5$&Q&j?sm)uCYKF+;h4Rg*gYAo?}H;=bhPv&;T+LpbjT@&AA`BmcUXQ9cexGj zzht-n3W?x;1#+A(*9-0&@UubVKFt}8?6@xg?n)cnoEd_aGlOVfDQMLs&}iLBVA1M6 zugV>AyzTQz+oaDYXnC4}dhVMDOVFf!6O_RtK~tZlsn3xg$RM;KM6f8bFk$3x*&&vn z>u`TN8J;-`w?{=dl;JpxeoKQpAM!Knv%r|EALAYSal$x81@ijMa;~sz;uKF6^V2Ps zCvNesUDpG(^$irXa&s$qr!>6Kt2bAHnXMnFmbVsjMQBLnDztuVtHNf#v2|;`an<}) zMtipY$cu&6pZL?;+RvY%LhAs2F~@5dw;K39pm^3($rbvFQ{|$UpZRO_b3*CXjktbt zj(X9<^>un&*9B}1RR}t-xeyw(#j+h?t7BKKH)EX7b%s^X49n0xsOZi+bni={yAYw9 ztu@^bC*3S(r#lUnqB|3;DBZnt&|Qqs&DJj6EN7=X4VI;QE?9={A;s^KL-(sv_+5_B z&DNUki^y-5v(udhOVOPPmZ5u@qPybI{pu9D`yzC+wWj+Kq?_gJbf>{mbZ3H<-_)CX zNe=`Me_oTWQH#Q-vz&uE%VE`7a!O~3+-trDU2HA0wN+-t&&s!kSjabje^jp6>X-ay z3&;f$+<= z4Qc}6S8W?y*rRCpb=wBR0^v7p8@xei_-)$;uND*!L>fT<<_oy>s$PRJN~(|dN-8Rnsu^QdFRuu z|K+8Xt#9)O8u~l@b+|k80Eg#$>T0p|ef$m;r=H>k9K8IDH=Zj_?KY)9VO0BzC1q)f zqpf>*Q@wQ`e!Rl?k3rHvxzxHgpDUE}Gj$C0P_bB^`913IsSj3WFhl!R3FgZ9c>r}! zZo&&Vk=E6U+N!fu3{ZJqS_qy##5U|t>q=z98g{gGm0QEU zwr1QKLT>#9Y8oTgzaO@w*1N1{{9F)LulCj(%g5n1^%chd2AEONSiV|SXbjcf*44Pv z;awGUkaIH!z(eEf=5lY#^}jDyF9W=n`)Y3F{v5I#zkKdH_^o36)Y$e7=f?jQnEIQa z(X9I+V3kYFzoUSW(sEwe7@Nte93dOe=^()O-h+HdqN}L3gRu zLMr+E_^;*7L)BZ|k}+4`NS4K&J*NM?xkJ5NZrILW#fIb*1~DDx@T!hexFl1!G_}`ES~Z0)F{KVuc&ImZ4wwFX z=kOJJ4r}&53)*z%kaZA~(r_t0tKBw-vQ2roY}z!I>#4u25LS(us(e_r$y9k^)fQ6~ zN)g^IFJc6C8adiCKRJ3wuK$BZj_%5h{8Z-Ajb1)D--B`rwj;gv98BbVutQZ`fV9v% zemBHvVx!;l(4MQB@51Hhs&)8U$e#F{G+4&p%(s@KlxBY`b@4B2(7T&)Zw>P{A5gn( z==U!m?6(oN2g@)s3S}qP3gh1a_I|96r~n}b@P&JG1GxW}JrI2~27zocagL+r$G^)O z>WD(_>(KEdl#$P(uCLfD+P0u1KR?v#j^kR4;hk3LuhJ`|_ggoFiu9zNs55hLbTv;FR zzXApnXQ`z2*NJroVUE7yEOEOP0cm&zK2X&&?nAYX3iadLq5VaRxyoJ$>237^pX$Kf zxOwu?qXYilZ41RFuw`9D_+Fr9L9JKm(E8xyKx6ax3$|{2sHhJXP^V_t#py>J`=G(IY}%rlgdg^r=?3r{;U-m^oPO6_t!Q4Y;A=L{IN| z!hiKB+koX2ov{h?OaJm&m@_Ld4|+FTP5dKk6tX z{=J)WSB*a!V5Sc7f;A2BP+h#HQp|b5(P%NVpR>$=3TRsC1*_0Pd0~1qc!!cEX@+@Q z$bAYl)Ir0@VDBlfMqUUx`DMsrO5Yo?`B zIs~^@#KaLrC4bGCa57tjTB$debIDF@mHox-?D~z6V=VDGEXDCJV5B5J+*21uj8=qF zs*3d$MQDO8=YTEs86V^i+|#?hK5!3sE&%@%ca=9Ruc%JB!>s0FE_YsT%gb}U^jSFW zpGIF+s&OBw6`E&(yjpLyH{arbRC^08&XsDf*COl@5FI-6%9{*61|`{Fni?qi%RiL6 zYNij;-dEJ4ep)dc^`UC-{^Hs3VQ)@=Gw8E|X$Kp@J`DEq?bu0ilt{I(VHu%3lu#av zNC!Q{YOk99lAoO_N8JGfz?J`KE@x+s;PAZ5q zUmzUxgX@5!@OunhNg!(WV=B*l86fYe_Z3|)yJ);@J;qo&EEjuf^vuOxFoq%Yg2Rw< z&2c{|qs=PkreKFwVGaxxPI({D^`87sNSptT27Q>Cyg@uSZJ>$)<4?xwge9tQG(Vip zA7H+&44Ga%c)@yHSf!1Cg3x>`FwESF&I)bjngXQEi6T-i%5Yvwji45r(vO)OX2bdk z|7HxAQ2Gj*sG-7CWvHMSG}#Ml1a0{YND5RTd7waPRjA5p#i{@b`Cf1Ynt8#IDqW{i zQtt&vA(dgSZ7Suy0LZH;JCK}nL&+h(C^=+AwYRrLSXFSmMR3UUwg?fKVv9hLDYXcf zQbuwxrwKwyu2NPTDyU-94Lz82YFdYU(2dpV?c_JxVbk?8ZtZTOhb%rvIEc!T2uo@t z0IJQHYO>l5YMb$#80p82?D16H2=#ds>aW3#qEPqGA(8|B*ttDdm6ab-?VTmF97jZr zbaOW}iv|-a7XMt_R-z8sL3DQmUGv>Y2EBlRiptEtpg_5!P3G4z*I;b({iSU~$WP+m zqww!(_;-o^Jr%#l;a^Rcd2J2;9ihu-$AJIjbn^sE`M$|3n@3Yy zPClu*|1kbOuK5;9+~md0*Z1=G!se^!15BRNJPdU8O`g&Gj`}^Jd91pBWAl1-eSPyx z1!t|l2mQ;xVjKc6elMoGUV*EbJ~Dxx)v!l31riQHzu;PPfvMI(h}f=%Q_IML@@0{y zgsb&^abg6q`QF@rW3FROS8e`&48#zd7&?+x5rn0W|h z@-^@Gavp?H0zN)s2tgCcaL>$57>tv@jfqvd<|Oz_1Lc50DQLNJF;MNUK|2-BG8NBc z1*1@=;u);?u2b-gWm1(4Q9ax|<*WEtl1_mZ9V%DF=*Htvv25-NR>tT&%Z7jyu-$h&A;l zzT?}cLVa#^WBI-(E1P=K&4jH$tvYT?6x0>R9TU0dqBgMhXjqevS$#dafcO~VV*b~` ztXrzRqXPUDo53)pXHmD(f9QGYBJ{l)9id$<`EYss9$mb*mkV9N;_y@UF^jE2e9*Vg&X6M#xdY!rT&zOybQ%}c4WzJ2FN9Nu=t7tA=KM*rjhg*w*;>L%; zje1$BbERH%^@mWs+i7ycUZp?EqDdncL}}c!ZN2}u;7sI_8hQbK!(LTzz^k$f1*{rB z2L|fy>lN#%o`v0;pI4T^vf)C>QP(jp=nZBG?Uj|K61?I7YVK^*-0{leKcQ=>;?b)( zu_HX{H9YFs!gCXM=0?6}=Gt#^%Zfc}u3?t-JmTt}ZEwN6^KxJ78TqlS-?>s>G2!X? zSjb@$DR-Eij{|BxB4#~;srX$a<6p$g(dGM0xmhZKygNYSJ@x*QOI#_WZ8-oVnzZ3$ z@#E=}yZ|+a1D6*tlC@#jzv_Ioz7ItX?jf)Ac_R|8sO#{BR>U8IB1TYO#fSrjh$UX6 zD;V8UCH({opyD2gA2K2gCn!Fm3)xSq}5T{?> zh~JshvB>-)DIdogqwly!=z7%|wOygYaX~*~PQd^Yi8M@%_E!eDeW2=xP_INktQlkt zxjtC|!kd9;!%J|eq_n@j)gJ5!_eM%nml~SOj=11B%9}`{F{ z+>dfAdW;-ZdR84Svc{MS0=l_%cI^Jf%q9An0X@vrxpXp?t-10wCv!Tv{?UO02bNvN zF{uPU0&6!u%j8CP9k|y{mUAyq^t3 z=D1BXN3j|ShF~A@Jn#m4j=&}UM8z99)PoDbzjfZwaaMo74K?fSy!$YH)e-22V(=p9 z!{Eh895uL3N0GHs9L|eI8>y%%h=nT^T{$FI2ZBpe+dXyIW$Mh582*w5{}L+UpO9ar zNRQf@b={whx%E4Z&3ayL=z7tCYrUWb{5&;uGx+M|TdIiak!ZClqIw0Z@muHb#o=A7 z#(^JIi>sr$)k^)liobr?nwQa)dr@D)qxxKZs@IlvwyNu9jL$Z{g{&dr8@_(4>4S<+_`%9 zbXle6@2reYBbGe#54d^reP}0R?W^_`Hs4k4t(Hkp6|uAN z0m#?RY8e;H)v~7Qy~Lqxe=!FYlsg)HkV}2VvFD>=I=@?Kt^Q(uH+opF6;65ws(WYN zLKeXfQ>`{v^R;4L7k2Fi+5ISuPVcT2>$OsE36#ye6*sI$W*R`slPgeHo>oba!ucrnPKO>jB>#khB+QXQ6uZjarIDI$0t`AHe-&?Aq z^Flu;s%whM5rX=?a!3zYJOBoh?9HFz9K+cU@N5$B`9hL&VcLe}bH^=CR+Fa?nLK64 zhHYa$!V+fcbOmCAUnP}zo$x!i9p zjaZ=@8h>kPtZVw#YVy`-@>a!oIEGse#P}GeMfe!6b@`Yw)){CN+``9pbgpf~#Z{?X zjMvUd;{nUZ1D21-nz1%~oNF$o@i9(~@G)NN()b1-j>!y$XD%9DKF&p_$joqVv_-{l zWoLCNKjXEQ)_m?P&^kr^G5(K``o3cG?f6k^lI@gsuQYx*B&{^_4pa|&N-Tp0*ls>|VzrO!gD!9)p){8gnowxa(EuJVSfLQ*%L>tO zUQiqcuxmG->J}TzH%>;%D>tr*l*cyq`&Yv|l@k*B()e1CzxLRaE2Fy}FePio$&3A%TRPA-_H_SX21^fi~X||B8 z9P1w&%FSHMHocSQwuMwd)M+kAY@;C=I3&1+wMAq3@q^XU+KqK)H?Eny62B`qo`iI4 z<6|cGRC_Ds@#SFK9 zPP+as{EXDF?=><{L_hW9KTU5PHa_iIQVavtJojTor!;a$n)=TuRgvCU}+1u zc3XvL_{RT#&OebmXGZN_EiMkW{NAmm45pQG>flQCnnC9@oOutq9aeER&b(Ju$%K1f zM%I@?a9 zlhPWgiL};Eq?(;b<&oOp-PpFz-2<1lR{VycE-rZR>he=hbAfL#^aM(VkGrtlt*e`j zqj+d-mH4h}s^y@DmlIbZwbcrIzsl-qIIr4mt(G?5d(w+A58FXIL_@3B`s=lU$%_GP zn9vZCsrIjf%hykLGN`81El;Ualtk{uURP}Z;7XhSp{z7^wOkvF2-6_tWUGpck+U_}ui$fO$2hiPd=!G$f6qv9s#p|ZT|d%~6Cg-( z^v!#){pVpDr?NZ*lUuzy*EfX!pJjaSPqG>5KK3Yg5jSA-x4$dQ;{5s}m*CXA(VjHZk znAZI(aIOY<*5jEsuv+T#&weg$`{t{Sl2%~y|Yxj$qP=w zm3(2xI38Q+!-dt;JJoee!ky(huAheMgOzQVM7h)P56=szVV_W~YFOgz#0n=k6|L^L zNmpX!wG)dmdTuvKGb{{uR&gjJ(yYYFlG_X`7pxGaMjDf{e?{*>*~;mi6KC+y%J|XX z+;!)Jt%@h-0?o0U&%x;+q9049(Ng)feZ^>})S{?#!`{u`k#;xitsgt0h#Lgbim5~& z=;z~^DDF98PkYC{{$XsnFTV`Kga2D(BrCR<3JwD+#!LlA0u^duYU(&1!B_^i$ng@1Hzf*j>U9l~(WG zwQ3icq6;fgSbq5)T^ikmE||i;J%5im(_boX{y64C5qItkPd&;R3!H1p-Hx+O4fw!b z@QFTH$Vt#R-3O#2sQDynN;m2{1#9)@@1qCQMNh}Q{PV_d!>I_b-r7>YP>fN_wYD-l zdnVHTD>(5aFJmG3QN<&Z=cF)sj=k4B31qZLkhl8!ivXcTQq){q37oIvd8~0904nBh z*gLulfhjO}Wad*mK0>*F4cf3@0+TXu6xvEj&jg%M8tKjVVum5s(mFC%9No2ZsIa_8 z*np=Ur+A0rz!buYM30c|#&s?|^}b1n5ib>+r=$5TklViE>dp6qeKo^94N7zG2Pu63 zVCh5eaBk*S=|evE6w`-%i;NVy3cZU)mj>m~mCt<%I3I#J+0}f|Y~?JUI?^d9m0_69 ztKi@6(P?llHc!&6nwX`qV>K~Kwre#^ z9T+6(+@~!Nu}T^UVyZjgG#c*INME(j0YdIo`vu5nq8tKK)E;9lciU~kqhEUgsg3f; z3y3^kM_AE13?$EA@vIp2hs^PRM>DP8v|ihZ>->x9wR|?cwkoODnmaJyEh37^{#mF` z>aRTX*H$4RC)2n~{Y6a9+@*cCI+Hk)`sQNnREUz{%~~@ke&v-eWvn&9FGuFOk$ZR? zawoQWB0F4Q(+%^NA!CGfM8Ob<1VoI`f52A>xs)1L+9-t6ZT$9If>IIldf z#`5W%-t2A3N=N$b+}^ua=JtLsAhhV5wXi>ez!C&J3frkvyf^{96eiW6j(XyFRMzdSABr-{?ybfX864TBHWYB8V;~2M@>Pq#V$W z-)zQ5`4U~q0TF6Ba8xn8eUd<%E(E%pJplaHzB}`S zj*IsBRM#UupW)QzZ@I#`FjG(5#;BJo2m|1Z3NhcX_l}#i>1Q#;^qY2@?{=waqblfI zXb*sTkmu}9gf46T8!Rk3+~^w^;U<|2X{%G9FLA7tN7Yg$a*f`Ma%Hq5QyDG@GFS8l z%Bo4NS8hc-sz+-*vVcXU_Bc$~PsH{cw%e-3{>fvdpITaLl`?kOs+H+#K^_d-G*K;~ zh`=W9td%)QRSSLjnEq18rw{52LI)yZH|(t;s9CS#x!Zm@wL0@r@S}e00IT}y`x-yJ z?2eld?ve0JwTuENT45-v_6_$dqLpY=i`W_5{2ld!5L}^t?D7hrRQqwfgOB)vz1ZWN z`4}*8Nh^bVW(@~KiZdTaCDe|x%f?1Ej>h!=0(djkkLJwWuopgKTTRY0iO&WM>OF7v zKhT~k)KSHblg5P=_kUXii)I49UQ~o~jYP%$pBls`KpZvh04x7XDo4jZX=|-IH-5@h zSBWm?Tq8|tof6XIXlq52^3_Zi??CK;RMkVW^pQZ2VA{CUeag}iQa6rAISk1iJ;#37 z%?9Y>pEvu(WQT3nLLY2&RQk5t-r&%{ebXKlPcyz1$Cc~E9STdrpIVvGo~%sR69A6- zG>=cUA9skrb!9Y2a}st^mmjYEC25~mW37E8M?);kD^ey;#c0|sZ?gJ9X@2jQFy>Le z_wniDv?}8`r8vH-2cs=n&|i%~Y7uLa$9q%9Z^3>rk+t=Mi8DE_)(_^*o%~>je~UKa z0f8=wANAl8VEhB>Y!bS z4zWDsEJT;FVwo&NzifdlXZ3Ooq{>3o0vTp`*a1>wMNNQw#R3^&^@s+tf`t_pNS$RE zU4%E4S*VS&VpM>9)dE?`>XjPEDi&5*Agftk?EqQBiZue{e+0;m@qMtzt*@a3qk`yy z9W)$Wg2~N`QPL(#5;oF6wUIlTvqYO5HczI(BB9XvQ^B zN3(FWC2E4@35TdjR!j;}-vTJj<0)28X&@U|*kFNdWO<_l z2kne4^@8s@CAOyzv`39d!UtNN(YCHm_&{FsTG~@$_L?tbmS|(^>SwmKt9Z?V`kRM~ zB;D0^ReEcUY}9um{-lll%P`hN>a~p(K%v29T<1NY(8itG@_6yAFHwZnR}EuWT0CED zsIjSoEv8={?(xpv2ZA{NoVAQM`@dEaqgHC3R-?Cs#o7PLcC`E*ek!0q%>&(|(AWcsz}D8RBV&WR(3w zQe^+HDe$BQ@id}~$^FYx<$l5OG$PcZuJ{_psz?IkY0`6vr#+7GG*(DFjk!|uwID1O zPveET;%V$pQjes@(@3M%BGGsn@mLxqp4J_W8Y}}fWr_L4<7v+PaN=pI>#=wm>o`Z| zsk~CQ&WJl6PZKO*JdMTFc$%i>&pDoES=&CI#x@<}Y3%1h;%S;six^K6iWU@46QbOB z8qT40FflpW7#xLCf8Ol<;7P*9{3uzO)VEVpqHo`2fjDNtn>9e3N@Xkf9tY(+4Z~Rc z1elbuV1~xR3w~;D$}C}w|*8)AJ)Gb%)-j0!UmqoP`?lRWAOhKdxD3e}pK zNNdZI(7raC)&{)1hi0^6hbHY!b!w-Ojn0$M)zf7zA zRkG5NR=f9_?hhM0j=WktkxGNdsYKj;d0X`xjl2K4BbCOlb>i;k1{a-@Yx=8{>qDVG ze*>sWr7|Nb_4lTVnK@LdI_rW@FXT=}JTOgt60Fiu%tRETggQijsyoF)49|YZ;YTOT zp--5o=Wc%sXgXG+51Qanc!i2F80<9hs7bhg!;UB-n28XPI?f;XfYr-x8bT4e55FOB=2{s0SVj8fiOZ zAO8=4X!Z0TZAtIg{s}elRS4^36~g#K6Y%(_b+_5mUz<^Pubo48f0$aDRC>*iF-sD$ zG$9Rfz5U))y-i>KouE&h#Zbznt8E)EAo5UE6TL1t(-5LTg186}=Ey?jNnEI~LKZ5_ zm72GL%Gg4M7m^DV&>Xb|>|fFruz%N?{+Ydh(i~a>(yR-G$Uy+&wKU7Zr8}B6*l^*Z zXfEWIAx>z|0<@iD&Pqn{Cbp7c-QuofNQqg=cmerhO6Ht^;0)I_ET*n&G;Q-(*SsCP zc~H&?ShnL4RMlA#^!BS9-Vv^HJmY3^H;G_Y7xya7T=v)*xD&P4vq4F%z-bs&#DL zMaoobW+JV{OAy~e-D!@khK`2uE5aQ$?NKO4qX2l?(a>In0D1|KNu|a^c6Vcs&`ab3W|C#+K+QO?)7CUa{g)==B zc75(erX$@VH6g;O;krfACc5sGIm`Rh)Cebud!MwSv&P{jQ{0Umj$X7*(WTur4kUnc z1lh>lvEm5E>o|hZIt5J4PcIN@BC%=!(a_Y{MY^;BvEhh19K$PV6A19SOkHPtrD7|G z8M#-_a}1%8^&6KtC9W4bJj2n*=odET@C(04XOL8Q%`Y=c5@NCH&!Ikj9lxMGDk2U2 zL81+p?lFIj_@VA%&tKR*Dgp|fGy>8E@zbMwRBidacq??G2v^|&=?P1VxhC%vK#bbb z46Z8I5WwVBp zBr360u{EoH30BE0Gg0+xRfg!)ZWg;EfEHcsDrjbz8>(e(ldKIgMu|3P1%Oz#hW^3l zKX2E%&(!+Bn>GD)xT#QTT`cUQno=DNyX@*zX+xb#@;T^s0gN{p={iRvNz5^-lj>+@ zb<(I)nnNcYmQg1iHiu67HWd-6@S5LamL$Y<($|+pClP6=lZdvRP9pwJI*EWnokTz# zbW&S>FP=^!ickv$q$eyL9G$chBqVgws$``Vo)n#AfH(r<%^Dz1rP4{^p2iyJq&2{# zbP_Y-T(31%%yd>$D*iSKA4)ybHM<%&#QKt^r-(`kEi;R!rw#$MsGfRq>rjO%Ehxv% zDI%CjA)=<$ndrK%o(yXMq8+Zt87Rgv_|Nr0KLNcbdqReP&WO2sPlkwkPcbfJp{w_# z4fP(`!NIV4&yEGYZGo%Nz@LmZp(~Drym6sR8$xFv3Ek14j0Mi3FZ8DygM6lE42`t@ z)X~4gP!o^-v5rw0JhQ^bcn?RhYyvk75+K&VI@M%QH8}#sifMwO!HduW*4Y>$Z3+Kk zF~lP>>g6Nm(96H1GG^}(I3)S_A&K}Q888mfINOg>bu{B_P0R(c@qD7K%Qzwl&}vy` zX&878NE8Ec!dnR*&MQS75y;300xYIH#Rt5t z4v!`AQl+_{2-Fzyu_QbvTbC;cf@#{#W3t7~_X!p)Y`{Wp5{nG(ij5O^B;smfVMQG; z;2Du?)!t^l3_N@<9A6w)-26R+mWYZCtHlr%*4B9JqX<;-STDy26Da0ebByrvBN-zT z3nkyR6)Q0OX*?kiOx{_(O8~SxzH7j0;^X9oAZW*TLC`JVH42CCf~6hbi}UBZK^5hD zA$KcydK!FNc}~;O6HWwIO;97{nA&_wh;>TJ`3TtD`a(gQTW8GEy{K^t%DvUXaIbz+ zik)FmJ#@r(CgEr>nrYG*2rf?Ih4SnPCZ=tvS!5b+{)Tg}NEz=f@m?0ICFfpnhi{EC z;uyJCWQX^bd9Me3ohm5KKi*eXO`6l%Y0~U(0y*Lf}(kU5a*z3;Xb#fXXFQ~ zCG{8_hsH#(hg9RCD7Ybl!@{lBp9)S!dh-XXWd)9-Wxy>{;Fd+fEh9L@f@%Y);AHSO zBOtDx#*?S&maC`gs(h+$dA(Xyv7KW0R2{08o2TlQSF4=8)oNe(RGsjvx_r1Ad8)2Y zo~rAkdJXUD$6a6xp2ZWk#O^9p`*|0CFnhzh25=X8kGrJzvAfFE0p7(Q%v=2gA8vM^ z;9DL(!6(CWW`6&H16DrH{N-*b=~4KH@Nsz%sq@t@DS`#0ISvj%yf46c?R~C;Df|W*C*+*KBkRJ z5Ug@1nMrZAC77Zq}SAY0qNyLvEkVV;~gH8z?#Az=N%qwLAvZ3 zLHVxnJ^d*(vvH6OwxqrKji`xx^{li0c$+=_BQyHrN6z7oFNgEjB9&fq1+yd(&Nyj^ z`*~$tPsVT;yr)m(VZ4OsUB_HzG9--z(LEIAh}Vn{PI-z_am#tB)Lcz(mKq)JL(&iP z^FqQcXB;ZJ)?okA{n+b_+!{ZYG;0UV3rMprC~vS0&Ej!(N3#ZNTw0+yzNg=IjyWEo z;!VsW6jm10x3cJYNTreyZ?1!uUY&tmGHzNYQZc~9T6o$G8X+U>n7-Vtu%%PnD% zLmc1JClibdGoKd&XeKV=p1x4DpgnydD!QlN{v=)8Z#V`lq1w&tH<%k7AE-q%+onAcH- zdnHiq>TOiv7PemDt1avk03^k3A2?wBnjacnK5Ka743+EG$k5QQVNT9nOP$@)m2%Xt zk@4ewicKNITz^Q~===13viKe~BExt!{LYb}pZLvi9d1 z1B@@8h-TI=Imwo^Uve^P;(iJ1R47rR2dAJIk2bPSTo<+P{9NGVUo4imE~D?VZVun& zC^{_ciPxNBmfe8wLOSt7T9i-bz89;3cIiIM3dj!Ly^M1%^N1&sh|q^28Lkgw-mnI_ zCu#Izgq7mOJcnKkE5wUouGBmhbjG|GUPyQ`5g7pjcA5xeAOyj4iGURnTx71&Jb?&e z!9`w44K5~qCGrs?of7l=0mfVL(fCT_P3S9;H?FVLmN()pb;p~Sx1^jgqdyY75d_`x zMx$^7fW{|dJbFtQmuo9uj!&jWI_8tHE*7QZsI-$aC&tvxTS)A?koYbmc_||)MoEPx z@TOd+RH+si%D}5Bg*tj~y?kjSi`Cv6&0QvhY}#$U+uq4e$UC2kyi?7zqP;VW;7Pko z?|d?^VXDYFh2JaO`e4M-?9kHhBcnu-w)gvZN9gFuEn%^|(((Hw$fm<<&h)4ucvhZ9 zu*Z2VRGG0K1g9`E6$xOWg&SVeQ^|za$XVk|4k&N~VSBt~N(Y6ormyv-g3}`dXHwyj zc-WwdhvB2+_39wrlOBtQp=!{?!v?EEoJ2#_N*E854ps+;ha&N?ip0b4(yL-Myo*sZ ziHAu)Vt19QDvHJ*#KUxC3pcxwt-&y|C7e0)uXJQfdUob4iWx##(Kyzr;3~~+W`ES& z;5Z%K_@k$Fi_hHP;#2-;xR<>as__hfRsJY5;(Tr~Rm{xceDcf@Y@+;gB5pWghj5Pi4!C90(LT5_h7{H&W^A)JVWKg^VlLrm-x-mXLKHlX4Y@sW=q;{J_j{% zznOJ&#`D%^^oiHc;S-+?$E-yvz2>>hl0-Peq#+*9I~CW{ec=T?qeJAOFHH2VFKpI` z0STg`D$Ef_^;$ZrtPoF_xl;22P#N=tc_HBmCw)}*4~$RoQLlsSs5rdwQAu;?qmpLV zM{Ps1IFQ}Z9P?0(@5pm4_8FbFbIkD_6>nm`BkMTN=IIosylsG#mvSW9+)|pU&+TpSi)sr~IdIACTvhcL1#NpP1?FEYVlG1^VY~$(su*d&NjT$g$JO6LPC+!nnx_%M_bTZ5skyzxdGL$l|N4gC&#T;D_3L4Scc ziJ?iIjiE`I{sPG%HTGnj7mz5{Is1RK%kg(}U4UlRE??-BsAD@k194PFyL;3ec6T?8 zEvfLDmoZBcV&{z?iTb3y<+}_P^b7=%hW3_dbpaiZ?r#x)(jMApAP6Wlf&`=s^c&*u z>1xaGc^aRTw-gXXc)~a!Jz?qKoHu?rNZ?d-bd@)IQL@td@a7zY^E{ye;s}fd;#5YT zf#3uGj|3*AW0;v+$E<`;ftU#5nU6@4n5JV07Tps>i>G5A1+aQ)q!(lgxmj$5OCuA; z599h~!NsM~P76dYy99_{Y=uDdddse_%z}$R9t|LNY~1zLa`1}(-1XI8LT~WdO3OcI zbX*-L!$BR#oai{IvpP=7)Ny17Cy_lj;05emypF`O&gw!X&+$0^#b{>r-eYV@uScd) z6JL+8j((y(1-J{vczls{vSjHL$3Hrw?mT)9-T8DXO!mZUUd=4Kfi(;1#1Cmn=&~zP zbt%sxEGUjoB0^nCGTgO`6RRd^T)hY@W%cr6u3lIns~6@<&1Ztn*y@EB5~~-P&SAtN zV5f;d20{?vo1>oMhQ#rCsnQIHAQs2xm5gzG@-b->$j3w+pS%gp19_th1$B^D@7Y05 zv455~vP$ZXHySWqXug6?5VYfsAn2Ai8pWJ({I>Gtti{ww$JS!3Qvzg9+j3Oe$=N)u zW?CGd6q|^=7jT?R$wuRax-gE;_ri(e%Y5XWDvqyaT3Q@m+WlF_@$JxZy+=mP zwcg_$;Q~)?35)IH_++A4_01=auLr@z@yS^OZa#5*Ju-_J$CnPqBJxEXn^j+nXcxzq ze#GwTE{-pp3FG+Ev-!pGcY~`mw~lXTU4?KBexsD5=S#?3+(ZV&oksRIUPtm-=QxrbKZ3{j#CG&S;-h@cyP{VfewOKA zMo^*-;rPi|tI@k0NFAP;b&wNpXNxGQ+P{syi}wj=ru|#((O!X?xJS!6?XD_+wavG! z@G-tD->hs*B>mOq%it)rNDVwvqKmEVpO4GQwLSf)n+-4LbFPF4T^BSAMUwk77^QT(*-XpA|6pfUa~UT1zd z9+~QT%p+qR=g2%=t(53EamVA~f+dWHvzQtW*VN1-9{!+x+sd-G{mBNlu`W=`5mxro zcq{V>d22o`V#r%4T2RPah>C{1JH1LH_AcHhf+tjcj<4a(J}Fsg6{yjlP8`Vqag2)v z;#5ZCNLBaaQCx{|Gg6$Asnm%pYX5-3?gG$WB z;BtE6+D;*zwv#!rol<9QrAP}Mu-(XVd>z+i=U==8=Co8R37@2V7+yHR|!J9QeoXU=ikLa1Dzvx6lD3{J! z$K2qeOWA|D5^$|d%{V0^Q+ps={ENL?dMcw#O(kWj`A-xcV)mNvWtM1Ta`X>NBS%CU z$`R4FlOy8qBu4}k$`Ju|kfXLdUOYJ>icoR_(i4^zQ;xDf^KlhOh}lakGHLVG+>n^B zkHFkh?@RPy2cHSB$__F^JLm<^GF8k-RbZ-^k*b!dVy3eJ1wO8){t;(Wx2e6Dt8q)L zFW#)5Qt4P$m6f%YS$XNDR=8JUPQ-DWqX}qw!$q&K6##P_&VVq>>TvmHUfZG;aMxHM zdLKrB=-rnPh+bA(AZ7=KlsrTAi%0QDFV4M%Pm+-3%12-(;v)zeeJoB2`lW@y8Q#zF zQTHV7%E@*8A-Qm@^ta^fSecK>ajc#PAdXbwEVc9f zu{UA<@}C>$xDRm;Im2M)v?FeIPP>%>rzW}-+5F;6i`U7-aoedL>A;D|E1f?zdlZkP z&N_cmjs{LdsK;Pza+gLQIhHGHpJ1+uCJ?t$u35-Z##UZ9(IQ>sOo??ToHtHG)gL9r zULcx<{ZZ3J^+)O~Rw)y!nLnS6&mYkNULabD;MBxX;H1uild_q4q9(k66A8C*DzFPq z#0YvU=|evs?X11O&MD1d?>A($_Zw2|{l{qJiP>x3$}G{w?EMFq#@-WYXzz)(oxLZ1 z*oD}+L+dvaP-yQ7sDr(4%j3nf_e2p|_<;0;rNy-OofgQ^cTK(kByj#k*2gbQR$6tH z;x`*0j?8(p28dIs*2m#lcscM%X?@WFXZix3q$-YEV zRW`e6f3bo_gBotP>W3{!tCDnPBE~|YFvedB`VmUkpt57?er6)~d$TW-YmxB~Ksp#N z1??w<=0>{;*4!9hf#&Arfa%TtWeVikztWYCfz;Mb`xdQN@Mb}(9SbRR^|s^d0mROr zsJ*)doHHpoe5E!8zt5X*+H}BWpWe z>6GTM9UC*+j*Tg{ z$BSn>h$6HW0qF@#2gi2&HAvv(i`b5R$x18vDYnA^iA;V2#Hs8e=JKjeB&4lj%?&QP z6d&x>fNSOGHBM;`IXWhz937J)N8hIK5HsGb%Pi5xicoR_(i4^rjvT!fBqZeMZ<3WA<;VbW=CC(wfH;+qqxRlm)HnRw zBnjT^-z6(M(q(`+Bv>F$rSc6AGchCeuKm{mm6f*}osyBar=vapVlmE58RczLQr^@I zF#86-q`;91ulYM>NkUBaezY{QN2HG&lRcscr7a*m zVd>z=-s?d^LiTP-R(71@28c7Ay;%dqsf6qu+4ehjT+84Uskw7h?D7ps62uFi#{rSQ z2Q2Nv>)55Z@OoVnE+Wj4pfJ*@*DfkZ`9=$5{wtB2EfBrFh^#C^O3ahGAtmNpDqPOI z$pV>wknt7(v197S-=2ao;6Jk-;di~mcdN{radAe~3&>zjBKMp*`4z8Y_gQDXbuVCV z;&mi0S_g%f{D$3|(ah?{f3PKedgm>uiJ#tKot)n3@D01o8TIGpIrL|-0;NeRy=FhN zBoRk?NJISj*!`(`lxI*D^n5IlhkBIgbwN!#wUk1fJRm_l;3LeD13qu$0UuV#0Uzc{ z&E@Dt?0^q1BoFw&CPkkIV*iqQn*F;DZ6nXelIBollV)8gM8081yq0D;@Y5a58mu|_ zO`A%3qR+>+ony`kAjO;52_V)j?g=1LVom^g0r_G|=J{B`8J-7XG4(u7;YCFxOmQo^UYZ9X(7jzCu~$v;^j z^LI(!2_ViW+p|)C`jb5?^;YOcc|Wh=kuwB}a=l$9ENASIIoZ^bI=devZ+FNdy!cW&+ZMv@=+3`Mr2+DWV8hPXXx( zO9y8y^&XHA)1Th#dy|z`+*0C!28bhI7Kl>`MLW`QEyZ)`vWM`#Bnk6gOT8bklJxJ~ zDZ1kA-mF39km?1zi=43w1er6@_uc$6T3H$WfGuf%{)4EA`}3@u)1N;+qYNKEhYTM> z!6lVm^C8TVMELWhA@0u~l`6{%_UDN_lx3n%_2)?tePdyc`15b2KhFyB=b0-tPX?7S zf1VdI`19;vQdgw<^Q1Xc8>Cqm3K4&vcrDH1&v!?&2HV-6Z#%~ve_rt>=FhWkas7Ex zVmx>+AYV+$`167@^ygVj_2)Hhf6o5AWjp=6fvZ_1HpEox+y1N^H{$IMqXKrxuMg92|@aO*(V3j}5%v}C_ zZ|?E1d$+4+;y#?DNBNd9f1Y5$CP5VU=k@DqK7uyM*VTkP+_lU4%9jJbJXc`wJKb}A zW$6xmW#+_JmOASzOPTL-AO#%EIo?h4Z)j$1=trHB@pJcpKK{k_3{J>sBTq=$$mTgT zhQ#bO&u5lsW4`Sfs9yr#mPkW;NVM&ITjEdJE9=`5P-vtGNEgz4+qOJjJl~cmLT@%8 zJz?qK__iMd2{B#b&3-&tX%$S0Z)<=!0%3tTl^vB%^!b8MbRr>?Pv`jpbAyXc>72tL z6Y9LS+I#yX;95EQlv6Tt)MoGP#Ef!uVp5JGdvDVeBvRouFJ+b_#ANECrI9Hj4P}aG z+sPF1cakXr3T29bI>=O8elMO(5k)9P0qF@#iz!pt<88NsgqTcO@kyJz=7z-F4ZruW z6ZZ1o0an>dX5>uaXH69|QuUvvikZ$|>AalU&uBnMi9lrl#&RakOv`O^4F#kwCM($33*q0iNCx)SG+)M90xWAm+VL z;YOS}XhAJ3Id)j9&sM4W!BkEUNO5er=eAVf)tM8p}23t;70x1+|HK2Y@(JJaXm^tT6eLLrzO2t4OjFkCL2a7pzu%ym9SW=D#BSlDfpPF{z z1ayx%N*g+6oJt&BcT|5=LMV{@jA|qXq^J44?>Fgl2|o4 z&`@$NvC@WTGRff+(v(&j*b2gn#N#vTqh)wi?`wg6HQe}>D!dHVH(d}J-1IOw=o?akgMh>OB z67761qn)gfXeV=}<}7H5MLT&RCE6K1yTCpq<(7STvgw1o+q)2nXcD%iOCp-x(WT|z zMl^}@tH5dA-^~}k^{a2Ks~*N;maJRMn5BtJ3fwR*$zp0;QsbXTT$1O&PK2-7{5L#! zhAuYx21e}r=YrEK;OtgM)A5_f$4Ys$g`hSb_u!;b4R6@HdiUtG`h>`!RGW{vl;yi3 z=G)Nt6tVg|OII1($oiBNbiNh6gyFn{;q&I75 zb+o%B)eA_Z-D4)ssLoYw75!d7#HKBjUDEft8x5@QbB|M^ZseJ>J^1Bc%=bAZqaHpb zsfU{{hk|Mmv)82}@S9Os#bgQUwi38BNFe)%6m_AfFq?SRW5vHhTRBv5@X7*1efe z!vNn>M3gJL?{hCmh|AmTHG(> z=jq>g0TF6ZQtC&vB%B?RK&L`_F3!$}=+)LZ67m zRG&ywGY_BWL300U->9l6K&g-b6y7a!Z?NZg@XCs_thd za=#94>WHs)G=GRz`ht%9w(duj9iiy6+#dMDf9BZ<>ehag#b-7=b4JMvr0ed{DAf@i z!jz$kJd>?GQMuwilg%0la>_LuY1@g}Yrc5veHU)ir;L2xPm)tfH;+1_{~4-L_(V1Y;JJTrO46G0oTgWFPzdGa&$&UIXWXn zjy_J|A!e`nX=aHwCPyDy8aX1;P>zVUog5K=CpjXZP>u+wgB-Qx@#4u5QG}8cke;w~ zaOCI#kPx@`v%gGMc9bIn#F@ih2*jy`9F4b)L-G8_c~}eZ&zt>Kk_2z|*Shi(`n6R9 z-1_=WveFU@SVr!*Zj~4kpL^UwB>1y<94alIPo?2;DwQvG7~t6RCBFqVR!)ECl;)7r zGc(HRnJIGmB?>1od(E#fOSCaLy=`galt@E4CE9j!O8lMVlz>7xC7=#++Lp(QC#OUa zN@hTM!qUN!)8B)Hgq;2%S!t)fnfK0nU=5JSWH&&Z%8n5%t`|OvIe#+O3)ZLIccscp zJorkpIFO~nm0=iI77JJM(119QIxKu;W6ad(^Bq?<#!Zbr;BjSRlc~|Gfh!v);kd>h z!3A&jPns7I-LOAdX&Hn*7#@A#1EL%DdjX-5(Vr99UrQBZU^}Ak%^KKFrP2qrh(0&~ za7G_Ys5tSXah-p$IPsQ@^1mfT{=Y+^CnoBcXx!(nwsOB!Q9&Kp^*)^!5SbPA6r4#} zzt}S$%H_?Wc;nuD?lqug0`sY%&geNjTRe#-&?S-KO>HfjoUi&k`le)MHaC!zVMl-* z`H6~8OnTIbn;yXOW<3otGU@Xvl@Vc+LRXI@768+c93wZk-fC^?Q^NUV`srvCFCf8` zEBmOBCEpPtZ`P3SRtCf$y*owLdeJBf>rZvKgLnwY(&*M}_8#(c?NwVm4w z`UWkLhQ1`x+KC>uX~dtL=QegiK%p;5K;fjPt$9zx*0kmE;z`=3Zgjh|w`Xo}r>lxljDnY3`|$DnK|obuXl63RoS%bxRs7Vkdn%hfygZ;f z;)IvOa4>0ry%4G*;b5nyR-UiE+MF+tZAzbMu4`?zc0a~fE0a_`m z&xa^}MSa5|+-Kywqi?t^qdad*k>_O;Vq!|#s1h!v$3Pe48xoln-I#AkoJrZWz9DZ8 z#Wlq@ba=LS5=x*;Ad_;ABz%X((GZdmU{XTDOlKkCI_qaWx!iebUuGHF(*bhNNX}ny zmIIpJ{?Klqg5_+?NZGt7D?BEz&(SLvv}%EbukDrF^p?u>ms-QN4OfQMe!WbrQOK(U z`@)5ydAq+|D%SMNvYf@Dep{BaSky1dau$pF5WBNj)F;_xu~<`lq{`3-+J$0$nBCox z;s_}f!c0VkXwK<(?YCCgKI*sW3rzhUedEj5^sDqkZ@y;UrO#&$>HuO@ll$JT?_&<| zpS$IN6;cbw%$-@yZzV4_|lh1;Rde zb*$Rzy(gK}rnS1F_nzd6#UPR(N>i>`r77k3-V?bD0?4OmH$<=HbJ2GWjG~>bulUPnujqVIgIiJ9!6n>97bWT)LaiLV~0_AA$b@De2n^V z>|fFjuz%N~tvX+0!Ud!`bmvI3E)*iCa*5Z{EQeFNqgjKsr*cVi{Jmjq=auuG0mYlx zX%*Hj?r9ZLVos~b3^yfno>y>&XIEHEJ-ec5o5$Ie2kpIKmhF7cfEDNVCs}w$c#=hK z35#hbfyso09Bk1{T*QMdLeYW_wg^$#54J?#le-!$p{{j(j@dQIN^7^w+F@!+{ONaj zvj&K3ph6%{rCR@*^~6djp+kX4xk}7*c9rmbq+Ydmq~2v^t=GQRA&OdjT0> z*91$%xZBP^51Ia$^*(jj4%FX{^?^d8%_q^^Wbq2v8}`y-5|h|D>4&v*x?ejx?k>x- zG7aG5pEtW!2zSTCq1e#ttli8FE~}x}yj*lG(g0jzFFUS9wr8||+f(e{aWs0wlw6BU zrrJBcBWtU4eSUFjB5S)AA zjzptOGI4H3nK(B^Cbm!}h$$%(CoPRk5LsK9AkI!Q!J9kDgu}DNlL-P{5}D|9$TMmS z*D0pOWMX}?(#~L`iyd2NfVfj})&OxTQ}#BF0;)`N@w|+4@w}9|cmd}kF(v2XwxyYi zMAmjL5@)Bm$eTOOMTcjLHx~(X3Fczo>JI8zegAR0(a-Z$u;ZZIPR~%kI?tuDMNBJl z4HSQd<7hO~b5XCRC&-l8iidR>p5fS$alYav+6a0x0smu2%;xNK&HESs4tH7^5Uv1KzaB$v(6H8cB@ln3@F@eBuP)S^*{ zER%`H(kRR1?r79t!(}q@N1x$v=7+N?R$Xs1N9HM>19ko6Csw}d5l=55?)W;GnCXny zYlX>C8J^U2u(aDek9F{a_6&z*ZTpok+jLy&IwMi5l&hubYGt}wm>zpiA(z`UQ7xfZ zD^)STwK4+0{i=n&d`y4I%T!>=`*c@>hTCK7aOo0RqmYMWxU7*j(Ko|Lzj>b`BP7VZPuiHhytqv~2INO= z;wIF@Z6fP3*u?WQ+QjoyY~s^t6G;thBGJWc;uT9{6Nxa@CXxi&8|k^&#IMmNvO;Vk zbEW3hNt?(EbJ;}p2P}TeTAjh?|bcpQ6Y@kA;O9;dQn^ptCO8#{eSM=H&F z-HDx=8(efL>!ITTH>&$jKuuitvo3?~e^^G{|F9I@e=T)Cse$e%x|r^N=F;eXB23l& zB!PNWdM>*E8`S-*5Z%vQsrkaB?&pQMbU*u(QTLO^RNYTJmPXP2-O)I=?sw*gqx)6Y zW4fPpi>v#IJFfc$OQ`!XK$lAtbi8HBp?Y=`mKjY7LI6RwY;3wtH zJ_Nc1aoKL(<#U>1TFhTMJy~hR!_2!WyI*dAIP=b%H9(xols$qofGX2myfEWjyf9@h zzJYU*n38kxwM#P>iLC8hB+gEAkvDgmiw@5gZ!Qw(lFY^SUs;uBjTjTr?_uDzYi77e1Z&{l8O=NB7H*t2F-@Lig{C0S@c=MY;5AyszTQMy*zaN@XIp6uc z4Y1~#--ZZxD$g1s+{%E^Qs(zzkQ>Hj<+;am(8$bhFWBysI2ZYj!8YF}xG3X%zbHB1 zBhRyah;yG*c+G!fmL$a1kne6Q0}Fcghe)*yNYAZ6MEAgmKPeCP*&hPZ@*sdh;YdFF z)0W?hCn-b`N{SlNu(X)Z{$xMLaIRu>Om5CgR@$j=^t$7t7$EKxpEW?7N~OcinZ84@ z(Xa!E)ZPO#b8Iy5`G=b@@A>Skv(MmcBDkmZ2@nD%C?fj^a#~*=Ja3(kX8QR4{687~ zFaSyN=QXdfdlSzG-QoU-J|ieyjvS8HN9^T_dpMpoa%fPl*+YX;j=u7Vox;`y$)b+2 zuXb1bkLs8U(8%hT3!Ty&I_41>b<88?&@s1Bv5*R{`Jc>^gqV)`vyG2bRHZ%JNE(!?Vj89d0`q(qB2gtZ;;!FA&pg^G89lQH_wg_G9*jq3 z)H9Dv>Y3(UR4BykHNVL$(Z+PkolB!zh&0qKMB7fc5Pv7#LO`KzA)pSrr7e#aPqz?7 zs7(UW6P6B+Zn+pFBy`JTQY!6q?rvQ>4Oppi<)*tJX=8*MAWt81c3#hXsr7i<2HTH2t3^>K zHT`fmkbJ3id6W}IKfLs%W=&Jb(Wg;*DIn5lN9_Q30nw$ca#(NIIO-1l*f5bt?$8en zv)n}utu#y}s=@jU@;wC>Sok*`2aeD9rgYVX|(p6J{#pgytkB-E76Myxv4 z>IJORoAr#lJQscEU+h`nof-Al&ZPcQ5@p^abbtzsJ;A;`N%fkQe$8#3lnF*d8D@R@4V4@p=yCD$OBc!}|vYE5*(C^Mr3*u3$%7 zgRWwwU&9V}ar1pLhvIxp>S*%u2N-X~NAnyqd80LSfoH1Q@Fh2!Vt9^ zEzq6ZIng)Tc7)_?`5MDl%fo%GE72u89AUhtRx`90)c1Hew)QqJ;B8=i%9>>cSL~YQ zDyKvn(cybekIrcGADy)M%{8>@#OyW4m?hfSnx%&N^mj5XXn%!BwK?{S^YzwnG5vLfZG#+wypx+CJsf2T_Ep6xFe?w3us_?E5QME8fP|EPk@mPG%#A zQ}zsq0pchWZ`J^DDwqCSmQ7G@Ne$)Bd1jC;qN-WTTlAdNHE3q!t>gOzF3u=l7pKVA z1_~81QHG=YhU?nO)mF6SpG?Ypp?CZ!`VlgHPU05{R}K}XMtbwTJ4UC63gfLKbH&kJ zJBJF(d%S?itSF`6Ov;iyC&imX@xi_Eb5ah^7EfXbbV+0+`}+r+oWnLZ zxKm&0^ynOWCg5h8V~@!=#~zb1$4=oKBc|jW+q^V$jL6!~G2-kr$9Qw6Ip*+e@#YwT z9^^UpEXA}g=9sx*jyd*hz|AzrrZdj5>6AIPopX$sl5_0LrI}+y)^?5&XQw&Fn>)=h zhi8j7#|U&u=Gb9#_^0Q?R>&ISIf`kKIp)niH>J|Lq~-&v0a~T#ytB`?{_NQaJkHd# zc$`X$#tVqRe5y%&v*>piXK`K6V;whZp(Y+TW1S9zDW5oe$9MEw)4MXx^fC3n=4S9ppL@jTfxEQfM5yP!;-G|Au|gvWj6n$(BnEYWF(_6@ z#EZF7a~BAUMZ9<+5%EgtPg1T@pIs!4TEq&G=lO}p(kQW@?r79tP2>qQ#-HbR=86;b zQC*KkeOSl&GEXs2d7huRy}CtQ|9_Ku#HQfZZ@(aq0CtIWFD;BnNjH*4@X zl@^T`5J9M$JHGgZF}(%9_vO0u{y1wmwn$mS#owv=0yHzej~Beqmb3+V5o+QVgmq#; z7*lCNPxCLfkFq4ihu5F2MDAll# zAS!KPju@7_2gAY&F)YlLnpY(a3oj%M3wRn`@3MdCw&gmsmGcEHZV-6^Y1T$SXihaW z#A|65L(?72aYLhMj=x{E?HqF~kK#?t^001kEe|O%mPhzvO6L8lf-|&3ET-BaP1`)| z(1Z4VRm*n1U)73sd#l7dLaQXVghl!i*dVFbO7&W~TI`=ZR_6LbjFe{LA{r?|EZw*u zBPB#djZ~*Sn&@{)UJL>fHtHp5l`lFe@uVA-r)KFn7a-*&59yF^v=#~X1|?f zb{CKZ1ziCZ_7KH{sEA_L)msDRw4#81D(ZWqqIgCY_sob2dZJ<$b3hEJpr~NZ-ihgq zcZM_E$<@EBtGhb9_r3W7yYu@kysodis=8iR=<4v4J2JJl!aw2L>>PW) zz;US-gLrSk5Sy4@NVq~5B}ck#8_$m}G_?>@%Ri<`oJJk9o>le?#+>W9lmNIhh(O z$}`%oC!P_o@p?wkPJJO$@xBnnqAzsZ4B-o}wL8{=Xq&ws>a@B$^m7z<=j1d-cgGx! z%;y04_W&2@|Vy56e@XK;38H}&^F4kG#C z-z>qGk*gP5z&=-Gsyw!-MWzu@WEufQrrL{onJQoqsi`1LnZ8=M+YSI}MsT;i58{mA zZhIf(Dexdy&0Yn;B#v|P{`}QMRJ{#}J=A;|H4?T;{`@smE%xW<5G3{IfOYWa59;X8 zA2h(9pACNw&d8sGbmGsSKN)`xf<=E07T_yc3hd99!=D4d{v1!U{g>zd96t>5=jcyI ze-0jt{v31ykL=GE$KzmsuEvV;=eFyKKL>2Q{v5PZf6i3AKS#0X&mA{=vOf=^ZT9D= z)9TOB&r$rjlhYXeIde3UKWC<5f8Ms$#oiBh6!{_infkRPlhhT~=jOm*OvRR}y)J@8 z+kKBj0lUvbgRffLj>gv!=cazW<6lJ?IsaiETA@|!3jz-1Kuc?IZ=j~Je>jgIseb^h zgMT=wqklMQfPXk2{sEkke*o#kKfGo#{s9Dw{sAn&_OcY%Kdgd(0D%1io@V@Tit-P(>xq8=Y`p#fv{V1URJ?ycvFINhH+!;w z2%>HF52(}XAJETH{DYIz82tltG?IT{riS(p=aWn_|M12fnA=z79|VbV1*R4x3OLX| zoJ2m0*FAWZ{BPLusp+W|glY4t?b|{Jh=%yM``%Y_l@(g1KEmPI@|l1J zJ|g`t)0?TOthw>N$%n!D(qD3J`oSIT|APnE|BGP%K{eld^!B3dANj615OcP_Of$F7 zVGku5JL^e}^F5SGenW0bDC{~0(uwRn+R~CtL9YE9^xip_a)A|EvcCP60&v)9=&gh+ zK3T|f^@X>EA6$~d{cvIUfm{^M8M+_d9)56V4&4v$pdX65bHx>5AJiMD&z$R!J}a#^ zwe(p7D=;4`To8k)&;#b+s_3I_=s*N_2@LQb!Ce9a>J6m2o$&vvE9Az z9sJYviLTubTmeC|*8wg*i{qn;Ayu1t=v!Ghe3V<{psi@z+=%*fKK3%{lwyU z9PB65SW$k$c0KVEfQ{ErfOhI9n2PrkC>H&M<7Q9x6G61iegbt`{RH|sil1uc?|a2}EuDG`!EvVCRLow}eQ+!~d>;!>d^07( z!p)Rij=!tL@;#7T($q^^7lcp9V z3OM;W*2TnmGROKPfdcozPnG9bKmd7!4+U7i=L&o};3pp5 z(N8>lfS>p?`~)~7KLOH-pZM)$`~(OV{RCKm4Q45@pV$|E0s!_Cc$)41J@*s%VUV9d ze>(aJ@L2Q{pc8mxKe0F-2m1*%R+OKxT~GW3VB_@@pq=^&rsDksibX%+xY?8aL=bJW zpFo{fKY@OZ;wPM(#^@)QqmldsGc~lI_%z8R^An%Rfx*%i{DdG;F2U4-L;-27wK*Aw zT-;wM;6EPoieQ`ah~{zO9RNQJ1u-JfEp%AS1x=$)S+WZ+j`5~23@)`a9eLV z?#;S#;R~S-97%7*u7%422-CgZ%3TYW2M{JPy;Zvwz8FB5`}J1uTKG}`tpRAwuE#7~ z5ny`*wl~4P9AIk!TT8I71XvHS9>KmEVCw)|N3bgcY!0xwT?!HpDfH$~08&TNEb-oemYyxchZ9KT%$@f!dfzu{@NznU0J)>84qp!f~_=@`F($71{j zI)O)y-xkN?;P_3A6&1hPt|##uVB?M7Ks$}!n2L|zP%Or8j+;F>ehZ>)j^9wHHGV@s zM~UB@oW>ZxF-IfCZ_L!t@!NMuCRzOU-5eNvY$1LVBq~%hwIESIvQuViqg%J6d$djU zBcf!JM&_cq zkdb$>oXyDpkdSaS7tZ;NI)p$kgT>O6Q5X6D;SV97{&td!-K$igd(CkTIuo= z(!Yli`H=Ml`457mo)<9oye;>9JhG$TedGYYyD$7MxHSFEcm#{&g24mU2=slX>*)8g z4<6~B4-j`gm?czn$Y2Q0j)lVx`5-uC0N5epX|{hbahW(|{E$0jdQW-(%0BrF8H;j% zIe2!?lX)&WXwVHjvx8n7m9Jg4`3G>$Rlv8`+pj}6#(JvKNIkIizClHBvbG`;^u zvFN`YZ$tR+YwezoAa>mI5mdX`o1=yI=G?>=OZR+02%|W6C&V#2cjjm$=gv%Zcka07 zBb<}^35g{0?N{f(R^Kj2lp8m-AW=Zd%`{(=g*(vw9a+}B*u=SP)cq;(Wa^*goSFLP zIWVy6*Op877X~t>0s-&EJR!w>Af$k;*BsmR`H}C)`UNpo=#M({iyE;*cl*ubdli34 z)#7>Te-b41mVkAbr#`BqzkJjHe|aRFBse1{3DU_t^@fc;@;vb&_L{~;-m3_LMYjkR z;9^(`>=qA(TLggJBA#aZN9S%4KjdyP_KE0E*(YXue!*kW4T4VKk=@|pcud`(oZCN& z;%5G~28c_Xh0kPgbY;7qcs;-9i8^>a+c`#BVge$H_-grB?C?(hhrZT4)a)9T95 z&rw{NlhYVo8FMs}D`Tc&SJrlAl|A!&XR-tMGxe`XCYdk$bqV;J9H=bpl=m6sJFA3_ zas#FoIuTIlC}69@!2ES&fAL%Doa&9t1(m-*jSl|ecT_F*7r!S+>MsE6;4dEC(O*1z zfWNps`~^58e*w~ozqsXO`~?UW{RLQnEoLdOzqkSX1pw?X@HE@MQ|>SD!ytcw{&e&g z;IZg0Kqv6X{$g=F4)zyntf*O%?Rw%b02{Br0PWOYFct4FP%Qcj$IYJXFM?>B{RQf@ z`U~`P6o295G)8~H9F62Jn5o!b+_w27#+3CJ4`z2k{^Gw#CYitZ?-KA2CEy=(pfbDO zhurUeoP%3J^RD}5w3TNtwa|`$LOTKqZ3U#s)$+E!!?)nP;%$6xl;>A=4#a6vN^FL_ z-Y%b+w5hvYHZS=n>T|O8{pSE`NS0ch@<~UJbGH5)9yy_JWq(T%_Dtx2}FIK5M*7!&K-5067+K)6u!Fz zM9xF72wj2qM8AjRcc`CNG|GE?C!j&XpMbWn)R%V8cbEQVWt*Ib{(BA#3LxYE@NgDQ zkSL8ewIESIG6T&ab9~3^|K=>1`u|G6f8@ZxEWKahw;V4E9mQp!69I*e0^0SU_***H z5I3T;t@jQ*wxf_o7;Q@XFY|@r{G8xp9V5 zjmUt~R6r(4Lzi=l*Q*Rwkg;m2C86XpD$@i>XHs600j&k#qsRWVliXc%+_DB{YlrW z8poKLiCNhsGcmx%I}-yZG85y`E+tv7Vw!$lhGKDE=6D-oUUsdmR|Ts3ohB-xy8CIIHZXmXvD2bXERq(E$5e=CtgjE)Dr{NA-DOsj=uPD1AOs| z;ef#zIbe`Z=7G;`^uOnk%=jLnA@08c!J^9r3vjtC1$Mb~BG*{n*yZA<+5Ss&mx~{A zmm9~<=ug?-W@};KvFKuB9@)h%j>pu+=4)YUtSFCayPkMdz{cxQK|A%KOvU?96pKF8 zaWjMuz1G&kf@qt)ChD}hN%V6RH|gXwMmNbEjpQbosqStvx&L+z$t3fWd*{Gljl~u# zKPgC*OEk40QNY&J<5=>JYl-v3NA&_|_`KsfLJ~yaeRMhR2qt3BqWw1bA@>7}sFdU# z(=!8eR4w*D>j{$jAHX{JpOZWKpOXjppVz_vfHU$xAf5Q1S4_tLfMC)8fCcy;mIC{q zqv3x5VE==s+5Q`I|AQX}`5*MBqyGVqMgIdjfk*Z~i{o*y|50N_`5)W$#Qy*`UjGBy zssCXr-v6Lj^goW9J=y;R(Kh=Z)M@oU=;tW@$H{4o{)agl$^S4@L;Ih7NG6&8na_d2 z_!j(+AW^Qy)Ph6-ZH{;Y#lXk|?nlX@jYP;E8NfsPkpa6$@9EU`_I?hDcJ5kV0HGCIsyf<(YwTu1Hz644A5nvts(c?S%qsI^MNAHF| z0%zopKsxb9Z<&lg0>Pp`0t>M9ECu#Qbn}w2yseFkJMOE{>XMc@kfA-*B^m)>W`R;_eUre{gLBlPxePaw9Wnqbz1!q`Z{z#B0*JElyqJWt{I)DgSe}so?#~)qC_O0ZP zz=QQico^0nG5RKd#NC8HvNSw3eRCSu!6~njKiW*Z#s26(f~5Wkunzv{2_5~>69)Jr zx(8!s0i2OP0_nsbePlBJ2n37%2rR%Ku@u-J-3tB)0QN_Cn(fog1nH6(ei-DB(4UU} z2s{@35$FUS*&i*A$HD$cjTPmOY}XTi1lV}}5oo9Wh^csggksSjId1l3e-uR9?2k~V z)gPgsqxd5yr!o2?=4d2;#7qtCj}9W4Wd7*7Ik43q2@>UcOf5(h@X!?pG_N8dKlc){ z!Ql?kA@&7ck2sI>bG$m_GIKJ4nj`(h#}~pTKzDZ9t_~ecNb>%kc_zeFPt;gZ{={}Y@h5Q9)8_a`V8{fXmdPxdE4w9Wnmbz1!i`ZilSpa8b_dz^=Z&_wh8_r}KH~JOV!qvis;yN4pOmi*_G$0*`F>7sumZyRXKIvir8{iQNZmymlY7 zQ@hVpyxm8!X!jjAd$QdRqHVVOsMBiq(a%xrzLV1!?LKoflHF&fhPL~MlT0$Zf1?~2 zjA>z=MUW^HZ)!oJfRnfTHzv*lt0lXS8XfHZO{iLI_m3b*YWD%_VE0e!X!lPWVE5@v z(#!%lBfAgMiQT6|e3P*IAXv2fU;#FjrNDNdZbmhhH@5ruX|_)XI8wWh9|qZd^rxfU z2aiR&AM?m|e{nnxw)<+VD7$aFp4ffB#%uRMJGJ{v#oK)pi+0~}vnSjAAlhcTk2~=vBv1UgZ{lun=SQE|(Wg8y_bGka`aH7$Zpe>- zT;fOQP|_s)2nZJa2v~q0;hwV}xfA>d0PIKbG~1{BgsC6F4}<&&`qR;mfXAXA0iD1j z`;o=*IM|P<@uB>P?Rw%z02{9#0qxX}Fct4dP%Qcp$IYJXM}laZ{Rrx``VsVV6hGqR zG)6zd9F62hn5o#0v>m5O_6gsdWRm%jV{%|{8-@9UAW=TS)Ph6-CqI9<1#uo&EzKWL zBews=^@3Ycwb<6*iXf@22dsmwe^N(V|D=Mgr#%NV3*d%qJ;)`to;D{=!q$Ue(bj_n z*ir5|+j_b!-&o$**5jwyKCO?XwjMtWvi0asM_Ugbi?%-Ik!}6rcpPl&LEMcGW$SI% z6I&11cx^psr?#G{cw3KR(bhX|_GDWhMB8lZQK!|`qo1SLdMBqb+Ir?_BwNo+4Q=ah zO)|-B{cUn!FrWonFG!SGH?<&9z{%VCV~O*?YRT54Mh9DeTdEe@`r`(QT%wjMkdZ9V7&9@*9}j>o~aUX2fB>uuK)TMyWHZ9QnGww|eYTaRMV);n(YWLqCZ z+idGmr`6V@pQG4%C#Nymdgf>(ThB}lZR>AGGRbWH?Q>u-paokmNR(MOwIETz$=mun z5a)r_lC4LL4z~VysutV&I}#+d^?-G-^-u0->z`b(_2ipo7QhYJdXP(OJx%K-Ve3J# zXzRfO>?rq~ZT-Dq>j7X}kEhu_$vL(4_+gN(M}Iondhl4Z^`H}YWLv*D9tYccH9nNB zw_Q(cJz(Rt^`M>FdZyxSJ&HwJ@3`5MZG8}Jv#m#+R$GsLj$-SboW^MDnWK?xJu@}5 ztv`WelG*w@<-lM-3$|X6D6?*AL85?@xAk`>&I79@TaOw=TOZ%Obs|-hIl8It5=vyx z@U57;5+t?!fU)IoxqIs=9qs;8a=ULYgWIrh^W|jt`}cwm0GFnJKRkj(atGicy?cwg z+~5yJx_b-6oj+g+6`cbZg5hQ1uyeRCoC5&t9Pl*Te;{$0+`WY#a_2znA@N-x=wI1C zWOr|YXJ^Qn=c2O!-M}+Di^cJrIt$BldiPf27*pQE$|mt1fQ{FCfD`c^EEg%s-CIo4 z`w|q3zQpl1gfF?)?%oPw$K6{&wVOQ)T6oXGO?0B)zIOpQ zY)|h)xJ#(ii}+fib{SJH`M{9S{RN7LFfWn*I~;2o@;@ z01s&l@KE|azXy8c`!_+{#{eK-i~+z9{3#2EV}Sc31^|F#06fk1pF~_HF#vw(5Cfop z9b*9S>|+4%T#NxgH}K3cz~XrB6azGlF%<(?*(5OlVB?Jez=?Q$Q$a3Lk{Ez#`WOJk zVhrGT+mmB}Aa=w6=qxLGa}0nM-sy7_Uo6D{5W*-ifD_^vV*uu8q!@si8a4)a0Er}v z0VwQGfw{j>=S&2Na`&bdBnn7Q^zhbwWdA}whkfXSau!T|k^@GL^}z+;u#WX1ge&wk z?5BI?GlOs3W<4W(qwuJD7L1}A$`%(siiL(Sb?cD#t;^DMbBac6c!b*7-Kw|sDv2fF`?vQ z407>eMz*h@1FtJ*O$AtpF&-mhgugK%djwDK7-O8C#~A%*A(#MXrhg_L!4}08pqs`O zr_=8fh$}$c#}y!7j4Qwpd^8J$P+mqvp zAa=wR=;D=?M%b74_e^ejd|VNn6CKTp32MKf6C&-9F*&yo*R!;hxP@tdt)bLFxAo7kB zh+Kj1VvoNG)hO@reVqm*{MTtJ@Z(Fn=bKPZCKfV#_mmu%>yWZ{f<&1%QwtIWY|W)2 z$GchL&-$rtEOQO zcmxZHPMtRyodQv>Qy|-Cs!`tK(kt()2V0V zz*e0SBx*dHT97Cp>D2y>xrvo@N6$^YPE|Pzrmh({`0Uz^Zp6CwE>jC4#fC=|9bU`z zZ-K~#IqEZ2X@LGcqoe*kV}SmB6iNp!O#hR31Ph7&y>Bx52clm8K(YpHq#<(C+z(x49Gul`v`7~*u$rbJt zdk*1sI^{Aw&m~B@ngkeUdN_7`tk{J(*Hd-Wvuc2zeF@41&M4Uf(ut0Jwy0wx-zf%y zPOa>O!+*97EFe|FQsDH?4y1Pg;PeijX8TtXV@Y}kKji71c;5*6lj|({lYK)5JUWe? zjy}@{I)O({=PZs#hZb{v` z%-1+>hRD}kYu}IwqHSLJL7mo=4Ei}rO2)})j42uBXrz=3GZm*~uG<*2(0E0T0qYf) z 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]-Vz_uT)sooEB+m9dm*?x?tqwNQeMcWTLfk(Fe zgYnqk_N)1#Y`-0PV*3HZoKe<&MB5MAsqJSf-u9zgwEd2oUD@^r(Kg$DT+?d%G0stJ zzmwA#Z9j7~lI>@vV%y*LI+|U(5AUP>4ap?2{lT32bu_g`E;ne?Y1hd8w^&?V<*kI- z)>Y8py2_0LLSwMH$}8!Pgilkyssy~D1blS~_?iMR{i^|DOJvK2)v}_`1p)0|sALc~gK5Usri^Kq7UOw*=7e zb(Mc0Bs_++t^z%v(V7a4s7}Jyr*#!5iM<|;==zcCDsLlxBx~xn{ z(B%jyx*P#Tmm{F)vIbUANz5-@SAmA5Fepq4!~9QSn9ecGJ~>xc!JH0t6`9+LA$zf_ zt6*NobrsBNlru0f3q)L91#^@x;#sEa89axiuEI7K=beT%MLYl-TgQ7K-cA?AvGqR@B#o^BL!9LHK>Rax(>)M?N%-Bi z2V(Dz@%P^SVyR4j*X`1Ssn`T&??q8$`J*H;%-Agh(6! zj>OTL>is^C#PLHGiSw*-%VxAPf^mWXOPvY)7z6;|JrHQE=uNKA_dwv6E_)y#H+rUp zT2HnI0d!2s?F3dm#9_U3w2hczn&d z3$6*dOXD60$VoDoVfH{cIm;dh2v5)rvj@Tne~fz|c!0@nhQ50scpS-HgYAJ}$@o1G zJhFHXM9YroxNh|h5-S{FR8MoFs0)B<44=z> zI3OAR`#~QGNaF7YeH1^`H`9NMGh^0&Kj>otga3ZeEde(C_k%tjkjVFgJ`q5}e?RDx zgoJ00Tk7{42cS$=9npv^1Yds$?*#DIL(}Z_XhheKoXdWiFghfgL3OC_ihhQW1ly+b z;r8!}iak&!%~VipOa+y@dL`EvdL@s5qT~@!lw1QVXlX*Hg3_fh=uirSN~AE%@EB$v zrZdl&<{?Lx>8=>E7rPu8Q$5a+G0|bkF;@#jT#k%sOBeCP)43^6E6I`BmIIxge}s=) z+A;7oX^zY$A9vcBXzyfL$dS2^92s*9%<3E&QzafiAxHi!T@>fYpCd?`BLk*#* zj9WYLfpV?03?oVE@oi#~ZVh7)AL1O}Bwr@UC{hsulXgG};bz>>Te zTsG;+81rKAnCHdJkI#$IE#}3JZsZ+{}`MO;?FAk5dIWNXF9r9wxNfOy% z@?s}v$%`R8K{rfZ?1VqYyqE`=WVn6vVjf3w*I;=uOUCELJhCD4;xCX`;q;=s_&;)B zh@lF3u^>?~gQ*3H0uJz=@E6-yD6N6Y4PD74Yp(w}C_TAB(<{7}{3XKc;stuEI;t z&;4k4FByoO17bw3gK?zqB{#}^NFTCtZWZ52?;g8teIViAM7EFB_rm7DBMwjmv2}2D zK!eSCQ#QU_OY`7v^q#`{tKUIIiRoo?=86wd0Qj0^t-G?)@8o>N3Odo_ujas3Jr*Qt zPMcbgDBu8k{9kP>l=N6`(B!OM9ZhlyXV`v?@CLp5der-d>K$%%>=|)vE${vx&{4+@ z=&xhoPSaAbOCpb2)e`FWdRT$e&;zT!w{vv# zo5VuqYyUe3w(6)LQTkzOL85?%Pw(6Qe&G4^tj@&yQK1$v*b9E&BF zhkb|c$ezo0OTh1yfZs0x|EB;9b(BH(G5s%LbD|#p{jggDlHqH=KL|*Mul@coAQ`^) z`=fv)-pBM~{80ad{+m8jt~L36Og{}6{640i1=#TWm~IP5WFOPd18DetOurx`Jce{1 z6ZC*aYbrFNGAv)8?qh^Fo&84_K$ZGS&ZbXi$K zQ;RM~K+)w0D7qX0MVB?Of=Xh3sakLa4NGBAm=uQjpTaPmW0-w%u11SF9cr{Pw-rP7 zVppTZypC(MnAIqaVqzAExEd|yC|$&}OxH$v4oQucZ7$H+$wv6NrE9c&O!C81O81oAhmpAAHh}N$M<$lJoj5-0h2MRo%}8b216$Ckot~?AW^z(YC)oalyi0brcbaN zgT-@q5a*`;eHZ@2H+?GH6>DU`q1m@NT&$-PYqg&4rh1~M7mFV7nuz3W8#?OghN7PK zE`~yaxanPvCMc)6`H02QO;Gi^3A#aU1 zG0iEBt>-;J=1Xmeg-kb>lz@{tFeohH6P?|%C7d~OT1H1rbyEwS2q<(EaPf6|DGkol z%i4x0<5N0~yHcGN9Gd-tPEXOT!S^m#y*@gY)9L9P7}Qth zw(_@vM9pJU3lar9e0rZ|V}tXR?ngGjzOz59zgLIg4 zJJdo~(Pg4@T<^R@>{IMF5A3L82NreAKJ@hqI1bSCo(m-dVT!+XO!>@49or&2Sv&*Q zH9;w;RT9U7X0BJ~`uZhq_NruK*Ow44p-!pfH$LqF(nZjh32Srx-qKmxTe=5Pvc)ho z+ACj}w@;w4^H~$S)Agx7g*-B;QC+^U+FnkZN^QDGr!VrM2MZueXqb_xmY`;L@S~Sr zDz(6+6VD=E`1@PJi_*ZLSEd5(4HGmi9~o~X1^j@EqhIVUO=bp*@{TRfpw3dA!1#Oe zXAm#9P+f9vCXl8-@5ykSIrCJQ4+@-0H54 z0UX}3s7W8$_w1Rozy)kue7$yIj(#`w`odN9UIn0Xp$mKCRtw;l2Nw1rKt8@FKUsX@ z3grP)C1zP|@G^-UP=AVo99)+M++jewi)I#&ES;P-={G zK{NMpA!W*^q9du;vb=ixB6oo}X#dUc9@rbm9b(vt387_qRfe>##vlyDF=6)y9XEN zZj`UR3-cIEncjQR1V^U#K{UZm7BAjNzbwN36ma04C&T=AZ9U0v?nDwQ700Uapx6 z9i>~Q7CI47=qMoh^#?Ut2IRLllQP^F`&#OQb1oylehB?;>OgBRPhUgz2Q${y#v^7XQN8u#*#akRRauRi3w+ zEx`?#3XhxOC3)T-EIscCD9<~^=a$*=pv4D-=WQxH=?HEgxT)}{1#T)lvpCK%6&^tf zgG5sp1Qf%Z4-)^i;rS#KDh=J6F0`c~GkHdy;_u>qkSyh0kYA0=W!+AT}!~@ zOTfDofL55SQ$enN0;cLr5H{95Q6P(8uyeHU9*_*bPwK>g#3>MS;G#h@O)ER`)AsK$3)O`p^ zFqIS9R<`ex5?xld&D5gH5m0nF0*Wq2K+$Clte}#ZUm>3}6*Me`L19uD=6?#qbdF*6 z$+@^3bK2WjKerV__F`wiF|Xr&Qkc~!8DnA=h&V%zIZ7AtEYtgwcn--vDYm&lht?e7 zHuRDDT z84DOUz0acwu1)VtXo6)be}gA-he>_-qjW`{&!9g1Zn}2p`ZqZ7DGYe=9dP41_TjSI zBA*QYP*`T!aWQ-yis1loF&wR_-q(obq!^ALO2zOvU&2`Pd^YBPeGsn=`c%X-&OV1vKKD(6DX4J^tJ5#vd zm&_S~>H>rBmI~^Skh}moOhMgAc#H*g=4hmXIx`g))LRmEoM{yHIGsrnfsv2m@duWG z56XcmY6!Kka=tEflp8g*(20OTM*#=O*B_j7$pMn9!=FXJoBAQ{swiLogA(weP53ys z;5cF7Y+$t}noIN!e2xdR<#yn$9y~(6{;+^#_M2i?~zi1J6_;`?S@!e8* z2qBCT9y%e8F+60BMhXv^sW?3B?l&$Zk-+Ule&bO&u+?t}5@oYZEl3n_0Kf6*HWo^L zLvH9wE;-xdqCx4&4VoU=5;L)pY+KlOdoke+e(Dm{L;V5ukcRhH4)5rP4lny5vllrZ z5I4OkG(kDt>wbID|BQT|2dH}g1G=u0`9ILl{X=-S42Zl_03z4HIMVYx8s$8`m06JR ztFIOK@x5`b#dg=-ONoU{cOR1jTXk2EsCjH^L85>I=FtdsD5tu#ihjsrxsi1VRJ|^NZj&y7ew!`!V9YcGRUK%er(36bQskZ!?;poa)j6i=#`R>U9Zpn{)~E+jI$tyev`g zbsyuqDy><7XKx0;v+GPoOJSfJc;=eLU_3jtYAKBDd0Mk*oLj19VP%ulEC3sC%>tZA zmBLhzi}a*s!8Co%0^MTG!tu5%*DQkAQM15cS;3p%5y2h4NWr)GZmDJgA&gS9a6%ko z&4M`^sb;}U4O_E#Dv2cXFHg&Xt#(|HD3fh!L85>I#A;7(W1$qQ$qik}B{hpb8kC;g zpy?H2!)FlQ;HN6p>k}Iu-O&#nUG_r{f%5@z)7y$BD5tUE{pg29$g@Dz`ybG4iVZn|koY=4?7Bbyk$bqf8D@fElHnkv8zyWmk zkK0%%>8{+M$yr^B-|=`R;SIXb1V(aZE?OI;N;s_Cd=#`HzNTfhp5_44UA` z^d5&M*vaC(^XQkdzKwJSDLC-@1|EC|TzKV+*UP|5u6yAf4qe?A(#KmX+dLSwM~`Ol?0vS<6e67bJUz~`5MFDL-*D2Ljg z|3bp%#6J8vrdJ0f!|%_(CLqCf4|>7Hj%s$G{rP_pkPN>+|1SfQcz^!2_@RCg{WpE6 z%&Om?|Kfnb@6UfpfDOMt|E~fP*`NQ?02+RO{>umnk0ITk4?UpKnhK3*zdc`{?$3vk z*z3`Vu6NUH`2G2>AdC*l@cZ+xBP79`46r|6bXi$NQ;RM~K+)w0D7qX0MVB?Of=Xh3 z1tVrEXjlq^!lW?F{}hJl9K-CBb9=flr^P6Sxvdzo7rPBxnAh?Ce9UTWi^s$)5OEu~ zFh}Vko@IJpJkKH7pU*ZI=nAQ99 zF)!i)P)#viU%s9$3i0LNsGj6%4d0G9wqs0rZ2y?@>4+Y|i0Lh$2`D4knmAp1%7;Q zoH1c@0yI0$-!fY9g@1mT_Eb7&%;;m@)kDm1x)D4F`z^xsSruPFf8lnfulycXmbi3?&b zTXn%HU4%e*P_v=sMf&hto7HQ-SnUafi{PmEoy&jF| z`tYbDpY=eJGyaA5Zks-FF_ORWVL}mpw^*ABgk7s;^h5^EGirY;vp~sBd@Akbk<7uCo3Kjdo{* zb7>w-_V5;b-=u!4L$Bm%O&a?rZ-s%@8W=R1tZ=Be+~+=0i=_=?ZK5n4*Z+I%wW zuxFNtC#UThU*qjre8%Y8h&Qokt>-P>t)tDlThV6qUJZ)`ViYIn81Lnc_Gk;q0DnWp zn4sjXPP&I5G;_NX&RfFGVqI|Wl8N|SQ6;nS*$^OI6g$!U)(6Ln;k}Q4v_gyQL_yEg zdmnOxnw-cX%tSoL-cEQs&9M_Y&ao59bL<~5$3QHZW3OMFIR;9Na||@w<``~nn`265 zLC_6K6Z-Vipk3fzQT6kXoIpeVK{s0>OmEI2! z61G%nW)D%>pbd@Y7*W4_yEn-V|8%bYKC-WT)`iGYJ*gl|1+?tA92}yg2oeH;F$?v~ zAa7GaHqp_dkPO|$W6SPxnL1Ae#HV(EeyBP=J5TCp zJ5M4}_Bos6lQ5WI#PmLkCb&p#=Z6=^c7m$6ouJ!fJ3+tAb^?*Noj}xLI~!#_KHCWr z-da}R$M<%Q?fek2fXT0NI#Yi*2e#TyL8A05AW^^p_PBhcjRl|ks+e4E(Buj+`9}$_ z=oROEmyq7!FF9xT9v$`Q9{u&`>rfsLPU7<~HtNn6W@)$_5R`(tkPLL*37WaSgd7kz zdljL3(;QIAZ+uz-q>G>jyhp+N>Z8b4|2t8#z8a1GzWToOaPMt>_04pBrY9dO0E6$4 zlQM6it48wJANL5vW3y9rzS_He=ct3*ca?bS_CFDjxMDmbaaDMa#Chs~1RjmH6Idjl zv;#(|-t8;!MIXr1dO0*29lG}Cr;u#%Py6$C(!A$dlgL}Cv#CYi3TOx6{5b^e7h@|( z4Nok%byGnIDU8RYuM3ZmCk%gf!w$?3Q9E)smx?*ir--818&iE+_4@enlRMgHS*D3--c~>e4GU{#T0?;<`MixS9-9ikY;YgM z;aWmux4%R`Tf2?MAa?t6bUpZq;+xMGfJ$s`>)aRUs*&vWe|Q8V*zGR{B*WY7|Fi=x z*=@+v8Z|V=V7Eoy%0!!5wB5AoeyP;}tAI9{o9CsIMY$h5%uPp9eVQS8erpna}Bi9ch#7Re^(9N;=5{&n<3s+yP78GopLr~ z5N-3@X}G5Kbu^4~l-JRmoW}S%8gn$#>uAhW{5sk}{o;fxMQ`e_l1yMpBY*f`1z<4H zypxz0c_mF~jwrrHxKy+d)_J#Y=Xl``%HM(K=r3<_d{@xge_5EmAvVI@FeO?Q(h<)6ZuwST^{|{XywX4=WQm1tEBPjRf zwW{8M@FO6W)W`QJ`j3&nNe4=y43*T!K{L1Up+1hAodu=>US1zpG8AzLeC* zu{ZEmqGanVX!NVI=)HmeOV=m*Yc)058wj*?853$OH~1P;d2gW5Qd2ru1xC#!TTtU& z(mb57OWF;OO16c0{{ylEB2gPC>4;~OB^XNH_e+c4u0630EYpS<}7)y>$ z!Vmr8c#J2X>&5yKcr3>8pc8oHIDRl5`^WKWj;J`^4!vQX45@mBuV;gH8pne&4C~zN zIS)(JwGZBl!hpD)tL) zuh=B#zx|SAlK6#SLVdoc;%K=++0a&VZ}&rl8q2S8dPCd$UlXpttoSQs?}eD+)l|5v zWbZeTpLF$nvRUhvnd&!mWoqF8V+)US_qST_>h~zhy7Ij{+V^`G?fbd~5J_^+ZH+el z#l*vqYsoe{_shqi3KPjgWHY`MW*h)E<7iFw9+jJM{E(aRq=thrl;w;y?bo@mUjVTELTjq`gxr4Nhrad;V;I7I z0e9ew?bl#@4Pd|Q2$N_NuyID4V!s%#k1x?J+Al|ci1>1svtJm>DE7;VVvP2SIU31+ zF;m0YuiuhD2C`prLt?+uGpT+@c%{~FsykGVmImxMj~dRTI-{fQI-_X2qIXoELHfP` zMojOSXo8D0*M1WHkng1!`I{}E>T+!!eOMrf_vC?oZj-|PY#?&xgAut7`-~e&mWR_m z<@xDpigz1jK4jpta&8shNoxh}+q@v*R}SoB^}X@!&u;sgLwY9F@2#Mtbp%t>c>&Fn zTJj847ZW6EP6s3kNIp@W`LRE(>+MFA?7AKr{nquCO}v(#7xtBxmhgaqG?8&eOL!w~ zmNtae)Jquors!k1lQ}S?V?KAh?mF3zzI5Vg#6RAp)XRcAa_k63ip{ZncIx8mX4dfnV@^qcg>W{#%CFTbP;SpvX;Il>D)9?vO0%GKb>1T z@hW--_Fay88C{?FI#w-SOuuYliZ0N~=3ZD>?!laEJMapN4x9hoD;`!WgGSisa~^P zUKQb?$SG$m=MCfq=_+n+(^Vz2@#!j%E`qMEo?qLzQw!&|ES>a7)4m>a8;qFVo6rOoX-xad#(6%{JBOg^V_MJ+lRl1VK|i1KA*KZ)AJYPn zR{;2`IHqls`S`Q}B)m4*$Lf1KC#IdTvW<14UYi4RJy0>NAW@Uwcq9sF=ea*;bzkzY zvqZ`IS2W;XO|?!yXtcXryIz2UCQoRHbAi=5Lo_017~B-U8o}OHJ5rFh_o5Nq%cep+ zu`?EX(p9FO`yFULaTSclwwP)qSj*N z2Bj99kMZ%B&{xB=dhCoA2#c<2qr}5RLBUe?JZO`{*EF2*w2=@89Y0X@ zM8_Lyj}Pmp;}0w9coe7I0wo6{ruQi{!9}X?A6y)L2UV}{pxdPHpx>tNK;-ouh+6c$ zQRd^*caZQJUV$Iq8>havZOV(kC3_cQA<=hJACv=geNl0mAW=#ZkSL&y)4W|cob19O zM9JC(H2T?vWfSXZ(%#?Ng@bbzgZ^>o#kN3)ULays5sk1TJuhl+$D%d>yr_-V zRPUR_ShD9HKje$rajuQ=#d3qBcb&;gymBQJ0d#-l^qa;AftBWiD@9eT3b z4cItWyG;e!>E24F;@7^>Ev|h#ZiZOG?TZwC0_f}$@qb!U&IgN2)oH-h4 zVVs$Y7slH@ftY*)@o17s=HHJg0gugr%Cm&C8p_{56gt|F*Fq-(3LOO;;M|7eaxP7M z*8(tjGmZv$eWd>x6~_~<;<(ir6~crXLSRAzD`128!%|_PCVMx!D8%|Fs9v8~|KT0| z%)^U*CW`fc1fK&&Oz$={!A0tKzDqwW!af5~^|3zaHpTj&pZkeWlLaCl>jP0stluc} z@x}Te;iLNs{P^C^iS_SJEM&Ie#2gr=zvRX$))yptn%9Cv0ZFHus}6C^;iNVe{2IQh zImiu~T%k^O55gPt>SWauy=thFZR@C4+lqSCo7jgG2*gcqDVm_1>e8k{ZT z=@RI-=@JlmT>_#OU22r`_;d**y!KS!$M?pmOU*MjefRgC#6qG=L2XKNR&LO9cJ=&B z^I{|FU^w50zj<@7oF1o;Her)G{3&#mV#D)s)KOB~n)Ki0HMQVWECsJ=Dj-uy6LO|A zTwRRM!8?^M2>Nwe=(!AP3qjHh3b3&E_pyWzf9`x`d3WKwj{0|AS^w5T>A;-ntw$4_ zQ7Q$}r1){}F-;fbJ`K6YTZpeA-)S%vsCzvGebP)B zz1%_e2!F|$|L1q~N#~b+(qV8!V8rx}LK9q=-d)iI3z=WqNWbKM346L9!R!sUClefa zzXTq92VA&L8moer+=qm3QUa-W96;(jKU%pUrhEXgkl2Bs@+Ezf8}$5dOS=+%J9AKaa)YKfy}mhwwfp5Z(lfU)Y=|u-Tzw!h zphg&KOndJg;?=#~{o!^~;YJmj7IMD_(G@}GAFO(Pa=%A()bmG__53twG>Dtteb5Bu zRG&_4)a{Y>wt=cwXVCTPoWz8npX+m|qX3atVIUF}COqlhwnjORPisNKYi0$0d~ck3 z+TCBDMJyzGYU+pNz%aE7{#uYIT?$APZ~%Y(2W>2r?1$W-$rW_zp@cW+(%GulN0%<> zs7n`=b?Iy<5Qv-J!_frgRF}?N99;rcuS=lYq)VXRrb|HNbqR=Cbg5C! zAKx3NE_JV?oI@-mx)ju=G-u@oJ!c1~qioIT73wGtqpK7fo{w@JMQ|#Xw6g*-<*f2L z%DHqw(65Jwo~xs5BS>0D0jzHw<&hor?~!Hwy97!H=1gxpn&6D;C?K81s}~gYaO64) zsCzvGeb7r;MsL1 zqdE%c2A;W&G8oSeZF?Q1ac-$Pij_@LM*(cSbrf(Sl@n7zF4B`a3e)s;6m*Mq6vx}H zTt^9FM;!%&Wd(1pqu>r-IN@7-w^T=g5Jst^I3bR)j=~&`R7YW^hOMKVMh*~iFYM^AE-d@23Qh{dP48J~f^r%!_UMOlU1g-)3sk+I0^O!~5%hCE z5^^sf^3DT@TnFPwbFW4@k1t*X2_GR=;K%pI885a>ZCkSlXGlJZSjcqz(K)bnZVM7M zjZG~`6mS3?zo?Ccl8(y_np`3Gx|r|=UAjc|M3)-&fj_FFE4Q>Q(nV z>{4PO(W{_BrTHs2Wb^kFSFf9Y6m1>7jL_Qs-DvQ8c$W(Z4F)|{Kxnk@0>?YJ%O-YP zGBI(k-3R^{x+CG+<_5go%fAQ$@^l$96z%-BSMyeJl~m|m&)_NcZ6N#ZkPBDY%AxR-1hJt z^BV*LNzj{mJLWeD1f!i*BsUOeG>KB1b{e%LL>AG*e za%T^q+av6TUxWUdYXjdi0L<`rV|RcY-?tXvwNf3vBK$CmA7*(Y-|RYc)&=Z)qQ9rY zJ_o=YV}D{mvL4{|4#{5V>=lsgjsD&W$vyz=!$__SNcIJIUx#ErboL8K_D6qzh2#JL z4qzlt3P|Pwo|kdA5?XvR0>i?|2;6r&`rR7=tjE#20&cHA|DxX&uqx!0Nxv(=*TyekLY1U) z!ZSp+`m><`uU415R%wiU4GwIi1gGAn z!aNl&O@#>;Uu`PPpA?4a5W{$cYy(V%Ss_^Y7k-7rRG1d>OPC&tW%%awEUTx|O(BkW zn(Fn5BOcu`j(BwcIO0_Z9>9p{y$(%qk;V}(TbwuoRDB!)x=nEe=(oiYK;+{HAZm#t z8f8AdI07Vm_PU|Os9M@{`lCEzo1U}V=MH!tru z7dmR%2Rac@=qMn?^?Nmr2=T?MX)J6rtDH++FSeT5b!&M|xZ;q372CxL-p{)*Ah=8Y z^4J0)Daz^PFXuJW+f6M@t09{T)MJBVDjxQ)O5gziYkrwoW~awa0CfL}-rhJeE#jwk<=usLfo{23t6wk#o8ajAq) zRv-jomc>#^R$QjRCd?%n!uPC8F#_iz3l4@g|nz(`!G;E}j&As~@-0Z5)7khr9Qk+@XB zBXJo*K(Y}j!$zJGF9=8u1o%Lgr`!ddyM#RDAoLGXdCI{69Lz{w7?2zS@F5P#q39eM zkZeMKlR|PB0EaP>s{@k50Y2Oz*^JKSfaD1Dk5EXC1mH+Ua!o*T6u?J0BuArjbU<

yVZaFBd`^4d_-j#F2W_R@v6cqWJnptz|mo6*IptySL6Do1Vcprq{*v}L=vM76bp z*4f&qt=L4+U5d7B=$5LsR+Bs98MPH7hqhB_%a&_OwY4MIS;MHUSS_?&hPG^qmZ`R+ z%Nxt;%bawq?0$OKQ5YyuRGotKRk<;_>pn!*T25&5qP+XVH9H=zWJ_ zDp&72BfrbMq|3M((Xr8+M%)EI5s2hr+54< zr6L(^erV7gTtjalw3@{2N5l|y8wjVl@^p-D8tC{rX3@!r-{$rsV$?cxs~Fv?7#%&- zrFDL^S#&Z92;Bs4Z^S@$=vFhj)iJu&Ku4ywff%IRS(z7vZj#YqY&&#o7~Pr}-5Q`H zbJ|#uMJH2*&@E+3l=5%zKtXn(htbN~8!Xu$RLDZiIf##(*< z73-tDoKx6eIf|XCqjleEncvGPLn>)CR$nH2IcY=cSZKA}@8y({le8MIFPFWX%dwZ! z)2dS|8X&X-R0c@WYNB38EBugG?pv*(Rx}Q%m5hU=)nt7ITH%L$b>FH%t>|%6D|y^W ztHt#OTH%M>a^GqtwW6m=t>mdDt(MeRq7{C~S+{#ssj=Rpy1(C}DpPj*kAF{_Qpp#P zDYyL_DAFEPnKIiyk0O~b8S>jdgrW^)_ME@{Z7BLMWBWBIE^(@L`%9^4_qXCb+9N1t z=e7B-(*@z!NCT7C=5ZlQ?3*137hRUv`5nrF{GLZ4j^Jd1blRE(YLYP|i2vFVIT4fzB*?6*Lo-CaZFHoANal{};A=-Kh;3oTec?t> zBkM!owQ(yDZiPK?18&`0*$p6Rt)zdEic|Z1O>4g#aM}W+1qRx5!_6b$>Kt%Q4!AZ4 zT$cmxp8-mzB|+y>W$URPiN>z2Y@m`~Td}Yi50my}Yr}QX>yi4+$0z)1h4Y_qwV93WXZqIs5 z#P>bBt3uHV{i9gpa2u12*g~W|q#RctF zUQ@Yw81FuOhRoB+oSWTh1)z0sc))wb&{(76=DoE$e%d?3>6ik@@zld44P7<`D7c4A zlH6D+$r|tbK89%F&$RAl(P~+?jw}NM`)>c})~&+(djb;8ut%bR9e1S1?}r@Ki3Pu& zqxP`62AUk@{p0frwh>nLZE(@Wk--{M@8=Z&ArE?7M0z?%Ec=M@Nh(TuaoNABqP z#socSeO`gor8i1CEv50k{B<-I-~-C&Wj(pKeKhq%G4Gyxw{IJx*>#&IS9chKOmi#I zyd|Z13^f)eWd62~jhJve9DHz?HwRffdO84&C^0KGpdqFf{2Z*~B6j^aRp(%#2Ig@v ztem?@&Xc%1)pC2S>3)avB-Zx0zP7f!zSevLCGOiGMI@3nve(e9{QEq8?dJ!vuzfm1 zlV)YIju7_qqp{7jvdofmu$0W^nL5n8sRN`7u`haRW^0ED0()m@-T5wa4$bi-hS;=; z*I;)pJ1g6;5tTQyKBOW$+dctETKAxTF##frbI&qRsUAO%e)l_>_d~QU|0o)>_%j8V z1IAz)O#xc*Gz*lKi7+ikSpntUhv;3K6A4{!^Ko5|^Ko5fKE4z45v0oV@rH$&k04e# zA3?Lzd_?08^HIrcaPtvJ7h*oH-FP{Tr4Cb)^BVN-ZSBE6uOW7FpShbSktq6}lP3d7 zYdig0nv?g+0Z*~OD1mYB9PmCl;C*wz`{jW5&jC-(07VhmOpSH8A3*iA{?M`TTj?3% z{}2lg*Y2Qa&;CyVp{BY7GD>xclbBK)rsX6S0iDEDG-_H-ViC|uECM=-ML;L92WCDX$(K=-`aednO%!ifAh=qzGr&}RlvN%v%Z0T&&IPZ06k>M>?e3h0EMC5 zU!mGtA0oGgcHc^+$*JM#3yxYl+IlQinBCvhCO3_?PN(as;n{U4jnM4}kG3A8ZttY) z5xKkNDBNE@yy}AK3+Sr(DVleSw=5%^fJ_Ywz!DtW{Z*p){ju@cPZCex+sr&D+56_s7Ph{pe=Il4w7*PTIfUN@b}1XkyU}x52d;X`^pu zYPb!?&D2O6{S!SkRC^H7dnlc0*1VN?n*8cVX@3n^IYmyMI7+-Cm*z+VSyCI`kN^-g?T-;_srLK4j4|nsh4I zTs4G4W#kMa#9>p*C;+ZJcALc4Q0maAp;#nxZ#TU;;@t3}M4vHr{+_gOy z#TWSE6H)xKFFpyyRgZ9$pN!%;zIYyr@ASo8DE^l(J_W_?k92L%NAab;cmaxE_r<58 zxc*VD^3zb<<%>^8@qNB{A&S5E#oZ|0Z-;C93>07Ci+_gVcYN_86c2i|tK3BK>ArX| ziXZmHXQH_1F|P8nP<)UtUV`GQeeu~S{*y002gSo4>)JjS#ilP7D1O2hTPTk0bd}pw zbYrkVSLK(YP~hL<;zjiB zlcl8c%^joPAWPGHGojo4+hLs27Aj0hg}<+?uuLj^v$6slVIuLZsKVxFnITK&65?a` zv4_+~53JQL+dg|6)$4NiQr{MR*nK;(TzqN>KIrV%(fa-r1u|fS>@Gu)_kJNs?L2zk zO}Mj@qfPH*j}~wyhuU!G-E$!1O(k_Z(>i?#G7ORnj@QfA*QG+G4xqi#|#I=iU7siTB1RX05;eQVX%Krq)FVR1|?S7oh z{H?<0WUWc~@r+CXZLswMi~oZWpLkkDcvwYvE=71`MR+>w^2q~XH_=|=F*SbyUcQL# zZ7{`)34-63*x#4h-ia*xo8+#@uCdxS=CkI=|WjkdWF zA-{^sAhO5)z5>4&d1Sav$Z(gC@lC4yN?Uoa{e6}Fz1sf%x&3{${e6x7eJy@TrtqQe zOTYN@q=1x20Vk0HO7IPo;2S8xH&B|Xu{Kbesqr?WB$lqBGWzj4`+KeZeLa3(<%ysg z5kV~?f=VF5m98b(y;E+#OK!j0-hL1Nj8{)cLpQ2WKyeqHlg@*O8fFS`Bk+A{>p?DYiMeI5NXdePQH0R>JC zeE>s2K|`OwP|(xRu_J&1^c7Ticro#C0gdeywLA9vEDdP$O!Af&Egsw2Tu~cihIW(9 zo!tFyVuj@bFgQ|Rum&(#Qef}~FnCg6Fb6Q0Qec)2cp9#qPCU^Wdi9GQL9W!gt0-by zgafl!yf6PWG5My^RU!~uqOGbRW=m^C;I_0@I&Mp|zo5>zu}8*@{}krkzr*ZdVRH*E zpQF$_0D2MC0RIZG`J$m`LY{}4>CNWPa5eN6{5$(wJpSV>NJ^LoBxL?uR^x6iTf{#{ zpF(Abm&*7#`Y0-+t5n9%(Faf&tWX(0N7tzgPN>6B++BHjZR2$VL1eY6yT=Q?Gg>J@U(Lp_Z!nrMUQa zzDPrO(Pdwbi(m0YMs+I{XEz*J8=c*Ve-6MuGxQI}+i2}qME9vQ2bwRUPce|iIG^mn zQ2VL$?}|lt?Dx0y)K)Coh{Qqrql9P0qM7CGkMYG&`{VR$_MAVn{0#bU^%=asbIJI0 z^Ua6WMwd>kSX7|J%<|oDr80_Wx51atT1p5&51lX+ffj!Sl(=}myZ8WI%q}5zT@XqX zw|#A5<{W7|T3kS^PV9aY(O9*US!h2EkmB48Smoy11t8O|l59B@`!-tpd8Yp}5AH<( zR119|vDIpQ_5Gj;GgKe`^O@ym;>TW|KC}FBvs0?ywA8unn}h53-%!7wmOS@AVZW)% z@>mDaBaGv_LVuRh;~GqVhWVVlr_=MH$Ig1-h{YFu1Htv%NZmYlXm%Nqnp{!a_!4@I z?N8A#Tu~b#rNTO8MNPEKuv0-pqcfAU>!`(IGdecgpo=ADY+b2bI(2Z-1_dM4hAF1 zuYMeseOhHX^fPBUY9(26{CjecAIq0&OQC#~xk33dm8qSXz9CZz*~-*xwr|L~CFgTt zB;R>0e(y03mm}c4ih^pVf7*(Z(E=35bNW}GFfW}yMwq2>Nl%^cA zpm&aUzo=TqRZk(mqmds52f~^0rQFClxQ6=Rjsou2&J1jf>N^*!QxomVhX&#Vy3-(Y&M?NPk=G!o+914$IS$#RAd?US>W2(%#e%@My#T-dNqeom) zZ6DafXV5V)iVO;5AhP696sW||?hDFIReUZNRiF=HrVu#><-IoW$6o~1G}dKl;Lvnc zEF7k}XY{y!^jJybjW*i4l36(z?9)m-~P-pW@rzif8i)OY&P6MtlUz8DexRDK&Lzddd4Sn$@hXzfv~TFNqj?*^7#r`(h*_0$=bpQ8F-Q32+y(P4 z3vR0rk*7W*Um}*gCORNCzy!%D@E3=H(-@UDKj{ep6KUfG^= znO@Zo2;S{wIvVQo4b=6q&}AfQF;f!V1WK9TUd@O;I`RedCDn|t9$!1<%sgE9F{BN? zPh4N%3p2fQM;xf$5WhM>t)bt|5A@*&Q1~jCZI#hF=au0hz@eO-ds%R20*d`yphrAE z8cEizo!Amil)8&l3>1nVG^kamHD48~(Ds2cVv6PVT9t7)ufdB85cgWS2;cF4TkdjR z1_A#kbKF=As2@N2v?tn#!p2*1kHVU?$~m+Xw!IXePWyN*Hf z1LKUEmpW}#`ThvxH-Q28gODHn_ZtE1o^y>2@%<>)Xez~liSTb@r7hc#JU2&L0X|Zj z=j=HP=gqk+=u)2Jd*z^+`Z)W)Txzq3$9mwgw)6*a9w*LJMhoqQbLP#NAF}#Q!0KUX zkC_zveP5o9!E2KALm@ASvT&ZrHOI!ob3-24blw+gx1rZv7_$6Dz%uOjxiB63b#j9} z3>2z!JCJBnx-hWcQBSRM;UMf9VSvvhT*aV=I(1Ejs*VjPUMOI$2h#M$j>NiB`hgs%4OhE3q#y*;LDY5#RNf7y$SOem`zC z?gx>_n6PvtN9hF12)*}5LRnAJ{MmB!^*T%Mk= z90yy&l1;>pfu4O|FV(eeDxC+TlUoYRBdIRG7Z&9j%?dhOSSRO<%#o>Ff!X*;qDxH40(b^i76-BXL+Z z{ToBj2q;J58a#%+iG})Q_9$F{=chwRmsAh5P9WzR{AAHOfo$dRfd2i`i++K*1Kx7aa@g;}l%Y2P*W2{F;V41(*mye#yG!b=Zr08-b~Pcz72NQ!3cBdW%R09^N6H z#YN2u)>Ga05gdz2bZS3_K8QlMXq-tgR|!nAxwY@(APCnuWib=q8&J;A`i;8OJ@ezG zE{na1pe70B(1-0gWzTDU<8R;>+`f|78C33G8uR!j_B6pV|_Zuzb?vBY#YG3Yol$+tz zm%9}&k$bgxq0^}%J9a+3{`YYGuI->xv=@>35vT!`#&0%1OKHxD^P1Q#j6J}V_SAMOqu_FX9fUQZ#x zegQ$H{;?dSi1OG#^H>m2$VrQ!FL9uYuSh+I3G`UQy*Sq3taUr~?}}J^DcU_X3_Xg2 zvl{*I{-vDbteHAGUBj-9zlGTtg>2jN5CwxUyD^AReFQ%8Iqd2Q??pH=;cm}!6MeuT z0QweZ0eSHIhmhwa%JZVi^L|fA8p-n^K-*15i9CM~qtf0-;q!Qx&z&|8cxT6= zyG`wH#8$kIL&}Qx4|)CopBe9y@Hy+P2%oWy{m&?n^*%+Qxi~>LcUq=?IBI0nv|b#H zI08>zt&jBU;IqCT)G;Bj1@2Ft%(CxT!y0<7M+kG3#!&7HlRUS=-U(5SH(~gAFTOSl z+_1rst`!gI5Z@J3suf^E@MNj=M$; z>}_Btk+$03*hT6%?@^|pjwuc5cvsf(JANH+3GprEnW^n5HA*tS=+dTlMw^ameJds~ zbNv^RI7gy9ehGI#2{B@&yNDM}#$10!oty&QWRAgVEshH~7b2w`FF58d0Jvs_z59$S zL57vOv+$M6*AIsA3Vlacrr=!K?Wd?;PNU{Plkiok7|anV;Tr?~O3l$I;hW;r9JUg^ zJ*1vb-tPg%9&h6?=%ckWYvxpSx{YX_X)fj5c3?B!Vxip*KE8~{E=zHb<8KBS<8k!OKqmsV zCy>2I^CU8q(H!?PP-fr_KhVX%U;V%k1~^$DSvLcmM|4?TI^LHd`aA@fkp^Vs?Q!m* zrZK)d>z@dxd4iM@Cbh4o2q@9!t{*&OeS@1I+emb8<=}>BsJrk2>L1=t12CXVz}e*QEI%8EU^?Y zeHMspw+~ohsawOBD62b@<9b=jjn6}@`gZt`{&sUndTQk7Zor@xBMkR|PPEEH z@!@e~9{`6C;1E9m4kHkZ^<{FuCGP1!H0ua9;;eIlIE%ot-|W4#oOESOzKu z<*BhJqneu1xSxP*e77xb9I;GL|0ggkYme{B)o|Ll*xou-zWym9Cx8g9vN-X{<(*x* z6&1`3M#_@g^GHQa)!Pt@ZIQ#f@-+*O9j&=_rE6)#N<~lX1`Wjxz_lU&DwBaQ!_?F( z^2y?P;+YUAzoN23C=mJ||7{FhI}fuP99hmx973(_L9OkBH9l^Y)oi53Xu7S&_nFpf zn|f$lCu{)EC$}y7FnFHO_EOFY`=t#K|1Ig4I8z>+=yysRWYqp|#VFIgO@^KFcsm{& zN77bzpsix2I|9l0J<|Uk#qa1;FQc*6%2=$gN+gI!lW3#xsH_A5kBP$)1l&g$-(&eb zJ4{6wtOZ5v8a~yyI2B<~35p!^P!UewuIUrYH^;r}Ko6&j9@aus5z`NU72zectaj@J zqWN5H%~WcjXy>NAfMzOV!dB^I#b7nkEs^}j$MgGx=0_Cyt<@^OWID-jW$6yZMNr^1 zh;34S*9%a3g!NQ&6@uL^es;ZKkxX+6k!nbXTfYq^*|H zwGzHdxyn-b%X&MWtD_okv)MASjYIEv#!Q2ue7ytlCcBbV`wG~>%PsF2J9KUI7M-9# z2qzoyiE$?st?S(*QwMq}dm(~YdnLDOeF$i=$Xh!OECxFjP1lD4ozU-m9UX!$VzYiX zWc~6SwGyvYI~GMxI|tx2bZrMZwlCqs7tL;F0lnl?hk(bKqL&)7pV(z#vEd|S-FTnH zCD!;Vg8Xp^%I6K@!_sHlornO=N%9Ns*m6m3*UOOATN{tdJ4?AbUNR`wwnl4So}zsP zcihaLo$6${IgUIY__sqlo!Hi&UffU4b^HJjNK#K>2stfs*a=2M# z-3@UJWLypxNyG0I>%I8k&kDP=bE02IL3F~vYgnc}jUIEUu!CUipH71uXF-m1{qIP6 z%!}-QY?mcY*SjSX91}eoLbunRfn@a_VECm0RYNXcsSg7%A>XLrtDEzb+KI?ftzr4J z3C``PJypeoZcHMnPchwzxLT8K18e>AjZx^SNGJ+x8wH{82Yq$?0$I!RL8%FCcADRS~RcpGeIOUxEz>97eA=du)|D8o#(8HnA+%>&%C3EX$op#r5xERrSy->(6g2 z#o>5cM_-tkM0D{FP<`HHA&^7Ni&qjG9Bt-aH{04dkjeQc3JkY1Lbg+Iyf?QjUvJZ7ZKK=(=V!&Sh1Z8vNIB`35qpKZIS3LC3Of=SBv1L_}Y4PTyMfm2EtQT|jDyqFc9FOgI3ugGV@i;59w00hn=d1pAuYSv@LzGIF zRUCBP z?@Jx+ZN|siAVy8z7V2fsD5?zp~yY{KC@Trt+QjX3DqiZI18$1Gx;>nd!`S+O_k@81K!H zUqAbk^D&P-pLOGGhZ3c07lFXrgUOw_5wNEK^$7T!0H6Gf>%12ui8fo#eJg$AE-ts% zdtpT0UP9INNP-H#Um;W-N;O-k&JpJ17oFF@&sImj1E_mzJfpZg)l*74TO0r@kQZUd zr#2j=YtPqjL+ZZ5<{ZrDWgQ7?-}gS9I=U-ezlrT|$AXd+r)^P?WhjmWWs#?M+S>4| z6Z5Zbr2srJq z&2`zLj2T#lOOa8LHrE3%ZIchP{GrEQ}Ft zcbB?~<&yIVa*gW7+X*>$6`kjR;)s(Jc1MNU4ve6k0hM#*VtpiJz?rK0C>rcRL@_1h ze7>C5<+!6TFS499k=9q;!6354c{x9sK!dxS3O$slC5|jzyOPM^LPsCww=JRjyr6V) zX6nNGl&nC;B;{orQ5 zas^2KKk_T0N7JteVEPpSOus@P=2xitmH8E^mdLNvMUDR@YLvd6YFxxxn(;k=>RfE~ zK~W8M=Xjd(Xf*wN9jm*=MVMx_4bJN-_zot(k0IV&>?(+R!3k5zU3^PHeM_+>#S!09 zaKyLxkoXpyuoT}C9M6P{Sp)e^{kjDw7&@E4u?VXs$Fhu;8FMUG5ovNPLf7P21dTZs zNlnL+c0AfOH8_Z_p8>yN9D-Q5otWP_2|kDa^gDT~1#`9@JYxZ)oVL1B+S%o7c}Wx_ zL5}&xA%2F$YcAEaC6!RL7xD1XV9vgZ-=NmHdT%R!+$-sqQM~Y+0Gju3j|*6d6+fT6yzU;&MWmwjKO2DkknSVIkgGyQZazvqgW+Cqj;Af-qZW#1s)7rHI zt6xEJ6&*3H*RF>{1?k@~hZF+okWrpYYAJYLC_L4c;apOYnlMLd8=P$)!*8S=hq@X* z?eJWsz9ycu$X0DFJWt3~4J_?ry#|(1ERWqF8MF7>i;!2_;0Rmz$Z$scV07uGlv;Ki zut+V1oSCq$w-3ucQ_Btk4?^jy(n){oHFkC}d*CM6cacY9Jdzht zqBb3!JOw-#3{HN=fGC7pJ>N$t9~+Qt{+$TYkqE|h(w*x#ge7Y{(59{oF&DD2$>@N*ITAi}D5LJr4vZ8$!U9~FnF7Yyd z2x%{78*^j^xfRws@a~06XIUJ;4|i~=R1{+3nc&rx@RwSxc<jM6PHRu^nb;VpGhd>`l6g{O!K`gtHlQpUuejTjni2yb>sANs5_7!mOC=L=cZ%r&} zq!3|gwNBT;Smkoa;Fs68-QK`c;b@Ef;5rz>q0&LE zjpLhyrE&Pw+B!}pEUiP}EXJPN5^jV5a2-V16r?R=p|@o%+Jey%uq5eFe_8smQd$VhSj2%HY$YMNxw=X6jA(h;2}TX@}CbM7rX}4@YK8-o)~W zN1^d{%z<_;a&GO7yU@{e6!H$mRn?2zqTE0!t)S|OC^k?EtF$t5q0}l~uHgSNvSd5; zyik#WM^an667pUJd9@)G^$W{qV@_o=JOk_^f0J|miQFvr%oy6Z7sYDFb&YD!9S7s2 zm?%Vfbzn{=P4L@H6}HTRvjzw)_pD}Ktg?d7jhz8hug!z{#rk*Zd!k=vWau~9Pp|;0 z7`i==C4p7500zpEq@_2CIALEQs+0~(#n&{_5?BtP6yM;)a)c^|jGR|ga6aK`$m;t) z{eo^MOUchh3hf$Mx}39(pywpe1%jR%LlYW52_&j2VXU=gEv%A|3>!vcgI7qWRR7JUJu zO)18U$@r4G7cx3D9i)CgmU=0ok6jo`-*E_yD@cD)Ecb%%eEq%yN1vR&82NYO(&U_J zvFM8#{YQ>z#Fu0FQj9hD`EJb?2RXiqb8fb?9nxwKV>|oeIkaZlNH+Cn)X+6z&#cDC z3Y*3~G#a%x8C=kMV9zuf1Euu*Caq*qu%Z%2|I- z&<(v@CvAgCMBO?k@U3(Y_@%+_q{)^BY*k&*nlN`c+xZV4Isi z(ysd;n?jk*hQz)R7dEySZ}&|O2Ha=PqwQP?&XHZ@ojaxKuOey;!ygv(dkOTnf?l2A z@RFd{5WOrgsl4;Ppw|)&U3cE;IFu%O9np;g7n*m5&81}5C-{yO+8c<529|dw3wmRM zb{j#zPc-ai^3JY;-b7R;p>)`JX98Y}vD_aJH6%MsXm3vN)mC#0(XhGX9ZzU)P0*ev z=xqt~YC&%&YUFkkEZTDKAZo~ar_kO>)X42ALGMb?o-~Xc?oObu2<;DvhHXFZWDld( z|0{ux6!b?4R6Wc+L=Ab@7210fwA%^#W1vR&n|BTq_`W3U3VeTp$C-luB!ONn=mSIz zP5e^OpC-_c1br}pu6a1i{BQ!@UeKQrHT1KuppPWboy1NaO`yjK?PCe_JVAe+K(7__ z7YX#ofk8!(mzo( z;`OC}GUgAQr_=2k9SHp|P`X`3W%f@03zTlxK37t0-R1DSGt3KV=` z4~&^M(S#^PY4I6|7{oPj=iwVy|J2suk`ul4Km}asyp@3r)`$b8^Hx;KM=uVP&RbFG zr0KQt4wT+oQ5h1@jRU3k zHfZU_fzo>$DBUAekY%F#R}SdT)aV-8fKsZv&+p2TJd)sAz(294NiFfzpiwrS~>ax^bZN-UdoH z4wT+oQPB_GI8b_T1Em`WO7Cr;bmKtjy$zIZ94NiFfzpiwrS~>ax^bZN-UdoH4wT;8 zK__oKP+5dA5x3@ zf6rXg&RaJJ<|1-0SM=eKmIim2_kzMb@qND+6+IxlNm&@br06pt3%aoDkgQ_*)rR9(|s3KzZ*C_;$eR`k|T z?}EOgXkSPxig;Ji4MS8K&U=dP8Asm->d!&9hTU+_My9XWxuWq{E^Q_ndD&t-xRHlw zIC4Q}F0?e6Cv_K1mN6X~5AKX1aX418owmuTqZf~dg+%ir+o45SE)B`djTVJVb%@I5 zoU)}sSuX7;8rkA1bD^ajnVHd`ESGj<($aMBb|}$sR0&TkD6PvZ8x0CCk0$uipzxk( z0;NIW;u@minA>(}P`JP*K}&q;lR#-ucrle|IOl^N1f>~8 z>x8yLd&1>5M8lb@?a-cZuT27_J>mWvqK0;8PnJtFipJ5lLwmwSH*qv{Nx|w5$B;Y1 zC&l&zkCdbz#FNTtR?Gd6Xt))nN6Rhu??fY!c!oKh+Dg2g_&ah`?cAFHTr zGLSV;Ijk-xB&5-hHO2lp7D;%9Je}(E<@NVpZ09Q???(w49#0Q;q$N(eo{8=LF@Mta zBOj*H+$A4@gM6l1?#CdjKgvwgIFGWxFN?ttuQoKEM7&4JfhlQ63MmUhi1}q0Q*q8g zPH8;?v;#UlJxr`Q@a2A{PuCw~RzbB$IUn%L8U7{!kCgPl!%r+cg^W z8xr+TMomscsgbW>l#xLF!lwyTe{}$7zG96>e|4ZOf$FagSaDSCf#>u12i>zIhVEG; zpe%`^^zXG@A+pDEA&Mn2qVNuG(POy~mGJ*863|5V$RYuaeyu?I6&49-^kW5rvPeLq z-zpH4MGEUD_(3*jyD2#EpJtTqWvz$unZ9~s#9J;2Of~N%XohIGeQWpMflNssl~Xta zCB35ivEWST=l7FDerh6Fa*mp#Zz49))+Ul;RBIE-Gpfl%3JFwAq)628uWBNt1ga*| z9!F6g`izy^2+IUjw6YNv3{kCYgat!X!bVsopa~mcnSds2gk=Jnuo0FCXu?KVre+(N zek9%x>134J$o`2sn~iwO?ErzPJGC4pGqvvs?T`fR>4FX=YSm$5N>L4zG6SWk21=QMQd9$_%>5%8U%`sS@%~rXQ|SH;y44h3h7b06wQIya zukL&IB7LNH*_w!U%Xu(E_iinBI0*gCAGtS#N1{gQ5*xQoMjb^sj_^RbNX$5M{$j~1|G z#*+cTc34o(nQQQXpmPd1>w+9!lSV>c0ea)^2L9q4E|GASiU=er<6ZnUm`7B6+)J#P z;G`0F9Rprd@3oyfkPvHlGDy}j%pXx-H_EzQ{9H`ao+~R*EkUf2HJKKP1(ca6Ce3=T z!@?zB9#w!tiMOKW{L`BL(agqQFv8&O7uGWqD_E=x!C8Zb-LVPP5}5U-1HBqi zqhsbkFEOMe3D87;BKd_PNDr$bw6>j<$RM5UI+P)Fw`x0yK8++Rkpc6ee#F+_gDx;1 zN~bPIo$=2XS!O-!B;^;S)#aQuW<(z%tw$~cvsayp{4+uJ#KtIZI5Hpcz*!5seN_`k} zU2@d6C*v%#hE~bZK*<^?IU4PhtRsmjFYku>LDa8fkyj*}L>a=q6${uR*<_-jWZ@WK zeVbxWVPs^4P8n#t9l}+JFM?dm#gLZSHA~Cv(!xhbrJLbq6Z6x=GFxHBVWC*2rnYl+ zngULxfT8rZbGM-D#!;Chk>1c66GA%D8z>Wo*}{IOAspE+-(29IX^CqYwxy<9#ej>` zd@)@z7}$NK3B+oH1Y)(4V65{gbZKyIUI!pu(pssflOf;DsC&O}P?N=&ZkilSTMwzC z2Ay-39!*1DpJ>=cq=~xFDi!T~# zHL7dE-;i=T6=~Mn>NqMU9N1~qshS;?q^dZ-f%q*Jd>Bjj#P39fo9)8ylWpf&6vuLB zfI6yZ?4t_0Q5=JsDF#sHZlDw+ZZmwh;}-a)upeF3*kfxXH}x=WD(!kpqM@tO^KzIqZAEw) z&t>Uh?(raw_fv-=?^}^Kp3%4fxCu`D6u3S<3-IT@v5 zmMB%Cbu&w#%t>iw{Ld_bCj0}l42y@>yFJ3%dNuD1=BWJh69#^DP5M>RPJdD&MXwS$ zm{hVc0E9!9UQ`lZm`J!mQ^Lr#j_@l3RVc$$hdolZva6YNNe5XW? zYKc1&jVw`eOxP0>Hro>uV&%_ytRIsi2BI!t7leExN<%NtK`#C!`hY=J2T7-2E0NL+ z0|S#9mdJmngJ8nXZW@wmtTVsyFHD1UG!1?yOhfd)1jV5p=%N|s7k>vwT>AiWL(`6R z4AI>ZsP4(^o^+~A=|3LA8QYr(bct8_t z=M;}gnN$h>>$Yh89L|SYvNYBuEO$0|`HLZZ!S^~SO*?!!d(I1-l?M0y?oG);ACILq zUL76A&WXv5Sl%EV#?DQ~@*?Rlc78IJ_eqDb^J1}l6N25PETJh4-u{>+%bUFYIvmK; zN4$sP+z!2%@8rRMwQ=s&La87F2hp^2l6YTFmmB-IEJIb{P&?m=GLMyaG&Vs!=%Mz+ zh1b*=kEtha&1P{4CvMGVISD7O-lpmZCobxyzP0$!h#pxFwXv^%Xk82>FgtX6`yfqy znph3{JuAg|F#r652OZDG^jRbx81EZj5HmfD!Ef@w)`R5;64P1mJ6&IoSp@mEUd#_- z)t5K5g}cGqa`y$d$l`2i3yjgWATutKFsp5(RIKwRzx0&w+K;@9b%ehNx*&lT7BS!b z6X--i4@jVM1wAlKhX zQW+@43$+HrI2hsjR-!@~i*fA7zqBJ_2DQH;ei-q8NhKeLLq{zZPM6&b6vjK?n;?R*W-mU|f4hK?>+6YwCzL+J0I&3M^F z%(U>St+8 zKfFVQ?=buCKDO3R&@12`2(Yr;g)C+`3e#Z}E;-mOnS_CxoLP>MZ4ZlMd>06@&JQi}GH|MO; z7Q~crfgu7CW5Gs9p^RkmM14dGekfEh%F%MXNh?U&pzSN<3*Z&0PuHMZSWUAQn2_rW zM^d(3*+e+Dd=fJ7&o@0OC#E2Aj?!jyH5pToJ=h}2#b0|6T1kjCp+rI&Q@9MhSCEiH z%T=X%$V@dSOf}Yd9TCYqVh(^}rR%$~bV0*kiH^VZCF-~i`p8mo9#>5CD59Z>s*Xu- zR4Efe$D}tbh6$sLS+|csw`@P*dKB#hH+{tN4ObXpO!-+=D zxn0mjF-AG(S3q@>RGFgLX_<~DVOXZT^QI*KVggmII5DPqXULZWN0txfNDrc1ej7~a zfEhtE&ZFS3x~x-Lm!=UraVsCuOv9|22jgAiKrpj{lej7qJ|8=0;;B`#tzea4v_YM3gN}q zj{vEQF9f#qbLd;|$&ktsS8@m&7f7{6rJJJGfKpkCicL^!q>VR3mIG+qe)RHRRt;{8 z{TjaT-ZaID3o%Vn6(KsacGmZ z36zznv@%I#Z31N_Dk^5o+62lfx2-2Vnm1rt zwGzvFN20^LvrdS<%zJs*K&*;tHt@dmfh*a6`#Q)YHy7-`okBFUwP0i+`(e1OB^GIa zru{c&2a`zb7Bah4@4t!8m~rSPI4_2KPTc{&uII^pF)@dG9ey#~_UF*Sa!*BCZ2O;q zuc*P{;tA;p{Kzw7k?Oi-o?JbSuE(ePR*VWW;q}ef)045gA~twQZYd_V^49izfd1VD zIPr6c$zTZ?gsR6dMzcNPG~g>L97xKonm7o=m%jZ&38cX^IWN;>7wr7|p!{ygxe9a z4r@f4g0wu=31L=+0kbmjx}qppVX-5s7{sg@9aC-*gyc{T2cq3JF1FB7XVgv6cnFJw zj9{7#&WPY{>>^ZhJZfd5mvBG9@?qt|A}ARbZkCIKyp?xD%#@zTn!_YeF2R-dmdAR- zSs%H0O|-(F_`#8@`ecx})QKp@z*tg`9|p!^di*dj%IfjMz$mE44+EnvJbtL5;rLKK zJU*n7%1?Lo%iWnMjqG_(K<&em;-?GsFYq(LcgyiKFSfSaZzHS7yo0gcSwsy3<+&2l z8+`FThRhjc!^>epe{QP1~DH-UREH1a$6 zij);UheQ(0aB&W49QvDJhN}aJbD1tGrQBh5G32^S=W9_1B}F53TDVBb;`3V^fxz`9 zpuqfg@A!$O{p@J?YdJ+7A)NRf`5qA;M$iX{D3GH_i zw2KA3IDuXw=p_mC8bL25YRK?2K`%?tJ}c%o z1MI)~uDX-kq&5=bAH<2V&?E58Nq7%|Zy_933i>%}z(1Yqv(EXW7#{jPSQ6bD=aqL( z6Zkg5p{;`Y0)cN&!q*6VM;y*McLBz+VV(>2bHq7SKgT=cITrjJ?~3y%_&MI4gf+(> z#$o&<0dv&qM#&#yNS&a6kpenh=W!ACznC;qQ_*=^;2$O7`JClH7T%fNUZo)utJDbjd4}~xKq5AB^)QavXEv+!}uH5yY zJJSA1Ts!>|P`V>U^#xEmCcufawRB8C>5oiedM3bhND=3S9$gb)dL)yYz6mg0Qbg_1 zHvy$fGKuM&0MjR#FufCCIwghqCaT_?Ko^Cm=!#(((9t`k#eE39jAOaXK$m1PrgH*J zpJc-HPJro@OqlK|Eo~~|%GbK-lT12#C%|+{3d@j`-YM;{Qlr$EdDmb~5g{o zry@>wVd8XE7_-w|2&_Wn@v9rj9OtBZb8*=$Hu89~sniOoZu=4496IF#VAM(=idIKQegJF@?iu9mjqP zgZ=-4@A3B>v`Y=&!}$pkM8lz+GYkAI_kkF?inntf1fltM&Lfyi^mRtB=gbjyq~hy2 z50P!;lC#cHvFL}B(RzJVkosqgj@*CN`DQHjBaDtZzN~BZL#QIB%}2jsvz&j8Es0gw@C%jzhrbcX+rD!X^i==8EtCqiCFX#N#=SDQo#II zN#-xcQa>3>-TYb-*{w>e$CSIhV#lp$cP}T4;fh~Hp*tA0d1(dl@_!iO(&V5)CoSeY#wI|;~ z`WmJV{#!`2SED)6VC5|#8mfWQQUy=k@k0|8oTjPt+ELRuB_eT}fmSIvtJgmPV#vdK@oNbe z!YvE#`t^%CbDV#?Nv`^jwbxlFH_wUanw~DLS?&v9H#h;;l~=J^&H#Q*^h_v6D%)Qm zCydpy<+gJhWDi;~*Lyw>oYA0$34LzkI)OKjX{LeeaJspr~E0TzQ&O?*HT|(`T<;VJTL-3PQnldbM>B=BF7@WleZk%Vs-_^(O$L4p64gr5@l%_RJ? zz;7kt_XU1C34bc^J4twmRMWdjxKH5slJJ1Q@5kY+GasUWAZh7KHn0SU+XXd705gbOs@3%xA znr-(2w4M9WcCawdW@ES{wjZEuHj(3b(qjVxoHz)~1_YGtMu}yQmkkIg+l``Ea=^$2 z1eEQ@pk)I}J8S|11`cGKz=3Q|2g0@j2Qt3#9XgP_=|Sq}i|-&s!goA5&<^JjrpKBO znn;uhT+c36L64%%WF~A&Y;uE*bHS3s)8I03aaHwmBqME%cvC%Sgvw&-qmo<52)RM! znj0OR%-v~51|%acT9IIN9k;TXax%`=skn4RY^H?SI!$u6Q{rr%CeDURobA)Z*;0wK zftom*Dsi?@6K7i`&L(Q&Y^=oDMopZpl{g!ziL<#9XDc;vwpZe8rY6n?OPuZ0#Mxqr zv!R+en=G6c+l|0dW!6-EEgXV8fJ?noYXLzEOE9}Ge@>rf#S2ot7C z662rspo@}W7hUjgmYV~iStnBk%@Yj|blLqsL>8piEGYf2Jf;N91PaSp8K#UfrakWH z=j*R;+0NiCG{^$8Fa}ezB;z7c!<_aJv_v#AoTm5Z$x&sHnJ`&HGICT@>V~X=l4Dd1 zkE}y^gJ#tFoT^ILPFV~Izbq1V5RFPB??ol@XF}vpdP7zwhC*=Kgrz`JNPdD8(=et?QYWLuUVccR~XcJ1s)00_69Z zi_`WuFx?Z^TUsjXZX0y#zeF?kC%OX`zE`5_G7D+wx(ngfx@JsV*F;+BTJa`bD}$u2)xf$b#%Itq#WwUB{F3YAdo z)-_{Rt?Pt^Q*v7P6Q}}@0blJna?pcN{USAY_-rf1-*w`j-%RAp!5+yrBW*M&)jUsf&5rdz|?y!mrtQ- zUk~A9ZsY~=$y(N*vaC0mWxX+0R{vcs=q8hT1!aDaw$YfzN?wCv>f<<(?W%Yk;%IjW zaCxMJpYDqRc)f67CXOgYYf)I^Ay@1+M&m_xgaCdWB#r7;Uij1Z@uuE|MXrG@^RbmJ zEUi#53|14|>{i@@H6^`IZ0c=cvyigi#QK(YQM(xmN;@wF^7s|eSdThc6ZxSET;GL@ z_28gO)I3<4+WH{v$S3NOi>^8=V`X-8nRQ?|mchARXN!(%Qj@`2WI2o8>;=nZmfTI* z08EV+hGrheHL=j9A7(w@Vb(K?VfRn6CR#oH62k)D0#M$sYI^@p@0nc-nMHkwzJHgv zOO_<2?$W9G&>hEX{+hYvP5?4V;+ad6ag>SgJVP|p#&Xs>tAL?SLqJgjk~EN%gDrT z+(W1*Dz?}R*9qw((vGwYktc7Z#ei^xefKc)?fd}qj<@SsY}ac;25r}T3fuMfk!PY^ z2Q`S}wa~{TF{ql69>dFXcI{pu&%-yUU+hQ? zpODH?pZ}UyWwm*69Ni6`KVw^RcSp`edoXWX>H3DS-~L2id&J}>wJ-NRl$+tzm%9}& zk$bgx1#&+ka_?!#J-vn8pNq*&YG3YsDL2EbFLx_mBKK4SUVXV+@e;ZJ4PNtN za?Oq8+MjYUy!vvr;w5se7Oy~`KNo$@N6taJ+qi{3_le0(YG0oRP;Q1-U+z}CMDEq% z70CSyk$Yc5?oC?AyCi8P~kXhlc|pyj|udT05(UB zX4E~5sxH}qzeo9BLdMTZqaW;+*{%eZX1pIqQA;b{y$Bg~W~b|)X8bYoWsv7r|EWBg z`b;#eNGJ^Srl~ABQ?T4p{Ep@3pftqG`Qpi_U-?Y^=}Kh15wbo>SvPJM-M!f!7Aw-- z+W>7h86~=VCyeUMdhbR7+k20J>Jq#hW_fQ(1V1Z{S;z=ll>oH*eiXGd>wRE^Iy2sf z2(}O$GPB+>QAquovj1ZUWpAX1qB76xq^$hRc<1A@MRNSmMW$N&6Nl!)=Opm?4f#B# zIvC#(CW~~iHbC1=Mu`q;jH)h~$&yYGGJaMXztfUR03}@qV6!yYK@9yfwbw-&E!R1a z=c)fx9xT*F62W-Zuw4q0Go_;OoF{UrsbJ#x%t|Hv3nf(5y{y8r4$gqAPgBb{WB}S4OCnfYcq=4u1Ea z%IEuuP)JnumbOdTa;Bh>pNPcG#l_8`{ZU-gZQQ;x*^hLRnVT zPH_K5A+;uC;vd@d;vb-Mmyb&HC{MM&hQ8+q7@IuDGHl-=?PrImz>ywz257sXnUVCgE?<6 zGnn^gBiLMBeN$@~(-#|GLcXP(duT)y74Zmw%~4Xs&r8%{_{?|<`CMJHFN<`z;QXvK zPGymDt^`n|FGNu+(vfB`>m6kVZLe+ybKcQrFzs zyz|2VXs43)J0XIe`3F(J_HGUXpk0Hs7n;ZbkQ#pX-1aUq;cwZZnT zFyTprZzB9X6CO|adcqf*@PrV)#Dv!-j9>7upY$#@@mhpmX5woR7g?@0;dKb(Vt?Da z(uDg%_$m_~44GVR!V^PynF)^t>@78s$s`o@U1P%V_rChBHQ{v$4cRijBQw@fs;wxW;Px|k%%TA235}DdAjdZwSa(zP$o9fI> z%#HmN0t{Gvb;D9o&ZuayLMO|XHEcFx8go{fM2kYRfBpUcVVV0D{4W)BGdiNhUw|#t z-c>gw^?fnQ{(JhNM|E6wYcx=b{Lt+(luAa4AG(84)g?W2w6_TvKP!#jf*tw}37~(z zGm2W8tryd<phQP*4+f{ZyfSZO&jVb!{iBLn#@3F5Uxr%2xaS7 za%yyf_6Ra%zyC;ta!9V%rFq)ZkEJ3#+lais1J!}#Te|K+-yvdZ#c zME&oSr|~yfHby7+MU@vB-%kKGM~U%0z^Lky5j4L0g^Zt-#y{9la;^kmd_Rq%mi8U& zJz@mMo)4Sw9yJhH=Yt3uHWUmyMCZ5u@7qxJ$(YWyi3AoUKaUz~5tUW8fwLk1i?kWc zrnz3Tc{Id|RK6v^<|tA5R*drJJ-blvTL8e&eZ1}RDc6{)16&D&>myq;sye5X^H)Tk zG}Ie*m9o!tJ>+|d@@=T{ZG)6PaU|b%0BtuJCGyQ;lrP`zly6%Al~Sg@1=eXg2G;IM z*S5q{yX`U}*MMa7sS;S4_b?L>K|!_^$R<9qyt6C4qOwO@YNUVfOSG663a)!|vs3Gx zmgS&FQTFq+ zPw0kHn(AN}K-*15iR=|dac;K(rSCxq2C{+e@+sFq$*6G&$QnphIB7VWTdKWQFKNYM zurTt|7KMV0t68oUX1QKwxv=m-+aHcRn#wg&q)A3exkfRH<(k2AjX+4t#iv{Y-7?E1 z0V&sL;iTcPTw_T4FUyrqorUuKnX+Q#kFriix+YoIl^l{$A}g99s)tcoZyKMgOSYlZ zQv~N{rSXYMECJZkdQlW7ZtEksGQI0vudh%(SODeQIHHd1dsE?(JIF;?571R&E)fGvffozj=RN*UTzh7BU(NQUXcJQ*c2%wUx7D`rs;_#EGt@hR8n zRAD3#`m&7}^)GzcR1OUL3N;&x=UnH^${kCuLDp)qGcz$`kJ-OS65FSsEoW0>P#)5Z z2x&UAgIT+8Xo8q!zXG(cgSI!MZIrNNj!yK}XeJVA;dX${QKE%A7*$=e9arFQ6Ec2Q z8ogYB&$$v#5*vm?#Y>o=0guR4P zVi+7r=?7r7DrOK?F@q4qyoJY15@LpKT>SPWkn;`7*`@97#mJ>b+Wez<-DH%=`6r2b z37-}3&SSM5amN}Rt<{f*`Lg6iBt3-b#d={yV2c9T(}b6cX)_^fz2KKrub z=%D3g2$u$C+b*ASjm4^9350Dr&s0i)ZnR*8;0Q}*Fk9P(rd}j3!wFp8qLOsIz9cR{ zY^#BCzR7ZKp>5!ysJ%qx{24&oO-4yMACahs@tN@+3!f|AqkKMLW`@3ggF>h~Zg_?U zL!Uw0evA39qk4WVGOj59zW}sdMrFOfhR3ec#EaTw?>(vjjpt z|BX?G+FFeRPtFdGat^>btZW^J$MjC};hKMKyS3GyW>ROOEN`PMJsq7H_g+jS2b~`O z$vNdt9A?F-P8-LooTa7^g z9fkS`eC2cX3y`$pmtXcqx97fQA0qpmB@iSKaF9G>RRCp4v5-oeuUE@-7ePd+?n2Nltk)!GrffX(@SCV-;8Vcal?}w8iEU zOleWxQG8u*r6op@+G_YnjY{=QNsY)Oh+VwYh__Os^trvQXKb51Q|Ir1@;%Xcrm-hV zMc!$T^-|7a$R^)ekCK@gISTURmbPQwIcyJDeYsrmC{f;Bga};cq%%;l|JktriAR;Q-QDHx zz6I;|;IlAk9ehrnG=<2d(F42TyFO`HxqB>K=EiyChi9$`Pg@_q0|bRnoH+fR4qS`k zHbfC}SSIWbYKLOTG>8NJJg_(8QK9=b=xR@(JxJ^71wm!q6L1822?peC-96==N?-Bf za!-9YVt5S^wmO#}Ig&%dj;~44l9K zw_X_V7~n<%1B(%;;TJA#kNYr0zCr}QD`$J$f+2Dukz0vyKZVFiA;PT`A}0emtcIWZ zu|0015c+BaaR-Ia*O=~h5^>vu$k#)JJ03(%2@&q~5cviX+?H&6+*%>>%@E7(|CplBY*xsLEh1Fv77?RFQ$|DsD=$F>j`^R^lo|kwGree;c52iF&Z>o#Tn+0I z3O6I9_Jb;7gjvbMS0=j2;j^;VO8y^Vt(Dx&+OL^rsar&-LRv%&H!E2*WmNKr{|QZL zC9^mKHRo=0H-R@h{Tt}OYS*Ez ze=Fq*`ri@wEKHh;&&eCVnTFQ`IBCu4=OR5G>yvuR743yxL8KSn{8&DBxg0sj5Z2uh z)-t}kDsP4`k0>hdei2@`z7q&4E808`S(fL^ReedMJk;`Ol}!8d+8A`L9>+a&tY;v3 zMZfSaX(o-Ro#FC=gyo?wDa*w?ZkuS#;t1#o49R^s@486t;S@58E`%_i3o5;C9WYFVbX*?o4JA|>?AHnAUu2iax zol#XD*4?9+?~pTgha+Su5$xkd$c03(OA{d%5y8GlgnX9>R?XvPcEXxH@-aQjZDvdHN1Iu6$exBfWb1d+PiJworemU?7Xa>FIUReAP zeAXuw%DpBaXW}xJpN7Jcoiz&NLpxau%igJRm93*(y zVGM)<#KD1wBeVuYH|XI6rvcG@c{q${KpX>jICpA5^a>u1Qv%X)vB#MNK;-aQnOLT6Q=)w@qSbN1I9@1F4BsJYb!P){5HI+w&Ct}G~nUd zfLAgA=k$BV{TxFn7k~WE)t&mgnUr1I0hKl5G7$JN9J~7s=YWx%+JqzeK#2!8!J^0m zn_yAqAx*F-^w1_)lzLDTEQ&pha4Y}R2QSmz(Uq=xTcZM2$4PZG`KJz-t-rgo+@U&D z_kaN1rFstpqIQq$3~OR2G9-o~8)7IjABG~!VJI@1j=*z4JZWWt)mPRX?WDiPPDWdS z(aEUAL$t_)b+mR~f$CU75|=w`BcQl4We6K_L=DWAL;CIV)c)BP1(v z0V!vlxJ2*hxA}%Dy1`Mfr&K+^=Gl2nz4^R;`5 zoIxMVyYv3Mo2<)u`Mp9&VlR`SXh5DuL0P~cA)U1 zG>gLc>YR?Vylq?K=rmKJiYKhTaU-a$$V(P9$Rr4=Pd9wII^5Y=V!05_X#^ctVC+(7YM=Z zjNV2X!{*nBLkPQ|fL1#5L_ZY7wd#z5xK=$<5Z9_(3gTMzO+j4LK_&D%<7EgB4Nxn( zd_3dV5fUVi`VOTG@TjMV<5BMt$D{F09FO{+I3D#qik~23JHKk_Mr8RbkcPd)V6R^o z6O{4a^5I;llVw?K^9A)g}9wQ{klfGuGn}pLZ{#pIOSq!E6`qRdBCFxKeu_qn>h>D?(Wx zD`(*#yR&B{f@2PxlR)~0HbcD!&Orf{dB6xavKjR)OR4LX^WCG$qcD~0#AjhrmCuvP z1H?F@9i<~$ICxn&&HjEqUdGRv)3(tv;8O?+zE{q&;S-?8_FhW7X>1%CFzj*b`wj3kF9uWh%pQpKqye?1I7F z43huM9Av^ckS`Z2I&~~zcG}y-T_-3L%BAXp!Lg*}ge5GBO3>Yo8$ncO#0 zi;{y_cKk@+7%Ea5H~JlxP? zLn>RQyMARy<*A*;;>a{NX(OswofIb%$ShbBpv2fbTQCC$+EQBRAt>~amW9Ut72QV^ z7pi(lUAHifC=cIu4|-H8Mt_W4Z0o@mpe zb!O2P#;W4Eq0u_t*xpzr0XI8VMiB0Otdf9RA*&?d&dACL?%;w2H%eAXz-fWT1BaU`tqEjrDN$F$;&nAF+J;FGR^o(}Xm=(-Sd9}_qfMKLP$n?FP3{=C|H(R_ ztO8}rVnn6B%@=UQr@czZ!dMpaTi)OhSUcz5Iz1U^t8`7Jo{m&w3W-dw}4+^se3EF8ar|d{A+OV%g;FYjo-ya8bf8I(b%0MjEsK8_J(;jV#du7 zfxk@2<9C`zIj5O);oOvrLG4oU0*K7+Wk3Xd$65n11pS(FDh>MGYh$H#nEzP1-0 zq~^=^v^A_8kl8>Y$;(+E5^hMjH=-xrgX7fY6_vfh0iGx)+hT6$Zi$8zoRi9>b_D&$E!sOYLa*{i9M_{enLY}1 zJ>7-IzFc!E!bF#H+}*&?-1f*8zE!@m?w^pvVK<^ORDF(euXy+L88Xz3Q zc|*VcqF;a2uh;R_czX@xzg;ZNd%(S2V$iFAj?`as+cp;QGHJJpLH_`xdnbFv@DEA4 zdkp$Jp*>>ID}=U*LGKgVH3oe^Xtx;j5urU}(8qvOlF!BPKa+Ip81y$nvtrO&gs|Lh z==@DW+sB}P0@6J8j^Uq#_-x`?cLjhmj_4aY9}A9tRohFd=&ZasAb{H*nC#;&fpYFl zM*0cMxxS(EWO#j&puQt5+fyGi{ipN-^#0m7%LT0B6j#{$aTP}n$l;Q3IUvWiRsV?G zQRuWWF%sizOlM#8Ao?Psb&u~Z8PiEYlyH!e%z zoY>E6J?8Zj`vO)+SPPS6gwV>|p58g<*yTWVuOu}9)u z{S|1#|3G`>`tAZ*-;MY8W!pYxU$jk+Jf!)xW1S>om;%F&d<;mG9uj9rr?fU{zV3m*Tk_DL%fYvY)M!I0kv(Pd7=?S9n`K!T#*o~G>J8HGGS~{%* zSby|{Xiy8OhuLbw5-yJpB|wX}EP1+`!8=xMTJpVW25$|u5eb)K8>)DpCn`@bpRZbf3b|$Y>GuSXH)4p2G;5=QmrO9hx7?m_!2*h!ab5Vak zVcq$$TATdMSd{fs@7X7cYgtlv9ww`}y2xce-x4ui3*N8Q+GGi!?tCX^VNum12-U&E zeT>iM4P{r4%gD-(cka&H;~HtPAiabj;T-e;NknriTIT%rtoKZAZX*C)gmQHXD0 zj1L1WpN=n%=(zZlR)vp|>*5Rh!JL0_3GIlV?Q^n|+U;r)0i0(0oDroc7!t~rkFm%5 z{Gy{6D#AEKoniUAq7yvsh~@{kn>W97Bx0A2!bOqeuuQsw4yskL2T72{wXf+!2~QFW z_OpG?SKH=i0+F9~a_x!I(a_$U9(U)Hn{2(+Ht7>e#~^%sGmZ=)j`=MPP_3MiK17nv zIhhj13UaMTnV+1prDGv2^SEmBJncbAr8?WwZXxmiCg&=%#VJj_%GU{BM?1K)kAu17OKabe-VuBg!qA%)FnRX$*5W-BeLhE?IX)jX^8=Ow z-h5a$^XZSBMeJrTh8A}TE?~T?8ApqQFki%XLrg z`4D--{JImNgP&))&1e}LWzo%NM!K6I*AuX#yMHtYbdS^SG1@&=yNl`GXO(V7ZNWCM z6t}RHlVTROe!=1tJV(OAw^ekh)gL&rVv$&5F#(7FkF}J zK~W@<5lN`vF4IycX}3bR5=oN{X>yT-FcAq`=!)tA?Ve0Gjzl&hk&8&eM5I%+@TuB8 zO}nSljWb0tM5YuXQ;3-oAt+f+VYt3_&(Ln5-4)tBlkQ7VHW&>`84F4oiAouXg}_J_ zcC?a6P`(mjCUO?t*m5L8iBQ2kTT7jz-E*~j9^E)U6hkaZA!!ORX%T{w^C=AX0_|R? z-HYhPN+<>;l!6ipQHcm4^2HP$huS3`5H1M`;sIe*NDxmYv`gt=bnvWXX&#+a=@2-* zYoTW~6G#S^(n$rE(Lr*Ti<=78z-4=yOmOkmwfOX5uecgCcPVa`oKxJaWT}tAqGqI0 zGg7G;skDqxN-VqJxToXJkQ8m4qwC_`EH}KVN?~Er@<_0B1Tc!mp{4hTr590}_=lDr z3+bYOC>=>@=F*V13JQNg;V+o@ExWXkCW9@U#N)6RXq_IyGKj1 z>{o6EAP%sPgys8+mKY5CxnSrXeYAA0uT63-WIPsr;*6YP6>?IJDsI|{OWW3oOLE<~ z86z%>p-x|L_Ha{LQF8;d^vN%%&$lD9vbu{-FpB@zz^cZLMn~otxlh_PW-92=vPCQ``bDL;Wbx8%bV&8oyxYN)URWZ?sG2vvnKj|*P zt?FVIcrM0&7&SprY=0N@-z*n*nqzK9ulwJdCPr+p`rkI%yR(o6e=1+)vR(NatfE5h z(af-65svgCo|`3-AgQc4K|;eyJqa7h3KDB-|^$#8utB}^Lr-{+nKZH zzl4*I>^1DXo;jO|@t(v`Orn)(o!G;C;!0V^aeG< zX#`fIABoyG!K!>?2kem{ej8H7d29MdS*16SRl6Wz_cRzq37{TD43mtb+E2)ovsQP` zJsrXmJ~b5_E4F1OI~Te)+rX;)1va)3T(jzaR`t_>Nu`B@iz^@Cj#MF;{?I*q@>3a1 z1Z~MMJC~wfjD~%t!al=kA3Q`SHCIyS<7~<=LCx|4OjW>P%gMr+(sn5GF*&>0Y3bYA z%Dl6te?!1%OFEcdmV2jgJ=DL{nzgW){GBzEf6XK2`&u-U($~wO^Gnl9CO_Ucd@$W! zGWj>yj^XWlP;EMrm4ksmcO0;Mpr9V8>oBTr%L5m_PW9-8Z@7!0EzhUqoV`S% zm~hWe+=GF7%#TSWzJ{D&#2nUQg|r-z-@>xJ95QMx>$mY=>JoAapxp(2(^Yj$a7$>iJ9<&6gm z#|04!OF^i%$xaL)xz8aR=vWNHS3p#Nx$xy8UpDe(B40Z4r9xlZFhpx><)xXIHeOnA zN#Z|+e~SbM7rW=0&C}`m@byl%D&t2bmX*$u-l_Wbcp>n#v!0e`m++j-x!d4U+7=hP zG#yt=K!GmX4el(aUm|IosWd)^fP_$j*sz$H`PF)PZDT2jJ}h zUds)j*joz&vhCT#vC{4eP|lDAo9h8X6Wp6H?&g*ur~0%KZ}JO#SdPZC1RtFeBShZ= z5J7|0T=@p@se4tODsyPLKYpcQWsr}{{WkXc8))NxXqL3P-ySd zvG@D2_nFxHT5_P!WDb z9n^6-K}Vl{6AL7jz{5idJc|c8_UQTcPy&_pUqhGdW9JbH48s}(_oJkAzStk=fGrBF zPyQ2t6rPuLHVVJ?oI08+K3|X0`W&RAQK15c&5oz47ek$|S5H>~g*4ERt`Ilo0Rs0^ z2JUm};AXkTxGAl1EZ1D1w<+f$f1p@{D0VFc+rXwPEf+Q|!`S2N1-$V{%(hfL>M*A^ zwh={?sMwX^&?jE2(gm+mx{bMDeYqK!yJ7cKd20G;46_I6UpE=$|SAIgji9dO#3EPj%=M9 zRR&K(2A|CH-cciEKiMA)kF>@0=s6G_zm_Gaei*UT-mK3{_!(SFo1zODycmUTwITHj zBqZI*V6MIshX@AGf`FcJujA8~_D%s1?EfqQZg@Ebk}B#;#D%TdHgA>@(&mhdZ0BG=R^KJ2*Hp|y3!B@`vQR0QGXEPy>tge=ESXOOkEwO2l&dO+&gT=c zRnFk(l;-RW`QE_~a3_K7BY1o-LB-PY%sW4b5u%lxWVdbm?L| zpp-3#W#T|vmKr|}lO~SjMH&aTz#bA~n=>@es^p-es?9j+zngcfG9gZpw#GPwS)VIA zf?ZXR>J45R{>mIO&0E)G?n5TdA&8o1lX(!C$+}FdawwR}2v+4Z_>G4h?hPmLdR>h1 z<3?^e^LbXnh`%mEh1qzrDdA)s+Z2{Oq+*^DHlA#zu;eLSE1Zc5v9MLS>QnP*CH6ud zF}Ex4-P115iYJHFc~(3HqT|=H1x=oUXk0v_su?@Z$_5Mg~8j zg8|FnEqc^55$(yP+m z8fpLU+7YYrv&dHb-e@NVxAXj_*q7?zq}TsSJ6|_VbitS=oc~gq3t%hr`Du6cHI4Z% zrM0j&t+9AiV`!_kq5pRu)hxe3X^lZz?f;#$2KPaFkl48Yd}6R4+a^9IF;^6$dfa4p zU>bT|Im_|ChuhKrzTB?j{Q_h@nO+&q3 zre4Qq-_K_+PvT>cwdG6b?WCXn{D zeAma9qkNhRdpbttM|J1t?UaN?`*D+f7ytVqCKm>Q(>bw8cVjPIJbF4lgX%O#8+mJY zWC8(HdYI3LO)bWBKE5NHlU7rG}b%TyJKpLhYwN*iC#gaq~30pW;K^h)H zYQvJrwmc3WqroFct={(u=^7K#=;_4>Qdrbn;8Sa*{Fsh*K9dY7h9VCk+tClw)i;~ z{};rioQM(doOcO&ji_jQ;4NMjuuMH0Qe3LMw#7RS3ASP%_x-@k`1{NC09@6s zQQt(B1M@%-f^RARzVtt={QJ=V9pyg=ez~=SM-<`Ui11wy(pg_3xmX*HiI1=WcL_^j z3XjJrJpS&G_V>hv^M?96(M}0vZ&1?SlQhl6Gz}&aO(|A0A0zVuGLb93uRIGE^V;*t zfj^qrzq(Urzt5}5`!(PMI;)?jUuX4t`oFDmb1nTk+iU69*}jf`o#W5Z|EZasd>+o5 zgp_2m1NpcLf!h4FNAx&rm{#%;fN*-rzv#yE`$)!w5ut+nv6lLzT8d;y2^CTa%pj$% zChb~uqX~8a*^nj|GwFm0VOt9)wVR?FM%|%rW;2h8_ixzIxZku+8(Y+#^JQz?6ktv196yhvF5rUF-3d8Nt?r`nq z>BdSZ1|^h&5(-g?2&uj$zq4T31I9(S1T*~3vbxUr;#T0tPi9u(rnJUg zA#R2n$6ZgC;BH7)h#Sk9fP0pK8@qcB!o5QkZc1z19&t0=IPQA71b0KaLfmLpfP1!q z`>Hy)cdWuqX^k6GQbq?1H;((?(-q>zVld#|$-sSe9o#!t;ik04jfp3t1BM&NT~C+T zyCGd6ZtPeG+`AaKuc?E3*DBnU*0@h0ZiXAjT~C+bZb(;%dy3%R&A|P+I=JUl;ik04 zeJXJ?+&J!fx&(Jax-({s_W@P7DXnpz zLEH>Cj=P>N!QGIq5H|+Aa9_?t`juQ(EH=h@0WYao5u&xEsh zu@3IJRk$gwajzh5h8xFSPnY0sNLPq^Tfsfgzo-9>b{ct$*kcw|Tr56g@@YiuuNMrHk2>nyS(@Xd!F9JY2C z9GPw@Cp^d^TdZ{j5lhN%LD`m1PCK%GTNY4R3K#4;vO!2zAFqBweksEiWozbGVF>E1!gegkDzi66Avo7^uD0i-HBU}zh=Ju-v(yhzEr ze2cmm@9x(%u`V;KWxrPCh!XZYbIM!Q((Bj_D?Sf91S|@@sFe+Z_OeaTUb%JEs#o5>n#x^c?7@ zcJ%D5u{=uzLwA z%vGU4!TqqN#$2dCTpdabsxfJNc87{xL9~PzhW=lmK#g4S8tX9Cu?}jQZGfzOvCx6sUVwJ*)&S9#Wv7%HifA z1^%uy+%lxVNTp$2m4Ny#V(6}dTBTlO+}4k6?9O7BZb!@6-)5@^d1+U)%6*Os6pHG}Ci5p{B(>PIf4bdek4v}+L(vDD1$*lAQFzMj zv@JmM{yqX_J4}-$_rr#1gNQN8o2cw#eqd5tCuEz}!Gb~my4dD%8QmadRLhbwx=~oy z5ivlS%-}K87q0MnOnP43PgR5v|>Loa>T~={o_it8zbx`~CsPIcOSu?m^d_&lH z2kA@kIq!cN)oZ-kOw{s8NxEMFX&P2S>7w{|%-Ef8)Qp2HSE#aEY+_}@`UX-niD@In zuUrGWs3M_N2N|v}Us($Y(`M__dS6JkIXqtlb1|@I9=30V-Ef|=S`?2k+XSu+o6R;s z>g>N|s9}bo%w~n{fyzPs>Zj^VT;U4AEm8JO6WT^CwWS)?uXASF>^2+KFShO=L&8{G zYZ%t8|A0N(|6}%uZ@)%uAT3s78CUnr;Je6{yQqu}pmR<@oDli-t#x8Vu!G|x zKbo&42n;S!?wkK6@a!aQMbxvF_u&z;*J6Lsh^5|>dE|Y6b7hxRSYUcL8n5MbB`RBC zeW9Df!onQhUpI$b`FL+Gwp(mY+rbH=kUeh`-l}rAEwSO#>elA`59WL4|C4;5;O(dK z?PAVJPVGH?3@m`9{bSNTeHqzv+RnJoK|pqzmR0e#M40?mIvE@rS*$htX%_1>GS2#z zN=!%lg-wR@-cP%wzHNg2ezmdV=jEm#I({un>RT^a#nnr=b#qC?crAGELESpXm%!RV z3d^zN+Air_1e+P8w&bXZ>2aTYa^{M@lyqW(i6%D{^clhKVL?BF-P1%*vn_2@iJggZ zepr+0r=$zIlVWr=%I(7}&Fvnp*~9G8-KZypbazj8r|Q*oPi;$HA7&&SY>uRi8Xa{I zY0I-<%U%CXTec-zvpY4T^6}x*g@5Ls43oiYs1=VI2R7+SknXqia;=o1|HN}yMiX&51 z9GM}DL+bXh|Ih0-wmtFF8^u-jGb=0W zD$nfL?cc1c|6cV$RtDLo#x%()({wji*+%YjZb~3;B9VoJj3ZeG-P%pHw{`<|vShE} zIkeNH9%&zUkMIAuecV%;qgs}XI&FEN?u!R%c{|JJ@LR!s8a)iUc7J4xpPJP8HeSdNKS~*W%e# zEmg02{r}${*!-ped(@K}Y>$iaERStFgguf8bU)SpR`Kw%>dRJtLvWVbOXjARCYQ`j zmG(nT>*f7~wF&YYbU$q#R^(fwN?COe)sS%yZHc;5eGfsiy?HjVNtlK$uO;!N5PQW} zI*72OjDLhUd$0}JtyS8sIkM6>9u|}Lh&@4c{92Z3w}iDju4uO+KiVz&i>nXhzSDaM zo!5eQ2$Dg6PXgF!df%9}7Vj7PnZZ=BzZrCb1I%DLIM57cf`bqoTyz}YDn)it+bYM_ z7-X2aGz{Bmjpm0b>wwa0D2d_hpl61yOuFxgyO?cmVJp9&6({K??($X^H+ z&|h3VkM^1;bY2TyMcGRNv=HDxuMVbyBg~)^EHZ=X;7Bu=363&@+2Cjd2OI2S%cwnr z>@z>K&oi*kUbN4t%09=$%3}L0mIP~AVxJ|#Iu=*FV$xq+eHin8oX~kKco(U>O8|S6 zpAfT9b51luu**_2mF}e|Kcb>jyti<8SI}S9; zdrx-CJ@Z(5q%O|;6CgT%ElcwLq_7^xRXrD;isKv4;r%cwDxb@GF2Y3VLg^@`zXOL# z2NN!jC90!!)<)BW8!bs%=a^4-zBD>2y*-mrdY9IhvwI8~v?FRS)O~1^`;|=|lsw6J z`!^)JiV)e;6-zuMtgqv$M;;!H2zKzT$gk!g1mBDZDDdw_fkNojj^nBVwROi?903# z!)>~;i`57%I0u5he9H89XPkTRoWbegIQp-ab1yg&Y3fs`T;8!zl*5XZfN48cuosHzmMbY-v7XARrd{C96{T&IVN=$+zK({Oe$uhyij{w zYz5<#_cJh!?{M@eNi9rfpnn5HR3#j0`YPBsF2_-WCz?8KJi1lb-j}1In&fYeZBf(i zeGqTSxcwO2;pXPD;*Bqy=ir~8({IK9R4%Yl31$XfM;Z9oMF5`)O4D#VOyz!lnSob9 zZq51|fl;2W!SN$?*54Q;_kJW(#;1E`Mv;o8#d3F>l;c3@TQpdzZ!fJ;jC~G_of&wI zI3`f{^BW>oIWzDhP`J*4n7B=_V}2QvK4s;o_LJymu6emIGfbZ0rS3_}J(DXcqW}NWw$1*yE(=ZVcC{ zd=>qKv{Ve)O;t9qcQ+!-9gnMe{+|Nf`&0K{)qVRW?-H2_68uEC(h@55ou%IK;HWrN&#!ai|&K) zSWdFEgzc^Lk!ocMH8T8G@?+@1QE_>%OWwuKn1LPnlfhP5W`B14o)teIc9!?DT9)K- z7qV>k>j1LaqGFh;3#=8(%vRW5`8KOti_A&H^B^c75x$I zTcqtqacph^1>Z)v|3RD?iJb}-MMr!(h1CO0a3=^3E-h6z7bW((R~^+jSv?#|Cy1p~ zS^fZaz)^a6YzlrdZb9s6kE^=?^=*Rpt1OGxdmm1al8>pp>U3huICWWKnRLXmgG?MZ zerl@pv`Tqt-3527Zuu;qkk}N^El$iTPv?|&tMW2#mOv(>jMBg<)Aeyv?mZW$Ex80xs2&qm45;$PB20o6ED&jq@1rMVZ0%8AzH(y-*=MkoD|=! z_eIlElN)tt65hf00WW;~;r>wPUtpc~5c%()G6)#Q{>x+PlHD|(2L1EB#nRMS0fD6T zlaC3by<5WeZUXX;Ie3x59rq6y=}!x|p5b^Cipty&d7mEx23Jh>sY(@C_y4l?Fg-N* zY=ii1aDH9;aSq+I@1c4bIgLM`Ov87R`W&(1w9CNuzArbO|M%uPciM*_I)hkpr~Ok{ z|G+gBd>r|)^fU6?!AI~{`Y+{1DJ6N)W~J0$dh~=r!}zj|msL3(@~Yyhra}5qmb&T0 z9#-OL;AR{0f6-vz;1Rp>5HJn0FmKJui{Qw%MWvI&@=7LX*F%VJgqmAYj9VhMVlrVi z=#r+YhNXJFqlMLpYatjD`IBk{VgnM2tDnQZo7nf-n}8(NrGrr-#%p1%9gKx*;0-@6 zaBc<m%rNzV_F9=&X7!hNVZu?Ix4{#=k`dBE#a`RR_;$E|XYAgEcMOGXaH zMXau1qgZX+V57+8{o!f2htZ~(OTj+CTR7)Xcl+OlHzaTla^*u$DsJfN6LNTP~_5q*7Or-1Zsf-aSdm|i6J8jF3&BN^KNVaY`B6JBi36E_yMRjG6Re79$zXLH(9^}v zk14t=F92n*QTdHQ-hYr^_LNZ4T9igq?q`C4c`goYvw;!nTK9QEqbE=}QmuVDy|K)GfO%t17aHfgrU4`%xq&K3~ zJ09;P90RfgCXi2B0aY4ijC<~tr@kIdYmx~}&FO4^TR!=*a{^y(%4k1Zvu+n0EI5)r zbUdSJEU4=@Y6)SJn-RnqVKQK1sdE2ij_@!TcG;5A8d?T-LZLd;!>3P39zBsZ)Muq2x@aW1J~dq zMl+6Xp;^=ZCwMUVY4o@xNgYlhe602-;n!X}_F{OYDn?VxvSP0Tuh&In?+_XLMLEvP zPMj#%wr0^`K6Z=^XVh5D-dX5Gw50vR(4eXF5;johC1kSx(Vz)Z+10S>3Dvm%n9DTQ`t#vLfkVu|JZe6insaClWhR~y#LV|cP>(VR59utEbhc$WOQLkJsXQuC z+CLR4{L^sJ)kngoOCsW39((=Rdqz!!APjqxi00QipH_lvp&-pKx8kcEJvL{xP+0fz(ueJ-vt#_RG!OY;a1{wEoa~=+%^8c zc(Z(rOCakwDVs@P&Pl?HWyAJr;5`iRwq*RvMb~v}(fVLP7^ut;H)= zaWp5QV$hL#@=0%3md4*%8l&ZCIes}RR5rK_hs)vCQ_9X@-i+;H!Rf4=q(t;w^f=EQ zPPn;G*V~GW-_b;ThxrDu zo=mI*zvEtO=9BS2jJr&`4t&Qy6T6%_{z_cE_mOFHg>KqSqgigrs7cA?S?Yus9Mo3% z7R{8!K6{M4F56j|#3Ny{qm&|bDpXd^hp94RWrNF`mStoUb{Ua12fwiJ_ADq9raK)2 zdB{U5F&h|9kvzQ5Jb3%zRl7OuZz}J>mqR}2gEu6s0YUYy%X}HO(kX8%bp zNF^SCzEeftZ$)2P>1z{xr%>N8(WeNfk}%vLoJK;2K{y=*l^=Q89AU7QQ+A|5@Ifej zhmY92K|KT17lU?#5-?%`gqjR+-_QkCB5_(=|J40GfyaXBs>t=5Q+l0&moOmKYE_Pf z!DaX`>u&;$ehHTrt0-gkQ-8s(i|Wd7Rp*qc&cKt1hWikGqa4LsaZ!x`$NEERizw+- zN^XgjaOLNeerMnnDoI)RYR7W&Sr)MpJ$6}ao_cH?b0@@{`2y?X!1ov#`w#jo0-t7R z2?MmQDC$TT&3YR0Y1XCQBd~Btp;<#ei>;VXyZBb>aN|(D#CZ#=a#3g`t4s1!xeJ8+ z5cPEGy?|*|UX0>|A3$g!v$jvYfca78<&xJa1*@{lu-Q9oaqS3eH8RU%T(T@Y5#F(LWkjLIIU6WdkCR=#%i#`toshkdo*Q@Jaj>Tkm;(Jw&UI}~RY@BvnG0DeMvcGqr+ zw>A#HW2dFRu^hIxeD0i7UKknta(0^0ubQ3q|AOa#W-Y$v{~eyvL1@4`@X`K51mp(H z`hSBr>;F}*|G*Uw(tTK_AEQh)XzD;G>pni?Y>a!XhRdHdEamUVwunQp4D8PUhhG^u zfC27p!N7qG$fFy9gBXzR0RjgzAS>Jvn9G2yahI8?G86~$JdmZLQq>`p;hq-^9Lj)f zd@&BE@pAVHfMh#<2k`mQj{lzRxZ__4Nyonk*Fldld5=W>jy|qnf5+T`-b-oA-oB~Qtf{We(!PA7QCfLIgzaKhKMLxE&gMO7c(xi zB~xtF{t{bC#&BlbQMdsHJ%V-4CZYMquFW-hQ`Q(dZ*~IvO(X&-lRixEK$*B$KGVNp z&HSSu1QiP zV_{Ob)_n>N=RoNNWFa7$70+#D*VPD2I|C1%A-NU*3Y;)78*S>e z+fa!x2Y}@yqk!tghRde^I(i4G+O<+XA_l$-Nwb0h1owyiR`xx_fsDJ88Seh&~Q z0Aq8A@ep7vZ(ap3j8+AO2JucOIDn75O`XZ@?bk(PC6iX-`6IaZXYyCnrTY!86+Z0rH50 ztS4_|Xd4t2ODdmHwV_2>I`52^3XBhQtjD@Khw*3*^b{WXNY7)Ni8_NB>02M3ka=uY z;>N_J=R^O}rta0MUx1^zte#1hmf6-`c%3bNj;;O+m1QN`20aYPDcQ+^e$|woi{#2p zy*T)1qoX!uEedO zpQ>sUcYT6ydGUZFGOfmOpG~yAnHU+4<6=Xi#93mS=t(Kh&j0*++g-f_F>KzPP6bPl zi8Ma99Z%N|j-!(d7Q<;|6>jaCQd^cNo-KLc4vFPWqyFH>crR{@sw&k#Z&*E8jMu3XQO>p5~=iK}-! zaSR6z-Bo20=&D|cv4L!Y^B~U?Ox#hgd`yJtW}TmBn4jlxN&C;z`@`7#QtW*(_P!i@ zpO3vS!0TZKmE(5MBIB%L>96!mu!?r+Z;I3zk~$+&S4irLNMl3NSWTK>VY#6w>xC~S z_C&;c&eX)oR?kWpLD9ETftZCC%9zD~!NM>?6pI@%7%a?Yk68#9EZj{o3ju?L zZ#^*!0fW_JvJfy>Gffr(25Y6sLcm}lFL7E3m@La=Syim0$x2qSGA1ii#Tst1hF7tA zOjb`7Yo^JXS;bmuvQ}2Ha9+Gr1{7ri?U z*S6hFcycw+iF`G8s6~j=B7>KcwC62nN zIp$r+=LORCi#6nPFGqN$eSjon?g+-alir=%?nqQH)IMSf z2qmnE#DIcfek>#P1WQ0DATWCYbLX}8;5`~IN3!0*mh}!8RNo36 z46~NVG^MRUtizM$Z>q@?h})PHxn-usluWRF9B_i|;y^l>9tX0)j5uIsW2Q-#%xr5? zSkA#LlX5dDJAh);z&!T9;zT#qOqNk~|IXTo+Q8>R4(3Kz67Me6RaRF+bos04VXYL4 zVyJ0I6AorY7F4V@C!ncxARW+>Dv%UQDSt{#sD+YZH62Ka)pQ^e&{is7i%m2mE9TIF zTtNFdQVH6cr4|_Z)6T8ZrNTu?ijG$R~QOeuUE0KJUV8*TE%+JWZ~#I zL*bhYJ*6Lp<4_}JhnJgY$=VU`El31R-4af~J3R*UKULa(UKRR9Rp^%tZKE@ibbnRF z{BZ_B-6>1`&)+pY8pZL-FLuH-lR(?%AaxxMETp2uHe|&I*D)Jt9U7$%daY9 z(T-u#4Bgwc`(^EZMZ0%s_fGBJrQN%=dkV`9;SmQ8P|LqGFtcM7=x-iFz%} ze4}0qwV!&ewsb(fR$DfpJ_{S-h5GMBnE1Y`-TSnAzjhzc?$@;Ypmx7bm$-JU#YK(4 zMTNjceZ)n5#6^9?MSa9YeZ(XBfa4no6VF51{ib%mrQL69_hGs(MaEz>B+6Jwl#!Sy zBQa4%VxkfW%D;m!6M00t-_`D;+I>vBkJF74VKgMdSV)ACm($pkdcT` zA|a9I5GKMOYWI1%l?V&jP)0742@}FEXyF&N`;vBF*6u6XeU)yEjM1Qsv7n5Rh>Vel zjFE^;A|a925H_qLL6Bc38Sam?`-XPk)b3k!?~5`(aimFUq)B0>Nnxfb!cg{OgsJpx zx^X#?jL1R-cfFSSiFV)7?oa7n5hY16#G(|Eq!5!7At?D7h2z4OAjt2M4EKMu`*XT+ zIgkyVuhhYPZWV4yYux7$H^YtNuBS_IH>4}Xy;^XeXW)Ld4({`-a8p|2K9{%| zZX9<#U4pwIT_JAF$He_~fr0zAI=C;a!cA$7`#j=ixN+R|bP4W;bcMJt6WkXWxL>b> z`{F9xl-9WMt#EX}aO1e^=@Q%x=?ZaQF1Rl-aQ~-(hjDhIECvuN2&C4BT(k!F@#)Zc1z17ZW$bjpMGTOK>-&s~Y!}pMm?TD%_Md zaWmXF?s~dn+@GZ@#C?_6`)ULCkL%d`nkw9s*0?XBy%}yCcRgK#yCGd6ZdFe{XW*_^ zPd;CTo6@Ge8EzbRJzcTAKTB7L`)aZGwFd6D>)3m36>dsv+^cABh8xFSPnY0sNLPsa z8o_;?fqQ)&+}Bs(rnJV5>4KvJh8xFSPnY0sNEgo!+S5jd5I=p~4m+6I%RZa-vKyqm z>{)0pAJ*E-=b!fSk)pk9rL~t0pZ2mX(O%x3+RGZRy{tsq%W~0PW;OcEbA!--0_z61 zh_{4JdvK$8-y!u2G4&?#{*=^pG4*Eg{*2Tw((6;Dd^5wRn>#V??qPS{ockw?EomMH z`71k(k@Hc$F9O&x#QjJ{VkI&Kdd|lR259&J1-^)$xjw`t7C21_{BTHtg-YPrAq89| z@cfVh14`h9Aq7rR0xu3JaGVl&X-I)3O5o)o1r{lRSB4ZgKnc7$q`+Jy@Y;|9hbn>B zhZJ}ZpR`dHKN?bCzS8i`Vsy&ckyYa>*~24PX9tzfJA zWrmi@uU?44>kz+tBYeb)q+NbKlXqlUeD2DbEC&BGwQXEqTT$%_omL9vd&FMITLI4NlZL<`X;tJCG1tVDWBS?Xm_G?*!#}QT%S35{YekaJlKd8DybEZ2IZ5xL5MPa?c zz{)3Cgq49>tbbHkOK}=8)?NWo%Mz@8!rBy9J3#&BDllA~pdZ)&4b~fn!petjE!Hly z2bizFZJb7ob$bC(%Mz^9g|!{7b}%FIJHbr&8^OxDb|UK9O%YaaxE_)o=E zYIER6;ZzVr{$y|l{Dy6!HkAF=M}g-S;yG0Cct^nr4wA^c>S!^vd39L=Z9ZAvVk$UT zq>D=U|y`JZkk_Yn%`4->xyOLG{=atT9%}_fv`s7imkjNe=_KX zzn(#vPtLo#m1(}I((H+4<1{xCWwk6x6OT`rdP7|8V0`3H1{1_T4%bw$39dt>&+@#D z>Hk9ZLGrgmO&C-ux0WhX%aZh`3TrD|?O<9QcaUvAMmk?&Iyb8QmTu#ANy8*EuY;1z z*JVkP?PPg(P{DAK;uT9?if9FcQ6?o1idtqn!X&p+uwYU;N$D~vqev;56n+g+$~sJP z2L(G#$_P?Mf-;oN{{&myPFp;tZ1DqTWkXTH>mXZfRF|cSpDgcrDi|kHyrL#V{$ZA~ zOP@)J?J~h6i(N`4MeI^GDPosRO^O(x*QAI6HUXuM0oW#f4*CBw^Pf{~Vmq6(8KQyL zLHXaIE=%%1n=G$L1v5p8S3B5|{^Dwn&EYJe^IGu6sHRW?*m-;>5Qo6{AuxW07?-H_ z=aBdwito$A7HX!&8nJ+s;_5eu=}_VFTJTOq0%)EkfCC}qE1arlN5oQO zI8g;$RLw|J{ZZ94o3w@1v{a11=ORq3c30+S;r>U zP&Tpr!8Wn{`uXqr)cn8uf1Us8QZx34Gi!rEHtRxRNmVs4q|5>zJyeEyZ*s4|J6P{u zk+#Y2k8hE<-ft$iR4q&D{pJzN4kpoGT)mhzexlHMEqFhLYSefMphGexX5pTkY=nxz z76{d=no>9ae}%R1X;{_!*PXQMS!&e@3O0Zfv>=i}8%r7={RXX@G z^4PM3Lo%`eOJx|#7XOaz_pP+|7Aw~ZjyI`sqgN8sTEqPd>_i`oRS|pgD^hu!UY~{i zi!curGr;k9^l!(-`v=wBL^aa>Y>RkbjpI#D4y0HJc=sBEb=(^x&*`=P1UPX-dC5{d zEDw7_={XDqc%SIu?1^dI8Yx;Lb{-Hkw_Ca-vG(mKR1E(ZTvR!R6ps}4fZIdLaiGXD zwt(HehM2s6;d`ZDJPI3l_XR@KnnYZk>;hOuzwg)mVlxlw43B*6zno7 z$3}uu>B2Nz3bKD0X*`*fVJ78xQlz?tu@;lUKB$%PK4yuXD<#HxOi6hkzh7*9EhMI4 zbw_OLuVFa5+4~hLCiXRW7mZ&>s(``5lk=&(v$nN8`SHlRcspUC;IF_`8Jj^Yp!_6S8s#UI_&PH1faHfW6Q=Wex>q%2L$nUEhHJz?Usuj zIB?2|_Z|(Rq8R*)`v=g|els+8qzfIHzUBFJ9?L{o?zif49}Z^l5ytyzgFFNO(t(i- zG->O!BcSZ{v1WIW{fQ2Yh}a2bL8?XW-v@v^+AnVUlTV}d^07Tj#{Hw!-r9meJR!tQkuCn;}_$3NEUw zcSmHb_o!j%%=43^|7YYlt^y<(N>By<0zRt1U*Vt%)bKOz-#}0Mn%r zwcs{=w+O1q5DNHW$EvU;1GWxKML?B4-`L3BDxxGcWf~*!9fjciiG zrm8-iB=zAR0#ZP10YTP>Pcey+fA>Sg9HKsO9+|EWwfb2fqJq#~=04;7ob}=2s`_vw zEXJKixeZ1Je*VJxa2#mo8+6tObZ!z~H|xW5VSV7Bc3hMUrTtk**53&iRUclaa(^9I z{y&km@f~U1hakz2M!|msJ_`O{a8U3ye0*R5J?-xR%^jISN49Sh+<{r%`&oY%5VQWS zxRySF6kF+pgM!K8M$P84`3zd=7qNj2XiIdOJ41LW%cT~zuBtW3yB6ZIT=co~#vMC~ zd*ZnJqGN*{yZE+%?@hbm<0N(y@HvI9yiKOOb-lz{XpyzFcSpd=c)w<$t!AOk!p$4r z!`y=}X_QS^X77XEX3!B#;L}?o16n8kN70WZz)r6^Gv!9mz9G+})qpqc3IwBO{Sp=} z`!aX%MgqVy@uc?8=i_=)2uGB2N!i4ttRiJIld^`CElkQeq)ad=myj~iq+CwQ6q9ll zDC%b2+9Y30!G4o+87Y%Z%9W&SWm0gUTQVq{luJpOWKvd>vbjmQf|M;y%6XtDP$iRm zbwr+Ok}qKVUXyYmDSe>8#w+0W&%!0+z0Z=rQf^oDg;I$*D7%NGtT@ZAJS!@wBUn&r ze+;Ac;38OBpiC%ZLDAlB(feoWy(ZL)y@;Xro1%9O^==mFJ&}5$W?L%WUet(pI=tTB zsO4H}k^PLJ<6ENR%4!|H*0CRT93VQxdtjvFdZoiod>%T!4INSX*ie!A+6SMMTjV2g zYesd6=1P|cJCb1`D_DhxvTi z#5f@N^EsERydiA03-dWg^0_O$yGQw4$9&?w=vIgt%O@lV@@>^*34;73lHuO2-7nLP zS7?xpB?07O6@oA!{1q*Hhj#Cz8%H7=k;p|PVItC9TKI15-a|KzL^dLki%7ymqT6o+LG6B>ZmgPYNRtcI!bGHRXyJ$G z#;Qq%uuviOO>*NEED{9yTRQT$t0R+)$U=qG!_|=`2=aGyGGIKb z)Qm?@uk05v7xxx_m8-F!+wv)8_opk*Ak>$t{1Q$HM-%eYAhKi=Uww4YQwWza@q(_q zu}tqW!PxFtugpaQYpH~w;t_IIQP5N$c zb^czisXt$;;XhQPe;w9GnfBScuR1)urab>p6aT{+JX=-CV^u$IU2i_>x|~Q5@V--b zALj10;D(lC3FJ@$MRqXxEWU+g^)+TZCEae^tG(>AV+B{@JA7tM`w8z*_W|hc&dz*^ zfq~u88N`Njlh9Rm9o()hecc&14G(U4-o|Ms?PBma=N^t&ZU&5uyByyBH`eDeWhbL1 zRw>yE?=3eAnQ7mGa^!^?6g3B`cL|z`fUSpW$j19CaUK$~)yiyL0Vd|-VD%Pe23moz zq`e#OpQXgwD0WRG_B)CROErtD*bt@4+ow)`5Sc1(nHr$$E&$qc$p{SWNAeHQr1V?` z(@bfpjQkvqo+$0i)>1c`;e55eeG@rkB~dYL%w|f3-7M1tpZzm_C&sSpc{^Ep6t>4A zxJ9+G{4vOhjVZJ&Fc%*fv{&t#E@ih6%4J;0jC&r4cCmo1>5pPrpeLVO;y#Q+PkSqC zfZeXVg{#^cRI*W-@%g4@$x<_nF1vAd2{kPGDSIcIZM?i7`Ibz1Qafe>5>K!dz_r_% zU~8J&s8h_ZKNiHS+rt%qm4~2RoqgD;tae|e`C2|#-i4Y~Juokpl*Znl)4MUKr3!%e z?rizLCFN1PR!DwGN#an}RgXm!JSa=p%rJ+|uwc$s95~CRv(=nEiOpL^49|t?aoyS1}6pS;Sm*ry!N^uNhtr#qu0Pk4qk?bVspTgf1~~ zPYJ;wEDIy#fa0|QV?dvEMg~_~uKwSV(SVmK>fb={hA{$t&_DRV4>th6 zb36f~;CummGlTha*pwPoqSOJQ=Cm4~SqlLfo@vRHMu3ieI!D6cY|4&op(EF~7v9fv zYxxdcISG;70=VTV`P2(o@L-jSP+M?|pk2DSI3#$J_o_){pIQD!H`~$~*FME@j+_akgDiw(ApBgEog?&_;cCNF+8&EW0u>mha2V z-)g{r6#26RJQ_`cN8V)Ac{h0_X~`JCH_z0=JuFi?8#mDa)n)$k zjUdxCf=nU`Vt}bN>rDQ(opv#=FW0NHkQ_cdF=Z^a#;46gY}8Y^9A)Ztq7E(BqM1%B zG4spJZRa5AFlKFT>*tV~B!{wNYLrJ+Rku^Qkg3hUrPoe zX+$PHjoUD~r+FKK4HDT5;SH1+<=#vtuBk)m2wrWOG zAyvoniLQ)U^wMG==Y$!Bk$vKg!gyaLpeT%8u!x|X)$w`mQD!P0!U>GwPQ3=M8&3EQgRt7IqcoVRIu;4 zm|olbE!g}?sZT~N>Y5*#l%>pmV`AtoKgfJGF<+`O&AOg^Kgi^R#6$b6a5; zF;WIg6P#=p1`G%$pImc2L&dq;E;`(aFs&2vMpszsh6wTLr^&bR5k*Yo7>SGRiZpXEl$2UvQP^_AsCq`Bt$j}2@xpWwTM9J zDq?_=`36aJf)k0SYRg$Q4Y*zHuD+&G^SgWIs&X$hJL&P5(p|W|+U=|f*Yf|jVFg?4 zyWl0QThYcI8HZWJYGp_>WmG*aC%b!axM61;H=>t#=;2GaJ&kIPCPCNlTTyT-fQD~R zK73WiRn^R*T*Myw5gZ3uu?;RO4ubOV%}oCG)Jvs4B>Q#M*mB#XVr|mg7-6~X5Du$qX7ZEz{m@QeC93L^mD>xszKrGA*JIE*=UC{Y ze!v~T7`Y%Vy2^FvXQH8>@Iyb_D&?2)H9ml!uBmUz!d^F?5@@ZNK)HbXi5_tA?A;3_depZTGK1$20aEbUAw~JJt}k zL4S<0R%s$E)0->y?p!%WWHyN+0g_^Nf_aKC@rJE6M$A!aPS8%UeI9?6b0O%xh}T@0 zdsB#)Tb#7kzi$L4!)aLMfDps;V+6+8>^Rfd! zqIBA+YynW%`M;(bp;rZ>)HDZumW2|O%7|bmf^g~@S?z{C<57#OniPdR4;c(tiK;Z?g{7aL5v5`2L%*}2 zni#nkFz|q(zueS!k&L$mwPVtdj$YYsc48Su#xQm|hniWPBBn}=HOWj24GArav&2Lz zM<%?jsTKD}h?(`MUYxAN={wZhh7mAGqJ>sGgTzbg&<+KxPi9o~pmO=qK=tGXCyrbIXI&ttA{`5Hf zR`v|isce2D2Cz0jv8|j8KpZ$mg}Z1;eyH;(j;aB)f-?keVvtY zH(_vBZD`Jk+iJ*ictY$_ZV?BgEPFz$opXxwc1l7KJ0DZ<&&;8!C3*#1*A!pSSt)k{ zp(*0TjJU-qhlk8f4CZjf)Iyz8riDT!L#R^=DdA2nJZefyD7-0!9qjXmv)=%RKb82D zo$c~?dr*Gu&&Y3=WT&FU=uV@{Z?ED3VVjU39uT%A;c!UMqk{e1&3QZ0 z!54Q2#lWky9Wk~KHHin3({+p)+MP)k<%t6XkVl-elrNxbz+}o;ZLtu3>W06Qerkcg zYhljm{ibC{x17MTqZ^J8i#(`!jIwScRL?CT@ls$6ZfXjQg{6RpZ|2 zGjQ)*g`3hQZiXAjT~Akx`?GX~xSyALvWtPczfL{bwF)<-HSWt;PZ(|-cRgK#yCGd6 z?iU32ZU*j&b#TwA!cA$78>23x1BM&NT~C+bZb(;%`$fUMyMY_W)D5~X_o%{6X^ndg zaWmXF?s~cecSE{D+%F04Jq_IWFfs`DURAg$t#PA=Jvv~xaoqKE3GRk;g}7f9+8W-;cr3zW--5gVeb@lX4$Z6FWV~Z*@M*X&13s@Zp9#|&F2M81JZMFDr=c$g-i73C z0VVEVWm|XQarqf|tI0F=-HLSf?4WjPx`+Z_L?-pNTCu=vC2;YO0<)CBB|{37mB86U z3M7=ks-XmsflJ9liC|Ufh3IzXoI=H4fD^tQcYHK&BANIVp0}?^Jrn#Zk@-&dH%%C^ z^4=}Vt|*7%h;nVxcxB!KIl{b_B`fn53hOXjlfe=67gu*;o@Q{k(0MI*e}U?CXx98FwGBGA?FKpyS3WV7r((kt^dfhYC$a z2ybeVD;Bryjz+F9R%azJ*)H)a^6Y&G7}%HN$T;~phev}rm?b$pMp#GTnhcJO<8r2k z+Rr4!PzMnXIIt@hqU%&zi41UFMJ|Ca%kndiTY3lgsbPc+wf4CnF63T$22X`lLis+VFfPf==2`ZiGL?i*JSlP8H; zJ{xTugkf+p-VKQ1o+7qqJ4@UAh;?BLwTAn>I7hKH-Urd~YguBAKay2ky*F$4A4H7T zf;UU8+m-+}==vaLVcqth5HiXw+ysYs_(|mr;wg@l(z#o<^oomo42nFs7evP=3ujtI z{z7mc{l(QcV(NBqkI;E7cpF0(7LiL}?M6sJe!=~*h(Ub-)WP6bkLDxVE@<1m?b`&~ zoj8@ytd4^1ZV(;6mL;~jM_6~^Y6thmapRgJ-{@=^SKNc?_{s(^$B5!Gc}>9AvLv0? zBi0Hom=1m<;s1xSH-WRceE+|{k{^#*H=f2<1_w~B&^?kqh`|N?= zl1;ef?LxSZp)}f$%kjBuvF`TLI{b~5&XsjX3ox_9r5HR3qi$7`pRd8{pVbA|jB)>0 z0~GnqjE+iYPK7Xn^@6_+g%!g0w{+yb<*I(6leqo&t+$x({`Z`u+#JRNg21S(fJ_&F)b;v5_S;iv$%!9$SN*VxZ! z{x@537g$x?3RK?4ctI;<&A$c~;G!~ay=AQ-ZoYMlD3q3eEkJl%s0{>#-O_1OteNLf zE2KxYU`}wC{x7^6Y>YA;Wu9Jq9r%Pdd(>;nkeRjsnvR5fjxej7^-`>yXO&Bt=?xF% z@u8T~g}8~2qfK1Mx!&rEF;B`@tSs=C!OyIh^S)s{?191_fO;^-qOxmjaQ6*&@vYv3 zRgQ_>acpvy{RNvW-G*7k+rj``n(|mOO6Ox?hry5WhzPz4do?~trQYAZ zUbLSt%Z}y!403<)ALYd(mR6gnygg)j|HksdBLeou_+|+HclcsYdf5e_SC&L|4M+Z4 z(A`riMA{Z#52dLI`z-E7l4lgRgBAb4#qCw$)k~NeF;!wblQl~_5=(1`2TI_2auEM; zcL0_aHp>897ZE)~yQgG%aXiKLJ@k+A;sKay-y5O4P_jS%*}mS4vU5}mGM^b`XJILn zCOdr630-CoH3y!q77l?o=cy^i04wM&jrGBi{9dfl;yd7n#t*xg4#)XNs9t#z(Y$J{9tN4E z49`uQ3;_dq9F#H@s60li{12{7aCXq*4$ub*D*jKCj@Wrp+^T5GJf-NV^ij<71kAHC zz^P92s<*-cE=8?6w9AA&PFUb+}_ zQwl$+7Wwz+*~^FjZT#P^Vx}wO|LuPg5lfmA8!a17ZJ&qm8)zGAlO+)I+slS#LW97m zC&%Hh0E{?3dN(mW<3X5X!g4GAxZt17JAoko1-KjW-**5`IlL9f&g@JTLA)b4fS@x3 zbP!J?ojIb*CkEiw`#sQ|)OOoTG+QXQTey&W6VzqOOG2~=xW|>476JD}3}G)7_QueB zTM1Xg1iOVBAL;_f=s(3{4TP1`)0W5v>GKe`P!XL-Q3U#9&MmtOhEpK`I=K zq3Ie|gEg)N*R=9ZOWAN(EQIZN1cWu=!7E&j_kqrU5iA|9s4>qnZ5|vkzz(5&BrNlZ z@6EViD<@kV_wt}#=fJ>i&F=&o3kWBbC`mMn6^P&F=@zZ{F@%nKBG za2fuIS%EwSDo9ZB6C4T3yW?~}UfvIt_kJos-rj+_gG01-Fa+WxCGbq2b3roy1#nK! zW#t9x{z&g#g;d>v?MA5C)T*U(FQXkSP~)$GT5AbMEdNU=m%K+|v;#bT|L>+PY=iul!P{7v#kVj6+Q5hDqyI^W5*c}Uh$@)KL3^4S zaLbZfer&(6&5AAT9NPzJZ*(0;>5Wh`Q}Xvg zRZ6H#if@NnaKS$)N&#&i@_o6w;Pdx1!)KxL5Q1G6`jqng1Goc};=Dj_rN;WViO)fQ z4C*8Xy#pSn*bIxdWF1e^WlQ!6SQ_Jl#5Pw9VoyV?!VLJ4xrYur^fRy3xgZWV2eJ1K zf;U%F(tPk`7!Rx7ioY3yKbwgm?hMULr5cR*Y>+eoUzky>9{4*{4De|JnPReT6z-)V zQ$+y_td8_#T}RA=z1b0K(HD-OY_S$i=s*gOE4Dz6zoqhJ(KB*T$e6eBa-dc!rWJ~r zMh^g5p_plnagX9mPsv>TW|_6ryf2UyAu|f+6DqGk>`Fu73EV3k^ft?e9qxaZCId_3 z#Zp6QN}(9mSc`5DIB9#4(ln1{DpI%$4kmOL{4nm@aD4qY9bHxZf7Xrv*YuG7@AOPv zYI^^-uJ~WmL;AndGj*xy{X@4{?Y3;?Sh;XR7wa0H3d5=|?FyUnjL{IQQEM6o#och! z!*iF`P@gBD4GC9OM`YIg9WcJQ95pS6@*Q@Y&t5zcE^k`Ou#k8)5JN|#7_KM4MA~Z7 z2xu62uHX^1ni_LlTWNll|LVWca;UD=QaT!(yC?%zM{#$^nd}Uh5;p%oQZmwM+{R3& z&Hqu38q$C9P2e6bVPf^6e+>Vt|Dxv7|9GYC0a|z*0V~j2+!Jds0>>+5RMBNv>sEM` z8P0F3(e`1XK6(=B);jTfxQz>?x(8FE-#V6f4H=WPo+Va;o`j<-9Ms39{yWnDAocf? z9)G1CW0o@fy;5&nDFHute;en(!4LP4$5B@SH@vy0z;pSdav99z@?+ZaB3v%*1tl(j z7^7wQ8;ckB1|k>YnJEjISt$#NWXeKTswO*Clas2+O>`PV2ZyySE|E2cb+G8 zr6(^ng*@+-Qs0$}{?s({0#_)5(Nwpgyi0Piv>ras^$6C8HUA6TXWTmHF#t=QnI#jTG)tWc+Z=dh*s|1_MFm^x%s<3M z`wSksML#8vf@%I9$S44;?~-LH09&qPy#eq)AMFCJ`iaw!-nmWHloTS1gn(a)7{!B3hB( z2evL;`4Fru?h6a>_#a$Z6d_xFKUjhb5p!Tov|esW8xS~Y9H6Hlon;Teiv0dyR8XyC z!oRJQTC&a`0Cvu@xtPj8OvPT%J!H=x1W`}PLJ((BZR68}v2+@|NVXKNourrD3o3|Z zrkBlz*qrZRG=arLdf9!rcrP{zyp@P00hfazsJRTTHrg-6;00jy9~MxYA+VxpRXDPM zb+${fS-g%OCx@L zDE$i#VM|xSD{NkCTrRu|rxkGU+z=myuLQ4nq#R>8hNwfNyn^1Jxs2^Hz3x6ZfR3dX z-wavJaK=4|(9iAzo){1ikFQAy-BrJozi*et1)J3sfRp?!lLSr{H## zmXCSQ7adClo*qCvON^W;-^&)lD`w0Ue#n0sUUz`U?!-?}rnoEaj(e<$cU&_Q=`CX8(mb=FJ-9VKP>h&2vaO$LEB9(FeFg+9`omcw?N zy1p4vH>63md@cob$9+IL4IX!euUZ!dNLQsGK=qk+?D)ptSL+Y#x?Xq@0VxxA)BR0 zD_CKS$^R64fj8)_AjIX%L&9)4fa5~Yd!%$1q_vb67YDt&%jdx=lf=sBU$KliEXQHp zGzoeVi)kCDtd`@ppSm(@aS3kjawTs6=E~C1P)p^w*_#aBCxcT5C@hr!!9R`GcocgN z<=T;&X9wK>HS_COoSIw5VlA%-GXFiNxC#pKZ~1gA)^q7t9L|94b+@Z=Gb5ukpi;My z8O2f7X=IcZ7CTi&ZqsFR#$*5eFno&u@8L;Er?QXmfdI8nwV_J>k z=$~$6lol4JtBlH}OqEf&l#)>c{7XiSRsWJvxhgfIl7uth>}$8D@%Ol!IS<_hW?{pF zH=4?(@#jF{IqXd6#<7-orvXOjxZDuT4R$H;(vP4&!vpQc1{VoNXoHK;1{aYVoImIb z`s0hsaYzsPEI}U)?zGvJ#k=I*5{H*^Jd_T) zO2^^$hdV?yYz1A#;{gQ&u<_N!6zSLvo-~h_<1V`m`^VbRRRB%C1AQmxr2daJf`x) z7baH}>99|6LEQMjqJY^R1WaK-Hn{J>bL`o`>(Ts1c#LZ;o&dSRlP0-zD=gKB!EUJ_ z;DA@eUxaxidS~`^(WN{qwN>4d4gih{m*IllAeX~aP?7fM#&UYSV96H9znpkOy*xqA z9mOT!yyk9|6kOtmMF+etr5;Ht#r=2r6OgGIORXiV>%of#6H(xm3-pduAkAWp(IG(o z*U+>ewoY3N3S04HD7|D*KD_R94TL|#K33*BZ&;m7OG*B7X%ooaO7?l3@(+QRl*9_{ zc@10z*1RH^0Kn#;wepzRLjMgu2YP7*oIQ%N0B1>a!ls_3OfXd~vB!&irC02C2z*EvBCMGB>#{p~IQfI6X;8BkcALSF8J2SL05vvN>75RTQp$}*Wbos_3(OF%+LqLP~a%Q34eW$2l;3NrGF`dpU|1;!IdJdwN^uMQsB&zkxI^N8A&*EWF+9sl@X^iNfF$} ztn?}h-rtY~gegI=o~)`}vnf~1R(EmYwVKuBY-XWL@*}-#TD~)+gsQhbS zz4;CSTB|F%utj8-`wHKl%DWJ>!aAj9o|hOSn*mzw|U~1-F2k`j;F( zL#H*LJjF6O>Giokq0Dj|$CFvOUT@0}Rf3TVCQdGUCl0s1hrrAda0+V$=z`D=q1%xc zfbkUWXH73z0z*o!Jb|X+Oq~;_$K`#prSSeDczO#w(QC7?oPg!Gaao={r)Q~@jOA=t z-kh>NC&O5i5A%$1Ru!DXx5pK5vOzURFK^ul4?#8g5l+lYE$9)iL)pt;fuw>?NBMdR zo#ih>Xf1?x4=)VbQ#naO*Xs@RyoQ>+nyPry;Q#CDWJDaVDC{-eDU2hz923Ph|fk*k{anAF^-G zB6CIWf*U()!5QA*S*ODFDtuXmuVA>I=LSV{xTB8NaF-s9ac)pFw)mj$Kv-iE+`8C= zpbUTE)wKKzl)3!BF@U5H!($BA^4HNyt_6%sHCn63`|80vgd~GOjC9myW1#Z>f;Pj6 zU@VnkLCok9x<>km%S4T5-d{!EW%x^@1Uw7~V}uJI288+8@L|9>-4I~|CmFcWpa&Sh zJWSu?Y=z@t0$1>X&nIG7+!xltv^5xq0U6%|n}FGXk0sv;;=+-t*n?6MrwK$0J4+We z^WkbGmbJ7e?o-i|Tmkt@$K-nfF7A!#P?FNPxEuy*3F5`maL~pvdmyBH9_mA;jeGQx z;PdbTnl=A2)OAT^h|?wE{0^|FX#P>yFyL7JP&Ic+doXa)Fi~>0uey8;9Rw?dI#|SW zNTfqK<+kn;g$+eDxvg8oP)PglE7FDpEYv1KxVV-vL;0{Su^qp{{U5bsO}L$-JIS98^v=FKAl11o ze+C#Gs^%)03w0}p;D4{%nEMdiLUPjch>#1>yscTcNyrP`+gEvsz+1WG9!?>y24gvc z?ZA|*%GIM&`6Y}bYId>tevEn;n0d|jSLhDR5p*4(; zvtR}8Y*L@Kt9zs*`T~wFxQ{C-fM`C}rJU7~j)CyX-o^jl>BI3R{8h5U3y=DkwG2~2 z*;?KO{?bc>ureQx3gHQ>E7#vrdFRLYIem5CF?7QwUH%8hRW!XH><;PCNSJ1+_--gp zA1I70SI}11XUw96f062EKRT+?HnD4THMHBSkx8gpPw> z0zcUIN-8c-n}7$vLbMuFw@OJJSX4{>=D-B5Y5BK9u1c;0EKh3-rr_#;NHvC~RO8O3 zac3~LiBw};N;U3b8dtE!#?;AHirOJ~tmqzS#F7DQ;i$3RT6`}s8~x@Vha>Sq*u1WQ zvtfOqB?|LY8%M^iyLV^}C4nN!>nxM%)+(yipr}z@xb%-RdfWoPvp;c&%G2Q38^Zc< z{$08I#FEkDN0y>R{-^2UmgQ-pa*yuf;mIy2Jj~E|eUJ8SAY2B^^WjEf<<_?p-;Boa zvA{^$>+r^_Gw|-m`KtBs9e7N=Cj1mSg@8xd1w61W+BKA?JNG%@Keyp}&l0dfJ3Kvt zOS9O{A`0P3_|}B=aCcd}g99@xTi^@#X6U*Rjw8t6dIY}bO`Qcc9{9N6i)-L!x7gN2 zh`0Je{L_Y4A%^wh5*Jm>Ct@3`uxv4L0b;*EUvr55 zJB%D)*}j8=4wtCCPsV)W(Sx$&N%6!tLd=J+L!^B#6*18kV$#cizu|HSd>vv9{L1a) zq+*qX+ny#az~8Y{63?E2J`OR5xZRPa?4IM;D-gr{RTA~#Pg-)}>ku8_7q`Jm;`^Va z)+Kg!PE#!yhBGfr*C+CNrm5C<_Ls40V&#f7u@t@z@xd!;s*O%UOm5RIm_h&4Te!C7 zR+*P-qV*SPq8@x5q96Rqwk+Y;gB)AKvF#i?!m+lhQk!G#I5w1HQ#rN{VvoSr zA$D@?0K{ZJy}+?bUqPOsCptt+jM1ofGskwrv;C5lDZ6XMB8cIq!15mzbBG-flcoHj zk1^K$h6?g`nPa*83|7@?)ZgvQ?&R3(9NU30%HJW5T~cdZqW=Cg8sS`GH^kP%*C9MG z@uN()ImBdn2SQA4TV)WF?KWG*dI_@};((#udfMoJ>59dKA7VJN#zX}bbBKnlSOYQH z54Ljb6I=_q_lctr!%@W{dLJ}$Fa}~WrxQ3f8DdzI*NS-%!;eEe$!k|}Y{Vhi$FEJv z{U5-jzhg&@+@DtrM(-ogCt(Y4iODJ!5-&hZ?mxCeOpfDwAtr0+2*)zNNfY10l0)P} z4ATgS8b=N7P>4yz0}z`8Ux#>(WAAh9GlHewIPP1Kuok(F_(A|VmQXS z#3qit&#`Yfc1gt?BKfV6#vqQBVvPFGa%S69%$a7?b4RP$53I+f7iXH$+a018Fxkha zsI?9;gJTPM?T5@No{;IfM0<$IF?&D6WR2H8Y2>s&$DW6nOyeyTbBWI(CdcCT-x=i? zz_EE4gZ7BQcxu#NM-_94zae%2zAljlZ+gqvtG(boIATs_aTRlj0*GN-xC5SQRrZr!bZHP+q;F=Um*bco@8rjmF9Vsan#ykZWq8)BH} zH&RB-U4I(&Qthk}yM|-;o-@*TTE$#qEyQF$_!(k2nuSE|zl`409AdH#uKwH5UWAzJ zO?59AX}B-RJXaIlA%=UkYT`DCje>7AaTmuPm?RY20Bjkp-2=bxQ|u_S-6Mh2V+ojhqxJHvL8(2*l~{i4l!Bd2{_ir8pn_Pl`%Y{35Xn6xC*{@Sb`_% zz@P=LhL2ZV2Q$Yb=`4W=iW?MxL4`g@7Ld&hMZ7>BA@Tr|Zi*~o(oYdMM5K>b3|9mi zL6Ol&Acxx&v5Q%Xe62_n?p!}gHoq!T1n=TJMkHMoH3~UiL?nmFLYU1IJ=bOOm{?5Y z1}00y6GTQad0sq8~vy91lI0r-W9+TI_(?kw4c}F}$CZCJtM8>mfFP!^fe(q(PePR`nr`Tq{SWV<@MeO2` zSVQCkCf2l$$OqKt;eSEt$iWUaJBi>~FCI(a z|3vO40`nRua!=alA_FdM!V}s=5@K%J&qUxpn<5V@0#|bsc}x+P%^=Hw;1(BG#4gq- zQdN;#7DOIl@>N(Qlv<2Ce4A&tPl|Jj=%DAJ=#E8 z@KP0#`e_|4j}n1rZizHb>tlJE2t576@{Z&l7n*g{&a5A%(m|WP1u( zM`T|Ld6~$G6taQHxfHUIhzG7VVQpZZ-yo7qA@2~WlS1Al(pr)Fpn8u;H%08CzvZJe z547@7Aoxj$+bqp3xR)taBq;7si5zFula~2J>={O$mslPmQkBWmmPd$OtB74ZV|mPiqgEe965=Jx zlSGCyc^L>akC>>4S8PB6HCE1k-UEVL<-I^;d;M&Ao$C2fMZCgkeM`0u6Q3flGRXph zezvloB-%h)dlj*Z2G;k99A(nX`Vo=SOj=ptxqeWcWzyPufKpG#i<)ec z;%!z{v~{=6gtYbnISF68sAlV7g(egil`1Hz+m?{$pxfwU)on|yR`63D2!8D1D%*0a z8*4+6geb86hg6+dRSO8(3}%};wl!okk!>0%au<`PwzX8!hk?i(wzR!YswaSKfUjM& zwtYyY*pWhZQYm%=!A}ru_7Z_VxM#ADh|Ob?gH|ilVMRsI^EZ@MEg;yY9!ophQ6eoA zv5R)LlSDcJ!S=F?5w`Cs&;6N~q=9WFw8ddX?BW4iQ}T0?{XAf6 zPvq|u(wRumYoz{wtt*j&6w-szYOM%*?qh?(i_UB_*EW!B1^|&YHrIAD`5CWlykd!M z5s_I;Rw(iilUEgahRJS4V1^_5c*PfryuoC@A|Ek1qR0^@$ARG1eOi%(_)d|tOn$OG zPBu=TOe-P&uq`GMXY!Zr2_n^*T(CV!q%jkheF>5FOak_&seZZxk$ah3`?EyGGD+H> zBQlFg1^Wv`7BQ)0UqNIolPdNXiR@%j)xL(vaVFL6>xf)ra+UoR>Mdcv(Oxy|ui9{o zN-E+N>+G))$!D@vk-AJiP^2Z3U5ebuwQem+pd4rH4RxA%QO@MDKZ1-~Mjqio}L?4y48i?Z>GI*wX) z>>D7YPeL>Vg8LM|B6iW(QQMB&X;P7(XyGWbW9s#R$Tn@^s86I5ldBz#hzw$KjiWJ< zQYLL2&57L4q^+YBk!P4(?`Tcrbtdf{*Ae-INk>OJBFC6?a&)j`n_g1HD>^$mk&Qbj z^SmdmI}j{;2nc=>qMxHXkz6K29X*KDVseXP2>EFY-G~hm(NdCn#n+7804ALLMd6qd??XH`}q;4oEzsY`o%r$8xe+t!&^J2?(~= zYs$thzHqD}vW>|B#~LELnSA3|N8})rV~$sdoMv*)v60AGCNAeDA`ZCOjUT)4IN!ny ziU1JIGn`F0H&e}51cH6TE2=rS5UIa6e-e`Nqt3NYDnd$u_C2RS}HP&$#sf6 z%A~y_E12A<$Qw-hD6*Z&6h-zhnXbq&CJ!nCQ}d}DJ_H1hGcEAoD3(1To>j!lWG$+o zy%LJR(T*bUr|+b)i<8c6veyB@PeT0dv^lV^wqkM#2yT^K6$uJ!x()731;j|@CkiB; z2>cU0d4?J2(mg~LGjXQ-h`hqYn;s?dIg?O&Hj&?%MADN)LJ`ArJiQW;dQ7s?s}bqW zBq#kU2X2+cig-oE^x8!3RwO8@B7ssYQN#|U9@%VQRrU1ii0oj}5(%hwv#Ko++%Ap* z!4DkCq~GnpW41GjB*fVCd#P40Gbsjwe%$b=fE?LM(`OUOPa*daxju#5Ph=pIiRp8Q zOa&rGiQCfW5xF0T93`ftKS-%R1Oz_`F*W@;%HcCirYW+P$$daDhwlQBqr{x_WmFrx zfXFTG!Sq!Q?1#q`Nr;CO`JKrl=`WIv9iFF#Dslsp4T|(-^133!nY^vY1SVS)nZo3KMeb&@3klT5LyFkNenp;C zCY3WP5n0D1Kck8hx5|w`WdEs)1ai0?2%e|Z6b*r3k2<6X94BN{ zbIt^tQIx$Y#@IaYn|x>r-3ay_W2esn!dszAah`x)2cn(8;# zvqUO^4StI3f4W{E(um1f*DCVUmi_$gTC4fFBiwIke$w1q$WL$f<8yD<`~=*e zXsVEV52?noD(2p&sWRQ)XsRst2~y2qRR#AcO;yGHo2IJjK1bvcP|4b;=DtW|Ig5e!RbTg5P1VmmfrweI{_fj|nB}_JJ%v2uBj$2j9_pU1c^>Y*mx#ITjC9W- zRU1}~b}!IWW8IHys&Vcmq#Des@$Tm|)dcq{O?9h#EvcrkYKD7*rn=MpmZrMPy@gbd zuxg%ryQZ4&{zOwPbnhY6i>!Lcy-!m;;{HZcJ?1_^s%@-#+mY1h}nCea-SpB zK2|;FzNo2QaN9GmXPTe*#7zBlcVqIC$$s8+x6u5&?Y@qP*?%^>JCLe~RqwjHXsY+zy)@NU zcYji~W!2~IA)0Ehdo+;|U?WGHFWuuwHHlSUxl1+A``l$@^Dx^SbkEQ{A9l~yRNuJg zl4?Dxj=C3Ws&CzkHPs3C)1=zPs?+Xen(8O_i<;_;dmX7xvg#N2tD5RJ_uE9wJ>wtl z_egb-Rp;D0G}U?cr<&@5doQW7;dZ+m6E3^=Yc|4jlx%9VjoounvvGKSCY#P|li~SY zOWp0cps73_xFH7pc^IpF9+*rKh*>Vb$454Iuua?(CL6QQXL+(URgR|uk^4X;`$p1J zmHa%;e)2puG*typU9x$ZZK`-0X*N|oSCh>SwyExEquJzpI+4u*wzvqrON=XsULIIxlB z>fm{URAsE{?AffTx_EXFd5~4zJUdDC6svCXe5R>-diE1}kyU*>he@@GRsB5QYN`RA z(?oW&YOv=QQk`VgP|u&5YNY295t`Z)3RYwv>#@4A-OUyp=Se3LN*ZM!@A0~EyQmCA z_Jm?jh-}QBaH}VaNF!F2dh$rsmQ@oyRmf%#+uY_UB%520Ykv*KB*`6_) zpZh(<QjEPS2HF!Pg$x z8$h3bfmKIf@&U9l`}{Fag2-!NgP$V%aZgh7^PQ(M`PspKzW3y7eolE{-ry^?!Jj-0 zNVT6;KYN;Ls$V>q+$ktIl~kX{z&{n~0c4L>D}LNM)^H^r*|8ftro*jv$*% zwy}7}YM$-hQX*z;IK8(MF}JvMZ#nrXVm}`5otht?_kK+k@IFYY>sS@`KCG#t-X}Fx z-1{u4da^3veL+)Yd)H{HT<^=I8qcac?`xW>qIa{Vs_cEARI^xB)%&5Qs_y+vQ(fi# zl2nhfs)qM~rYiJ)tEp;vzbDlyR@L_Yq^at7|I}3Vy?>MHZB{k(!h=Is^ykLjbRuSZ zHT8PExE1VXRWol$Q?>ABX{xKed89hZs#e}AnyR%IX3n{y&$sc`A=PiJy3X5BQ(fG|kUg?<~#FE#BGWryKhz@y^x!O!PjY`I+QhOsY|=n(TdA zQ{CZRuBpnrFOq6HtIECWG}UzP>zZn&_ia)=%&I%R?`f*LydP<*d%d5M>Lpgq_U_eG zbG!$MYz7}H$Cyr;?Y5A1o7_ZQ9c2B!p0=%FKISU zdL2GG+F_d|UbpYcE#(<+m`FXakvUxI%_LQ8Rz2stSY{s+A3*H)<=l^)? zYMxhm8oDZA_^<5YVV}#7TR}axiTeDS zO{OnSqz!w{^5qb@iAfD#Me;M8{nYkV)BM!&)zbXb^VK8ObXGOz`I=3sZxPvyWt%&EPiZz&e9x23 zbher5TS+zxIIVKuda`+nZSL}I)NJndy+byu+2&r~R-&QIe9C_2`M%av^L@vN{K%dc_`V}mS~a5%AM*XEsUG(IK{gfG<`Lg{&E`>`C4l|8 zA=^CWa|W(F0(so$C(;3I@Ka=e!WSV`UsgToOOVZIwprq`3f|f zWxjf3vzTpG_!^Uq*)v!9S`jhF%+cL#C1u;d%%vik#MWA;O*KT}hs`*TSZXI0c+ zNmIrBH8fSiUz=1-Se50kuc>nU%{5ihe+{VyvMSHtR#R2--=L|g_`4G^?_X5)_a;9$ zBZM4{uksJj{1o_y6ERz`&_9M$_p+*qzgSZ>^H0`PE&NkS^(3pV_s`T+?fv&@s*e77 zq*~3YPX329)eZh9G}Vp%XGrxftGfB0*KE4`SCh>bY}4DnUbE@r-$XWN*rvb#9nEH- ze>)K?KDYv(BKvUv$D|4Xk+nL)zng5#{xizIPxCXze~481tQzk>rm2ekr^u!q+uZ6u zquG@D&uN}-^Is&@U{+1`TSD09%{IN=?+Rg`AI~<^{C>@5x<5`f_p{9`e-7E0=OB0a ztB}nSwz%+DMCxkSwTyy;&^o;$MVxBQQ3o;UlS);w?VFC#LX%eB?Ng8WQmKkxh3XnwZ& zUnQIQY_r4v2HBXsQnz-Qte{ZZvTEQ_0RoBiI_cV zum2>ejj7yQ=RbV5;61qy}uIqsla}I^jFvX{Oqr-sebX-CsiF*{o!w-sm}VZ(Nur=+mfmc zt1kLGYO2fr?nKNMObhfTRc}^V0s}OaJuqBTIRj&em?iZDipkF?_Tvjo)cgbjQ#C)K zz)Vuz$*M@;9!(Vs%+pkvfrm)-46CvOi!__uz%xYN1RJ?6R}4H)s%@;Q5?HCFRXwm? z^K(^Tqvoep;7#&#jQ!LJysP=C7x+N)(;%>mR2Nv)DDb(aY7+QbQ#B17Ayv50=!Y!= z$2HZ}fgg#OZE;QDS5g(Rs&(M3rfL(otf|@tY!U49?OD|>kO6;d84!bj$U1Bv2$D?+ z+jI!TG@FirB-z}DRS+=<`P^8&(4Kya3O>EOW(1L8tZSbbRb!77? z+w=@{&}@1Ix{=LyY||&ui)=0fk>%Wx5CP4!lwHIbvNdM9u_seWPAyMa!cYHQ#oB97WdjcpI~ArfQqL0};HsR~5a z;fH~tnxCD4v6`Px0~0hqp9O9sKP}nM=Yc7jpDzM;YJTcurFt3#`&q#{+9gwSZOM2R3M`Q-QZM)sKNKq*}$Qp99-9 z)vtk1hJ=QXsrm#bX{vs~GEyC9)u7-EO*JGqn}}KS!-8{3b(vKof(td( zsNiBPtueu;NtIp4XyviNWtwVS@I@`H;@~<`HDlGp;H#Qya`0^}t*OEHi1Y-Nte+Xd z9pq;i`*|d|Q}gp!a4!+Fq>l&plj;suJrO*tsh$d+)Kp7?r%Ck?t6mQNqN!dD{zb%W z!PkP9h?sePGiZ%t4`0oGK7+Yguk7J_;ZGZon0~$tMv0hyz6xfMpAXs3zF?l_=j&i~ zB4*hS1`A2`1FH@N>u9QPf=!6n>KgTYEZ9=>b3Ax0`H6sy9K+8C+i89-1aH(-mx4V= zRf|<3)K^nkLN{wFduSx7+Ooe->E$j==1lM`A>Hs&+`xuKP0^90-EgxAAVKd-T$wxMmBpAMm2nxD?0&xx3Ohd!aNG|&A)2g&mu_S`>oRP#J2^aGJo zoWmiZpNW`#_2$s;$dc3^_7!yGXEVRLD&><}uQkP?$(P zu#xq1ODL06tyncKl&h(VLsf~GEqH6F2B~_nsx(wvQ%wprB4Xz7_E2*oW=Zb|T|<6~ z+0T?vTg}hZ&<&cOX`$|&eD!_t!$3i1cLDrqDa28qTUMp{<%~Yv^N5wJo%p zRMT0tJ@kcUvmWIX4TP*H9}`)o0c3q3bl&pP|m0>TIYRsXDUiuTU?tF}KR|p+RIb zjBWl74byBcgl-|5X>4;bbgP#7<V}Vys)SVy!pAjLqwtSfT1~>glIlKI zH4UHDRL#SeHC2nSEeren5>{Ou&d9p5&$kW-iI{cRCLAO3Cg=IOa5nk*i2bw;SJ3>l z59e!sI)rO#emaKhlAn|8r&G9*=I4g+)ta9h!)-`)nN?lG?KM^Ra92%rQ@AIoqK%B6 z&@G<=t)8Xlgb zsYZkskZJ;}CWRl>RJVth5HZK+vhZ`HTEMDl;s0o=8R4~>>dx>6Qmtjxqv1`OYEgKL zrg|d0om9J7wIuwprg}EKM^il)-bdsNsAR1!4<8~wX^oB6SrI;_`B@b{rTJMCK0~VN ztXdcTLsPvHzNo2Q4O_CY&zq@l3OloLyXeS%-U)li#@vH!2}g*S+r`#!f{1yX`F=P_ ze#Wt%ZQ;tApAW+D&()BYsro2fL}WgwWNqvWHy}St+0U2ZrkbDq;nqaV{2T~huX#Qg z?nHhzv!6rZu9}~t;Xaz`+wedlM>szx!b6Gt!Q@PM6nVBbG1}|5@Hox$AK}}GnB_Vf zoc0P$%LdVyfy!{6uU` zjrwU2iR9q669OX7Mw>+vnx7VtikhFRBh^S%#Hwo|1)A#GNIfEETU;M$OsY<-Y9DE# zsX9ciBb(uDb3>$qW^-et8xgZy-6Oq7HI-F8BmFg1ugEa6d5CTLMMi5j10uH)G3#e= zWD==Xuxdo4jBK_7k$r4rWER=%Wt-8F*<@oLlZ=VXC!3$xW?bYEE%ot{r^v?D%xH@V zk)@hVNn|Av^Npw5A}^7uDywdfyrQY5MBda?QzP$^ss*d2MYd_G8IfI@YF6ZPQuSoj z-I1>})xD7;n(F?@aZ*iY)!fJrnrdF;SF(ASZRSVLYBmcZm&s-&+boLMaQc`6bl8*^XqbR_5*$lBD{XRWC#;YpUgu0pB^BQk_+MzYO^kr7&2 zJ0s(@v_6THYJNVA+)jRGv!Bl*<(i+*BX^U{61LeJxnHySGP01!da#kL^Hte81^-W}rraBgRmB?vM>)Xg1q&m;46OqlD>SSaG*#ue`ZF)Mg zQ?vOgvX@8|u#u%W6WLFydaU{*a#&NHjhrOXo>dnjr%Bb1RU-O}rm{r;A~Jzh&gdml zO=DGh)SA3v8OvYs18yOYgjwrLXWO*ZCx3eBQ} ziNsqPs+Q5=q^bo(?$NG|j?q%TE?PpwEc^A*$)sw-s*cgAnoZ~ET|~^M_iv2eN2=be z>K&b@rPVk3C=s)M`bD20)i72Ki9VyLhDQHG#2iV6M^}?-2CGI!*K4ZL(M?3mYo24H z?~rN{t7b&EYN|V<9}_XJkKGmBO{%r5niKtkY&HXttur@zh-`MU&AjL_>6vXFjGiK! zGi7^(!~Ps*)yq*A*_fmHhGlBKw$oG}Mmv-0E>?XU z?M60F1CjOoNwhDK)l5E%4$?gDi4G$_ud$!K(b1aCSJ7LEe9V6KM<)?6X9GACEh9e% z*w2yZ49(9s(b;747uy_*&LtbOy}pe;LN}#I|WR6=S=|rkrgm$3E9=s>Hq~oB3>0J$8g_ z%wBg@>^maQfen6&>;Jn=~s*$Yf8f&eoy2Uz>%_O$DDb_`^=^5)q3RL{j;B~_xe(K^q^-q2LbWAACI z6|o(ps>`YuV>>m~n%G`VwKle&RNYv$K6Y5Mc{z5HY=*MUE3wmLb2|{($2P=%C!71( zW>f4hvN7M*c{7$)5&QGgta>}L(>w{PgBIZ``VXQWJ{*yg_6su1*zH5zg?Tj@ilFMXQ>>5(l1|qkeJ+ZcA z)0S=a#%>^+fo$_dtUKA5BimQ8enf6#RYrU;sUBpND?XfT%<(4_A4kMImnn>w5P5<9 z)Q(Rk@;Z|`@u@^UVp2CglZg3#Q@!{-M80O5`tb*doMzH6KA&>`>k z_)}yPY-89ok1y41TEth9O%dC)kH17V*8-6}szZDu*a(6D(ANvTUePuFW<{L4Z>%DA zaT5@n33H}W*+q}|I~8X_kGcm4&iH2+edC)+HJ8b>_!c6I6^V*_<6jY3$7F8&FpWh4@K`w}8w9Re$!gCGM<*+t+v|pT;Xy z!YPrbG1(KZ1~x)0RKzRx#cL6HhRH!7I7i}YMH1qqBCjzy6R%qdXHDFqh+X^qphsf=JB-5W<(-PY?;l8RA%DLY(b=s zB6i`*Y)PbrB2kf*IhaU4Cb^lzh!itPW{x0oCzHI)QA8eLQZaKZk+neZUry?X%9-OU zJqxX}O%WlgWKJNP-9Yel20M`3D%qfZ_5s0S`Cg^83ITCD z+bql6N~-xx4rXqzG!tyrF!?j{L$cYf$btBunLEkPQ6_(7eoEwTR-MoMoK&&)MoIt9 z{DMe5Cf3A0B0ZSc69UEiV;zjLXD3b(slcRS z;xwsh0+B6PDe)tbc1)@y&X8&#tEwh`qwReZ+f+~dPO36Rax(K1XNfFea#i9ykrk|} zk+?|YJthSSQ5k#PVJ5W_Rw5Uf)JZsqRP1Qvxn3fJNE0UY6CNVnnKVxLiA-YBBoQL= zxFR{3%@R=}Z?aAEL?)3VOj;zeiKKOsspn+2P9%xsFu5*Kkw{ZT?4o_53XyJX(;-ov z$OI;x5;cg-XVndfnnYGG>5?d_j3ez^OnM~hk+ZG$is}3TaXqx37yp@M9Of z63xlR+1aSW{)rYu;!Fl4T2WecQpmMr(@v4unFA7Si40*fFwvgK?W`J>=tO=NFd3fc zLN+TDS(G^<(T&JQOhzSo5c!VDEs5SlY&RHr9+&7xB*|oaVjz)gm`q3vAu^1~ueOco|?B^yf@nZq5K3lkHG1eiRW zm`t840Fj;_O-v!10%ck;zv75mA^ zT2vWF(chSOvYsFt+l{h*(i5JnB}C#(d|A&DDPR)JT1KU4p$PoPT-I{3xsgdUYbB8p zOtQ09Q|nA+QZZ{S+00X+Q;T)N~w(+{5N) zZ6W_2RckjXt+U5RvNa(`CODp>ZL6@h=;%NkGxON##}j~}miG;27KNlczmWCoMx zfnX1RK>4wYRY348;Bh8vvnGn!m29&~kqu1V&ANwF@3Lx7)@CAmn0%?o z2`1kua*@f8K=A0@-(8j~A%0b)Dw97IX~N_j5NzchK(LQR#RWwsFu9cV9@*T-L}YIx zvXqH6`$HmcGI3<@BJw4ZjO@>d{LaLa{RNTWO-Aa0?5~LwDFWMI_7SR$7C`Xh73JB> zs^VUzgCcOOrATikFK3^ximg0Mk)YU+?Wu-a(+nVTYub<gZVMRr4DR3s{v=LCs-$YgC!HjyJtUdyRM z<`brx+kW3;@MGCWB$t)saChlZ*b=<=y zS>;XUl1(ij@?Si>$vmo`WuB>yDOlY!tTDBehV^6?+# z9#_N;B#@8)m1*A(O${F;p?r)z^tD0WPDV7FWB(xECSzoC{-B{cnam_o>5xHwNM;dn zsXq(1iyxCYL|QTVIhiDK2a{iu6^NKQ{4-feBj=J;H1c<{8WA%;7n1ozEI%6gxs<$0 zQ;EC+jilw(B=X?ThRT*#TeETI)zNG+^6C-so-tIeyaq(NF>&WLB4U=^m)C@dS$2P3 zQzE-r70PQ)B&z=L-Y%kfEr~Q|63=UuABKc)QzRi0d98{3@T<&^NwR;_NvD61=dU2x zTg*B{&qy|?zk9cfoV>O~%yL!8Ye&Rv!Th|AM9kKyk=L1s>A4{91|rqZ8Fg4Q??xhK zkE)y3U9)MJ*OSOEe;KMKdA*33wc0eVH<8ij4V$a;`VyJNq;+0DBA+s8n>T=n^>0IU zecm7XA2|h?#n?yb{>nw+;}Z68ty&E*0)m;SVZ2r$Wa-X%|vqQiWGRSQYg3)pAP} zc2Z$46;6gQAM9p8SQo;FAZ!HTG8L|e5c9DY!e$Vjf$(bK5Pw5>Ei79G3DFM1>JWB@ zu$~HALD&_R2dnT-2+_}DDqIcWU|8M);ZO)Ks<823A;!V-0}xJzu-`Bt;K5397{bO7 zW(^mj1BBxs><{4@2**R{906x!5YB{fA%y23Tn6EYkwUx*;VuYwK-heg5c?rq2;pf6 z_d$3G!fK<1fC=10DTH_vV-tk+AqqEjIBEgug?$6T+*7O&o&o94vni z;b2()ONH)YY*&Y)_N^H9oY4rvPpv&?G*@9e74}r&2o-LC`a`=r)bbn(O+TN*as^w@ z83$E(fwi(<-zs#JNFGpOt_mxuFrUIJ{nP|MMZhs^tU~mQ%jg$F)M1GJ zF}y~Fm`+Wb>8}ecH-z;!sc;~L=6bB3rm(&(vn&o z3Jo39bVDRIZ zC_}#rGgWB#HPWjLyb{|3ezhOU!ZHtYte<*_QnJL?U>&t$c1*c*CX zcbBp=*8f|+YNq7tzolpB4gU{-U#y44DqN+)S0TiDehb0_;8)je{XgvgTX~H7`dI1z zo85ooM!H7+zEplrs?g{Mh92v=lBg(tf%O>vt-^Y@$>nPy>zC^;_h!A33NW;j*k(hmiSosD9-T57K_h zA+WyC?qe0=_=3w=4;cPL{n{a9|8@x34;|vLN>}y+hmifwAy&XqHR`b4F~oMq5ZfI? ztXB-N-7)-0`N4X@Wvmwrv0gC5?Fd8MjxfaS2t(YCFqHk)A+Vir8QTfNsxXdWcwYIz z?HiZVCc%Eu?hqLewt(>eqwY<>eX8ED|8*RlV@&3GIHrurOccsIWjqO)GGr)1C6x{e zA!Epxk|@epX+Q~484^-NAw@!oq~d?yd)<$-`}Re@;r+kA_gvSxKG(h0vz|5Wz4qFB zt-ZgQK!zK0O0)eLZtYn};nwcfu9Gni-3mX;!A4+t*fj%dfp>z{asBB4MwX|w{Ph-x ziDSfx;w*8c_@4L)csKl7xppet`r}LKV`9uhzCP*1;-WuKll%Erg*Osgiyg#);xN(L zVWjjlus+&tfw)THzTXp*J`8kX(ih@!uoJG!v4cEwfV@r@6>E#_#QVkJ;$(4dz-(?M z$bNf2U^cf0>=YO04w4A}3B-KBrFhsgvsh3pBi<}F7CVUj#o^*JApI^7-xjxvhsBfP zpJL|0K3xg1l2})4EA|(si3`Lx#ckp@;!k4QN4)>*#mXStr5@N7?Qu8Q0~`giJ*I=K z#|p4F!na5t2;#G0(#CNs&gBA&xNNRG*cWy;gG^U1V9cd?Zp*+f&J6({h20ym&J6`e zK#u^&fn&hQ-~@0cI0bwGoB_T9J_jxVUj*L-Uk2BJuYnuD72w`f&aDEsL$3zE1lNHF z!4JXj!B4=Sz)#~Uxm1ri{L*+OmqE-HFs17&J}5pa4hx8JV~DS329WKOUA!J-yYe|| z?RboHcX(Y^_BCYJ2xL3oCH;W-s5k;-JC2jKad#Rt{m)W3=Wo;t6uwe?7i@y?jUe+G z7tBAFRS6~B_&-@>eKCSo*Ak)8--nquGi+|kv`D;0vC#4U7wi}x z<3@t_Lcc2g6F3SwW0H?=49YnL{xJ9);xmr+>579)S6=!qa6RI?D!i{a7;J*_j{*0kOmI^b zZuPvJeeN;N{R)4P=`Lqq1NOPoM%p(|>V)uuu6a_QfN}0&a9_%l?#ZzXPwB>plR@6s zJtwXJcgLl4tHmu~IzP5#&=9 z+yq?@+?qDdT?DU7hx1|_^Nn-q#VleGFbm>u5N`%KUe*SA-d!!7oo6$G{Nvn9U{3gJ zhV(q2+l$sd|8BcPw!^*fn?GGjHwY{NJ`Q$_Pre^4JRVO;( zxvri4xVRCT;{SEzaJ@f^zEEt9b| zRIu*}@;Dd-riXqKWWJNdX_LJF!kDiz-F)aGu9ABl>>U^5)_`5oC%Ane$Ez%poqG(r z0!ZB#d=~n7>0iMW(0QNn@twh~&=aK(gGZsSo#Nx$fGMv{a3iF5gZZJ|RK}Ne4Z$^O zldtb>p>Mi2#&r(jV_ZKFzisXw18X3BGBvmmYoLw-JJ-(8GgEe^kd;K%HGQJv1yRw{(*oouHf$V30-HCJcq4T31GQQwkzRc)H@y@?6#`T8gbIU;iaa@5*(5~ae zX$qeUay(i9@_2nidX32WJdfKCrFVz}Q~Tp~KQxcuqhQs{$>)ptXF2XeILkpM%=7sb z1uj!a@fpw8zPmuWy1X>cT!|p=WwAr&vHNB9;+v z5$lVs#SQ`g>c1cS-;Hpxf57HRL%_!I&6CCijB``O7r=+n9*aS?$4YU7xK;c@JS?6R z&x_Z*tbP%5iG{`T;%#Cxv7Oix9D;K2IVStDKlE_uJg@lcS`m=tD=o5}sLM&;1hT(t zg6z+_3U4OfA$AbEgB&*pg3NDfF#acBpY43H^VzPyc3oeFbm8l?UANcD-&XOkcsLv! z92k=|#?=7X55JA#eNbXjf!Elsm0Sss?cu}YT&kydf8@u{vuMZnukqu^7}#+oRv}^+I^52mE#T1nhV|S^xhA z&Eq3}xj(P-fjn-?i}l63#Qx$)ahAAD+$ing^2KXiP=imYG09XX+egJv?`R98v z?wZ#zj-lVui$%eop{s!B!CGP?F%i57f1N?L$HQ;<=aNr~6UCY0e312DCax8?iC>7{ ziKoSjV!Ai|^&vY*Kl#OyAltoybQS5_#Aae!v5R=0I7l2WJ}vUOCG(jEO)d~$6W~>zEU)DJH z74%bJ<{TL3K=y~}MQQlF3-j5u*!O^V+sD9krE|o%1z=@_)4n$NG05YU>!%H%E&VRq zA^a3b}iGzxC~%-_$>_f11o^MzZnTWoFg%*@OwTz-;Dhd>7IsW zdASaE0GjJ9dvjua>3u&ASbm$Jzeaduz8tri{!7G@$HWU_{5l`b@tW~@rOSx7h)qD& ztG#p|>4!ibUsoF!{#)bJaOF2eTmZ7%D+4AbZ3DUPxEJI&`E{V<+%I5Et{4~lfp70D zVma_ygx8Z!1bN=K1@FRn-4)D?`1?TK*A5bggFNp?gY3T_;J;D~Yz&XLls1Nl60 z8@M-TO1B4GkSnD-2yVu>*yclj+;#@zb7yq7ZNfg9JQ-a}FdKn>D}N`=yTFFKXUG4=r$nzO$3iXzbt(ajLDneewWsBflK>X z3T<)jbl$|I>%|+zYGOmNy?Bo}KpZR%3z$5g83TO|e#eV5#OK9D;v3?7;zn_s_=UJ% zJQ6TDpI@M}<-`6JF~wG|xz5Az)Y4f*&f^%)`5BpC;l;%YVlA<$c$e5s>?b}Zju6L- zv&4ns>*BlOMscV3O~B-Ov0rkdd_N$ZJS}p4D|fzRJI;@aAfEFhlJlb?insgH5{f6s zVLT=OfWIJo8=35n{Z}Trg(7Zm>6>kSQud@3yTTi-$3zE(bmaq9nH%11mam9tDoH$SbnT8?@K1gZVE`v{Lo*)^CD`y zudsByPdt|w*Z(2jzonm{^jz;}x)-DuidN1g&|Hu6`6Rfvpljw!aJH^<1iDQ~XWQ=F zu#m0`y%?J7M7u-b4K6T_@nrf_=lKkmyQpyq*z6~MQk7@iao@B;)CK4afCQdoGQ){ zUlLyxmy7R+o5U^RF7YezsQ9z^hZwWl*C$TAR?H^m7E6dXiWS6L0{ZKaUAKDV$G%a7 zlbyw0;z03XF-aUHP84T}^TkEta`9d9196MEQ`{HuujLwu@*G4sc|`m%V6xrM(2pSg zycqMj*J%TKJ6n&8!SkMMxXzL9z3RC^+#>E0zY@6~KzlwXC9}gX`K{u49gorTC2P+l zl!wx<3BwqjTDUU3-sWPYs6fxIqG z7UzJx9?usSfymdb5qE&h=OBo6y-V{{?pr>H@-*G!nJ9J??-Bcng90YFq2NVam&Ss( zVV&(6kn4mCz%&IC+zRlz0x|9bko)X+fStg-Am`I(!7K&*bLfL8XXP(>oMT@e$a?U8 zu?6CJKYRz+1mP_I#bpZy}fj{hstma3*wyy*|Dn_y+Vn(sRL2q1Q`a zvk&{{p$mcZ*A9$Nz$@FZvB+ zKV5Uk_j?AgSdQfVH-(`0!M;Mk1a})a1M8#>K^`Zzf5j8;KOmgzwSNuA@rCet1(P`! zn(M!BfZXTf?UT>@pAmi$^}8shKkRi5k@MV(C>QTzSiV9CPgy9=RRpuA!9F?gPdrcI zTlJ|C-UgcYsXam7pWYWR&OHyZ{>#M=#NFai@w}M!TW_CJydLEFTM^`OUt4Uf@I>)0 zvA5zm-(>j*DLnTP@25D(eyJc`L%Lz0V_a+TA&~0;gF&8;Nnr5&2ITuP<3ZlB+%M$E z1-tK$ac6>b8C|NQSZ6`HKgVHTS>ZTW96C#3-_IO(lc1XyPD~mpjuYpKE5&sIlkcOp zKyw`V0^~Z@aggi37e%{2u=SuE$9%gM6ibU$#JZyGH?jL6TVJyKCR=~9^=Ymf^Z03v z^kh#lay{GDtFN|BZR^(;i8ZR=#VZnj!}HpH?Le;AcLEa;-wo^p_5vrp<^KfvQ~#&y@}p26`muF++rPm158LJZXwR9ln-8*`R)So|{ZQNka-ZA} zBG;|y_c|OWw72!^tF2c@u1ni`cjP*@tykMR_#hpRms`IcKgXAc`)`J#zapP^*!gGY zqn&?tKK_Avu|1l@56S-EzOl5&{l2k(^}G-6|It4FIIZL|!%so1s}>Q}pGg!q#PC(nsYPtEmZGR+B3u3u2+l)hf9B-RmIiXFsW;vn%UahAA1&Oh}Ix@LU;a`f!#fxH=lisd`SXJbD@*y2hKf(|9*PH?yBc5z2b_(d*%k0h| zz8AvDYnOTQ`7`zX3Lh+v5T6#Oh;zhwBA=@>{Ss-O7u0;ddnPnbU^&kt{B_uo>jEbC z=h04>Pa*up*F85Qo|^mZNRHd&R)zEVBJ~dGJ>mh8;|b%BO7r>R#n3oq<5T23Bl3AE zpAYkT{I5PQwd>;vQ%#XCjLQ)qAX z>4tFT!+bdp?GMfC^`o*MDNY1AKbbB*5AyoGQ1P#Vr_f$2rPqtQ#RK9o@r>wx^5sbj z@;a4Un&UH$+e`BXYj=C@TLN~hzg;KFE8Wc?{qQ+4jwe?Sn(b!Kr&~g^9-YMA;Ca~D zbL#=nY>$!R3@~L8yf-7ht?(V<0g=xe(ie$wseX1YQ;`H$4CMV_cd#_{lhW^l^`XC$ zE_oX7n?c_W(tav91o|WCe7`t19l9~d_*vje=#QoIpTRf{-5g~60`M60r_#0_nER|> zkGp-FZx5ai>}R&~V$?tKct}6q_shw1zCHc`(_>$6{BKO3;4*={AIt;t{f2sA-RteX z4(poG9iZER3ku`?2$1#z#i3yMzR|+X@1KZo5TD?#InVYtzj$8+dg-Nn5?oX0soAjJ z2VMm2KC~Znnqmp=Q81j(D(Lhff7_v%&tC8l%6SyL2%ZCR99??ea&#Q(T`V!_NAb4b zsd4`cjv^8MLa}6f?%PRS9Qzpm@XR3Q5{rm8h~>pw#pYsrvAcM`_^3ESoG8u~Ulv~% zH;B8$z2cF8e=T?aLWxPI5Kf*EFN&%E^x^cwc$U9^q2@`~BD@IRH@RNCMQkQ^7Vj66 z#PI=f-4_>$YsJq3R&w8iGcs4gq|dp$#Vff?;IS;2uYtTTt_~J1j`xm0o(GG-8qm9? zb6vzfa_E~t#ykj)fM;A%VY7)3)uO6n+a|; zG>_-KAjdU(zl{5!xvupc!pSpYY)b0Hq|9Ium(iUB@g9oXjO!<_19h%pc${khRw;@3 zwR9V?gTlK@_Ynt(gT)czL~#yCe=kWd72grlg4GcJ0az2<;=})PzBMU{`5eN@{Q*%w z@h7ka(wzg@eiuPr58`nwaQx0B764g4yMAy!PF)P)v@a`G7Hf(PK>AG-JBs&!^gkTz ziTuZd1HhT!bp^6H?rWS=GWKud0p~MEP>&B_ccf(U`SuC)4+!5T?i9Ze`TYyVACUf0 z{?Om`_gdE?nR1q(}STkl@;a2jKSskk6Hei#tHhPxgVFZ+sUp&Yi+LQ*2l6 zdnR25lmYFZ0i@0@avg@6>oR11*_9B7h$BVz2mL$){qzm^9tt=Kd>>^0ekg7cKNG(I zneJ=xJMn~g24wm_L5w$-&NHsFO}oM0XOmoKn}+<-UgyW9EMji4h{%1c^vCBetXDaN zGhKDCTlVDhkLz>?uph7&!pR}8d;OsFFma0byf|^Bw|iZB^Cw=vFTGXVrSN#%@6rF; z(&xmlWOqtDE5ETBeR@6mVW5t=`VsVZ5k@$u9t@x`Lo5km!LCh(Z603<##P(tj@!~7Keh*8J5T}SQ zh)cw`#SP*P@hkC!_`8@E?^Lkg^N1zInqnidvp7f`CQcRSi%Z3K#ZSb~#lzxRF*W9l z%s;PKQhXiPYlhz}eY@CJyiXh=P8MGi*NEH11LAR!b5;6}!yaa`qRy-9q^}oiip|6h zVh=I)S6|Nb;sAyBl)qNuH;bRkZt2I~?;?!@dlmnym<@ZDS?=#;Uqrfs zSVL?g^6SyGZ!g_bd_BagQ+5JuS`^mx}Aed9!@E zK9fEy;@9Yd^eJj5tMnMO-a@A|4P=h!@06*fY%XxLlkqejvNu;z98T z@r;-@pZAwXyg|HG#IL>v`Qdk5eZIySKL26T(?$F)YGAis{6hRuyeQ(=Km)sCB7U(m z&<(}*VjuA_af0}w_^!B3JS3hK;|qAd*~MaFRk6OvJtOSz2gOn1v*IFgt@x>UT)Za1 zr!OE@74H-u5+{pG#ZBTt@r;zxy7;~e?5kF{ACxiw>UzaExszQ7I%o>h<}K=3VT2NwF~-dBHktT7V~31 z&G^C6qs3>%h2opy263nOjd(&#RmA(tC6*9*Kg4{hNH-NbiT%Y##ZlrE@i}p&__6q< zcuq`T)aTFd_cOm=Q~P}RWqxXYN1yC0_7z8pA8A~DMtYw3y7<1hUHn?S_Y0rTQR&kn ze`$#M@w@3{y6Zg)iIqftDVy=_#9rdVViA>VjPz`=kFFE1Nv{?8t!et>m!bK-&l#|8 zCEOYeC*WWD!m0k}i*ZMeSi%K)MLX`%7ErEd$*d@zufZpuJDb`5)I28Y7&~ zSBrzcb|bxsYEgm-(}G0X{#Y zU#`E9k?USuN8tVJmDatO&emaUy~W-SU^~rMd0q*XC$gTA_1hHcmnBNS@?S_F**;-^ zZ^_>p@H6DI9{d{oDCFPT%fA0*?PTw1a9x_u3$4C5aoxWBHGpR6GJD;LOm7YO;aa@qIW ztiSC0Y}^k*zj;u9GBe7_^FLhgqVUJ_zhua-?bC_$%leg-eWj4S)z9o{S50;`Lv|K# z`(h%?XYFA1u=CT7NBbU~op&}4yo>(eIzb`SkNslxxB9X?byS{)q4GqQ`(Mr9@{N|? z?aHs!74l=b?v!1JE7(~-)BbMQ@%XwYioMy{czFZbgZ*yflC5utkF$H_uRqA+?4gif z^JndE{bJ*QjSIHkZ{sM-`I!6;3;DD5HosO*+K-g|SditI7)odMk>#*)i0P-np2zX5 zP&&)c($VgD*}W99v-rsI!;U|zSNJ`$f9LvO?R4U#e{Rq6EJ8V|qMw$A%46lW{SBxj4V**=HJb#3~42X?f7FN!}Kzi78Xb{~c8EWS3%!|Qkx9Y1$~Jg+*5_kg?(a6ORi zK!4liZ&%2l)#E|f(;w}=L_Fs~2cp>7_Y7>m>E_4${syKytaL}Cq_h33k?EMviIDvh zC@tS@TKU!?oc&<=+xX3N*`wHh414y6}&l)`+8CA=%;a%@Y5&< z`6BAo5P^}9KUxBIJ$D9=1-+dn`*3!|ie9O*d@ zG5%G=v;51W*ztQ&w0lbV(S8-|ra`Y(x^+>~+41=T>{#EIl|JlelhSXwLi$xo|Gu~h zWO;UrKZw7Iu~;i)yGG0JGv&7@N`6)@+lSA3?w9?cE7;qlbLU$}xj_X+YmDW1lY`J}As`#Uvg_Z2p-SUd3jIm;)5?6X|K zp8L#c&;8#d_nUK^=6-XM`^_27@1v3YJ{rmIqmkTi&ihk-2Q9cyML5a*<|MzHMsmM7 z?YZBan)}S@pWjI%`JFV9^~|Mm=f6U^%c1>gUtRrB59E2(9JKMJ2-3HME+KzqqWJ5s z^fu41s-OUFY@K_Zu#)N3bv2UmzZxOr02Y*Srk8Z{jhyY z_MQvvTf^Ss2djSc*B0SykB%V6jjmDrT6tKYxlKePPjh~n4k!}{lyUBN5Zg^!!-WnbzF_Vim;c9lYQ_Wti_)R*6F440!i z>|AMl3k&4^T3s+5bmLHZyZ-R^L^w_qU_4j?LgJg-HR zd{~b=E)(7!;U{u9*Evc&_i1r_s1N_$5#JiL=R!7*?XC3vqNKO`3qB{c@$UiH@&06R z6#GtZ_~*GS@8gKS6Zt&>-UB`b-Vcrk9|4~MBagEu5zc%@iIYIK%M6jJG|4%^BmHJ+sVr1%HW#;@G}(s_B9v}eFV$^vRv84r_=aya(##4`4wIiWV!7; zV}JjE^pVFo!%s0B`&-U{HzM8nD0cSTv%37(5iNgvj?fC>tdD&+vI8{BVc)Ba{0>|{ z#PhfsB90XosC{QB{R<$E4}M>gd=;AYeM|gMWPL8GJ}ImHy}nnghn4$sZuP z2+j76Y=5?M4z@4aBQJ^bh3Ai5k8GSii}VE%e-Y&V-D_|3{gy*41akgyBgpbsm97t7 zk977uRU3~J5zhM#?$0WP_;%3Dw<*pmmYe4nY5Q@xpPc2Vec34X-DJ=838u6C&Ea&F zqNL+~;A#lx^8?n)u5aB@9v=UFL5>f@MBBGK0h-r&rmq=FzwI}l{|v;}K{)RZ8iIT- za=YwU&!0y5amVgU?YRf-Tf^>oq;Ct__{wpM^|JRQXxAwePu(p-_kvyuKYc^t??BVf z$Ko#V0mOd;4hD~bJReVk?4QWv!JgOA{&Cn}09l`uWj)P4BQ*V(J&&^|V9)XPDbVcf zIEywf7$^J5|Iq%~D0a54%=~8~J~ztsLdeeI`5cM$D4}{(5cxd|9(T7ull-m)$?sQ? z{JsTg=Lz#!pnMib$*0BJ7ED)Mx`H&nhrw|AS%&o4z&F4G;JZ=$@pqwk+{R!X zi^nN{ABySie%jU>vm>7Mv)_%P|M%gK?XfZB*ZL!}JtEtI@9i=_zPC$Sd(iL4^1D5X z-+!h4yO5s8%a6T!e=DMY=M>GFa$d~0zAId*k zIWx&F`&I1n$Swiox?#~P*xNeW3ar1ee6~IpUN0<(^z6?YLw>BiZCy9o@05kx$<}Xg z@9*1hf!5RQI&JH!k-t;M_Nl1+Zwlpa?ep)J<4XC}P=2+qkRQv{Kz2>9U}x>i_G<~d z$a%f(AL9OVwwKNGY2OC+cjLGSu4A~5Ko7X-8dtOIu zoR|R3d|98K@I$}%fsy09`M315%d!y$*ZMZ){zW_wi$4cUaeZrnCA_L^$K8f|2z%d%KTky=KaO zZWMd7v+K({nSB4*^GzF1Y#b@^lP`xo_qO-t`5ryzGj?4l4?Ff>_&ssPU+q2dL&%?Y zEcbks`xWqgw9gW7Gx+)y>ahdy>>oRRtv~4R9r=6j3hC{=c-n7}{YN14-v%=OT~|nd zrTq8G-`C(*@bm3I@bew)cwJ?Aeu!evQxv~;zL+1{cawduDE2nq*!W@TSkJz&=XZDphSFWm-qu(7JcZ+i z`D6ZrmH*@N_e98_U0==K^0$4JmR~)z5B**#pV7)^d=&rY*Y@MET+hgUddNP~F1!zD z4(!;U^FsDkeoIHc3uX7}73^%D(hT)l4m+zC^{SALyv{OyO(>pveMsAUp5^!m;gRD2 z!?#5Xho7AYx9gxi5A1;OFQSAe9QET5{q09Q?G8op8|g2c?t7*C@gJn?2LC_9&YrW` z^Yp$5=lD1X|^O+jH=muy26)I#K*4 zBAoTE@$+Pen=p8p7G$EcZCsO^#yshU&Rm_1p+@Jl_^d|E$u_ z{s-xq-wUw&0_hikJf0UvNp}SCJU;9^w&UB@@#$x|(!Uucz4cdQx-%;Gqk3)+f3DJJ<%kts4!F?P2ULR@K#mM!28)s}ip8K8Io@-w6^MBTBwd%DlRIe(? zm&du~_kX%x;qNQ_x9YV?_1Y4umtBWztA3I7YKU+f7e7<_JyFtIzqWuqkDI&19%9(f ze)%~R#gFCBemE+-6IZaaey05|vi~h)Z~oq!fvkf}Ndr_B>|@>ciuE zj7UG_m0uNbD#C9G`Lq1YkNy7fbFkz2Wbv14N9z}}`)`d0|0m9y+Nd}Ct3jy#cHUV1 ztv+nG+hyM>WN-2RFVwd!%FW}uBglU57OIDhe^!sH^{pH)E7;R+1mYK=J;%s?LKJ)64{=`b2JARbvV1Jx|5p21Kic^A-?(m0 zQN3ndppP26!gntA39U#m3`4#fD z-=*dLWabmOZ`t-G+rH(a@XK+0&NP3YSz?kuo-Q|!vUauh{$D=6_Nm>z0Xcs?qW1gY z|6==HZl273{t4wegZ?-Ray{E_`JyX7Vy`M_??g_ z_IBRc`7{pi@$k6*f9ZIwulhBKQoqRSqP3^p-$ahf{C*?Pf18Ke{R`W(1^jb;@($(K zK1zPJUTXbiet2Ks8TR)4p*Z@bdq~@J66Vtz;S~_yFN%MAzGTM}=jAN#LOs{K1?i|; zi+w=O6T|g*K>i0u@o(+J{2vd+Tlk|0=kYOKerJhGM9YW!GM-RAPl1=)m+`OqW&4bS zKR$<=3`U-}cAsL$ugz08pnUcmV7k)J`3LDO9iK0}7_tvv-(C)dvwW{X??8SlLg6;A z`2yh_FOI0aX#bY%*M#gN?KrNi55-e|6w>sw9r_pe-4zPAd~F@j-p7lp zfOyt#n#k`D+i{s5=~%u@S4hu#WS3o@ke&IrdebgJc16Lt$ggC`KC<4gs60$pR_Q7! zUA0iUX!+EXeVve9q<{KtD7)K3cG3K`lHHx)N|dWZ$Uf5VT9w<{mHBj4`kq%vN4xuE zHy~tZ<+PXLe)s>&7Vmq;iI7l2NP7@c1?}%H({o)DnqL`(M zZ-*iv^DQf~{9{%AiJ|iUEA^kM^fSS#@H;o;=byHNUB~RY%5uFVzl%ct{*`hqRr=RK zmh0`1pMP2|u3xgfZ2u6)X&!Hx$NTVbdEbM7jwc&H-Y0z&$}h6qHtw^Y+ho5Jtb=lX z5lUy}H2W5a=lInLd;nxQhl=CHnINwx3#FHVT=#k#WIf(jILmPW`Lg_nRi2}v za$KqWCuDyb+zNl^!2RH#q4Za)$K}dz_4`icJSASP9={`=?PB$fuj=c``o-Sr+cy<> zx$A|si}~m8;zqVpdilu|#m{xfkNI1DtsKlhJM7uMd7`8^p#+k>A~+bdl}U3-RnvyMEbq$J)ilp@Fbtd-1zF zHecweeC`YRk8H1Sxdy1yy{qlziS6i(*f|r4c@3BYp=n6rU04Sg$-F&$Amv+EgADNE!wP05X z>Fb8#La~UR%6vvA6+YSCELihR?{MvEJ^nHG*qg zJpS!{G`?>}y#Vj4l5=2hOK;zg`cUDK_kSNFd^-GF zIrl)bT%7N7e$4lo=OF%TgwF#nw?CS{8^-+kyJDpMo|yf<7=MS1?a%rwgdev1t6=2# z!uMyH|IaGNMUejDs`>U|y5&g6_ix_>Bki-mj_HetwmwuAn)RtB))8+PTZ7D}gAwIi z4gc)Vb)j zQ51U{5A8Yc|MYqe%FpNj-$bd$<(`k*xNXk?ZQat2XPZayz3?OO%l2n~4?_DLhmL$t zlE>Rm2xt4BjZzM~uJd|O**flOZ(

    RaC{|SQMnd_Tp#9sNYcg~rmKu}OA%ikD9g?XZ5iC zr}SGliXXOLBZON$E_eQN-x}|`{^@?XWv}@A^T_>hYZ1w<1(*h%teA6{R09c6pdz8mb#&f*!~D->?&%`eN{5ApB8 z-veOeacI{Y3%B!>&u5rFf9H+;@FCKZ+rdZRhh(`v2RW`$Cxyb9?~_sT`xbWGH~zC| zG>V@w?XS4{{9x*oA1-J{=8mszHH+u)2&sy^`Uh1AGRBZd^aPW^Zc!#SI{LBk*!pcA!dWld4;y*iTaN1~%Wc;W`sH!NePFD|D@afNuU!}IdjK=B z&zI%x(!$f)iN9OVaQ==xY4g}OP#W@QF`or4K%0>I5vOf{U-uln_%hEI5FG}}Ylyv6b+J*gi5q6jSq2AZj`TO@H zc>HmGYu|$~Km1-p8rXk~bQwVU;q}SRhp=6iDDnKRLr#SAyw3;j1`C5c|4Yc8?QZA& zF@&=mHh$Xq{~N+@gnjJIc;6wE?mB3W6S+W+OGA#~z6IqQ4N}h#i^{GdcoWjs2j{_# z*NGa?O`&UpcZ1B|t`l}0_)mTpng0Hr-$my6xDxkIO#iR`F7j@@XB+wZ$p0(v!`km8 z+wUgdk9KE2ju7qlk~v;CK)>)gTT^f*;#+|)gKfb#XbG0Eq5FVa!2Y0(i}w9f zyMEgI?sM4jIQd#UYQ*@>@Ke&iitZL~9}lv;cD>6C&Fh4HXEql!$4k3@+V#|~izQ@l z@6FivRVyK!=L74({;vtmamt=o+B_=q`Qk6Je*CiYrm6h2QF{AcN+)Rg?JwH>KihfG zKWH!7J@yam{?m3Hit-IZJ~ltHaoOr;`;+ZEIW`a1xP9sOU^z~Wtdp3;`}2`?utyhu z$HFhKrz62d&|T5qE5vui4+2(lAA`N)D!EB$g3tiMNa0#F64uae=s2 z+#{Y8GuHI}Zx9=aoy39SotKx^^H{$PN)>__g8L@%bV;7I3O73py!QwD+yf`yp z!lmEed;$86Itgwa$lu-k6Z{mq?5$pp29HB8l>QowubY5p+l){C{q0w8W4RLWjK_2L zES4w1y${Xb3+L~9zneMPJ~G~Z$NO@Aj>@n3`vv-G_=~O0^E%mY^z{DsE*s!?Yx#S# ztLr8vO~$xGmO^^6yjU0ebg8RIkHPOsuCAN>dz>{8{vqPuMg2(rE(cj#;Y~!Q`>?LR zA4Gb`_oYbg`z5)rkmP$+tLs*B4-O2xqz%MV>b)>fwERXpVP$kCgFmDt?{#G01j09_YlRKLa*TN{4fB zU&`i5FX1@j?|x^6Ci9EM#L5B7y1L+nx@BD(v6naqyski5_oO%}2#;~w>*9UYdWGDV zpsQcV9R*X@$F<@E-p^sLY(1-x#@Ip`bl1;k=v1+luwbhJB;-$NlANhb#Udq45Mo4@bN=h_vs`RCdvv*Nwb%RJY% z>l~l+vp={FK=S!N$@Kt|_aD5z@O@BTpZGo~IRoWj{7WG7<^2n_y>D;j;rx&3uNKei zN|Aj2dx+=q`u(8v`>%!Ln};Y*pZW>z0LXErOoJFV61o9M{RsF1^knIE;A-eErBgS= z{SkCouw#6zdlNieKh~`U|AbHb{orlT`%=Od+#QE+Sp-ZT4@x&id_nvUyf_kkwn2iM z2`&Zi8qI!9a4VoUL2m##Zu#*g#yvTf{fWH*P4K(q@SSBJevhPKO1BWYO}3P71=tPx z9WWtJO1A+l=rX$B!TTF#bk{V+d+xZeD+#v2@lX-uyukMN>iT!-y2szaK9S(ZDY7Q) z$rfT4vA@WDd?ymHZ&t_MJ$ror4?#Tpjq9i+e`kuk^&!vA_&s>);;FnH-xs5PO6ewv zQ^k4W0&$tR3gmq1193aJCT*dI z_x>X5(^Gyp?_xT8o|hN)yx%DXaz0p5IEjj-1`8w;v?-0_C=kcwLlG}IJ8jP=@cuQ~X zX!Enk{)o&kGM@oo;rk-U$Lu2GdH>FOtc$FVj)Tjs6K#Qg6ZoBp`)T$o*MEZc0C`=r z^&?wP;yMxI_ahzSzXx%ha6f}B;m78u>Bsxy!oKIi{YN~m&7SWuvHhmwzK;1$6z%td zPGH>Scx>MldLHpS&-vW*OkvF1p_#AUPx3oPEEn(V4k6y|56-}j`B*s)A^tq#cPre! zbHwK%OwaEfv79A-^4i9G`+iVUrE`d=|I3&!F&wBv;9b8M%}%}@CplJO~;`*Gzz z^_LcYcpRGF9MXm5zc|SLzezN^+n_mLzFq7n_ObA7{j3a)B4rG2HYTrMK(zC$cj?w%)S~;Vh5cPuq8B%+AI?vo~5i*KwJz^`pgq3BPQ2^ZTvx z;qS7tyjHIh3b%Bv7WjC}*YYuY^Al-rc7MPh{o8e)-=U_CYvIRt?uVex3QY#{P%tm_ z1885H7e~&YZQgA2Xy*3_?CtmUN+Uhnp|V&fBFO%-c=~w~eoWi^$MiDTvmY#ct^Dx*jphAV{`QF9$)4YzVSZQpjt#$G zGaC7yR{GzSp5L+I^~w5y-@6$PJNu4Jd`n*s+t*>oZF+<=Un_qO=x315+M$5bl@_bY zzP5A|(dK{V=MIFkzS}UTXZtP1{S@_G2%iD}y}<@KlIIVDpywi--?yjTP-tH7M}sWi zv(o(DJ;N7D+jsAmORp6_0ofjVL8kv+;b+BbT6sU2#C%}5pUXqD95uz3;@#qd;*;XD z;`8DwAoG1g`Xi9#{!IKz{7&(INXNDIb{WMyApH~-Zv&kJT*W* zJ3{t0kBdxa_B;*_!oH=_brt)8rx0$(&p2pa=U)^@Al)>I1MRkBeu-O1Qsc_(kbVcX&I_KXXQuCm-y1+>$(Q zNglUk0i+|Z59rHP#3d$`fi8sbpLaVD-*L+5kC&&Bp6hR%_i#Oe?aFzoofq~Uxj_i$ zeBI8Id!+e$AtkdUCRKocKDW6IEZsQ4wE+2CXf#+0da3j;V0-9dZG8Mt@FD0G(y8x^ zag(602bsPj_$u@O>9@i6p^r)5+!pyl-vQG8Dezb5CDNzCOidD8=5~xvdFeS*Q|R;A zlAkMO?8xyx!Q~W-fgj$U;L3nY(k9!Dfj$rlw{-TryUbJ0eVRGh{*s@F@Jn{1d0hS7 z{yF4RrP<%}H-9S-{|WNh2;KoZv)>B6F_eFXPJI5G?BB{?R^c~C#M^WH0SGUG_810U zS0Kj4bY}bDxh=@&XXQbj=XU;a+}O|z>$eF12y6vz1Nq(mj`3w(JLolO%eo%oKyes& zf5YVCl;_!oW{F9kBAnbK?i0TjzZH*)^>F^s{#2m<>hB|j|AKJxPw}ZW_zq>WzuIj> ze0&#{J25G(m|4sl5YMc^e3|hs%{b>uq{CV`bZ^XQs)7!4-x^>ioNqJ0#&~YMSbS4l zA22yzjxT-V5|g;^ja+lLC+F$Z8v~tuKH7d+d;Veb^vLHU{yB<0SB-O@z|Yj?nE!w? zQO=X#+~x@`dsm%j;5*R6r8j`Pp?{FRv0IG$3Azo)^K34du0?|TL^@Y@{9Xq1Eg<8Q zz+0ggOP>etf-cd6@yYf7r6%*J$$sMSfN}01#$8_LWqG7t;shWWfX%8D9J{ z;SDYm-do{gK|WWX4t53SgM6O3T;Z0FyVsAa7M}&WcU<$N?jYBj9uX&q3&b_zXX5vw zyU(Y~A>JU?7Tb#b#Zlr6@m29dald$8%+%NWFD=#=yNScZ+2Sg3yLeRmL(JaK`@2zW zD)tJ9->?N2qW?yMJa66yKY%_Uo&A37XM(N@GX5d(H|R0aE5R(S65J-~-@!7_`TBeN zZeT;`kLMLnpl#i| zs5=F{zIB}Y4crW-8-#s%tz+Gyhj|{vx)tE=xLCIyoRc}$?E>e4hZX*#cwS61*r&?^ za((ilBRqex=NX#3QLG8_de~HK3v%76huB}?kBU!<{{fzFoji_~ABy$WLRjY(n}}V+hs6oveDQ5@hj>hM!@R$2Vkxn< z*jDT#J}yodmx`Z=hsBFxuHoK)WwDjmR~#+AAig7R6_1K3p74GO1dMa3M#Z>C+xX{7 zLqX1KM}W5P$L|Be9y-{~$sFSfh-E?c+pS^?v5VLrWPc0>IS;b+$|s=NUz0%g)AQg6 z%w-pW=dz=thZ2^TgN0HR3k$8}YRGr+SY;wR$4N4@`p(m#n8#H>&I_#$Fy@n*4(cnJGASkKnd{l)R(eDPiJQ}K{^R!lw4 z=a)5La)154#o>8cVv?S#1?#@qMP! zh~I(xZ*t@9q>ulxaAHy|*q1|i9kFr13mC;^5!;Xv}@0nLDE|wQ-h|R@zVlVL_ak%)5 zI7fU*Tq3?JZV-2ghr|=&Y4Hy+eu6J&RHR;(`86`PA4#lGSYajZC3d`)bMv5@WZ zw)7|B0r8ahhnQxfx6dr*6HAKK#fIV?Vz+>Q?Z4~WCMNYqI5|WdB~BI>2mEWgQn2T9 zF!DXblUu|?;%@Q+7IqmX;rIB!>>~H+P;;Gu%%kuu%kW+kbbjd)VkNOwz`vGj zD8}v92*>s3(zw9mZv?{U&-3hvcwCn*?Gs`AnbwI(o3W3BOvJtqlKV%iC$NW8@ zbR)sv+ax#(H~&_i?TF`dEi2CfrMm!rn=v^b-bXP1G*f(jxj?3~@WRlHFE7>sS%34( zeJy8N`+cFeHo`tm+{P7GW>e6s=^yew*l$L>az!$<@u{l zer|5-;N0KB=kWZl3D>>(ofB&NzK*Sb{Ox(W>}^o@o zJu`bQ$nWa09Q=M7Y2Wp;@BUeSwyq!fetZX{m0R9cx}I1V(aae?jFSR zzQgv5Bq)94I&Q@JZE#)U^`#{2=e0{r;&-*l3evU2M&jU7jQ8XD)0zEzt2WZNKsgE5-N4t>QlM2a)p_=JSiRo8ff^u>`I!jL#umM7&YFO>8N46z>rS ziYI^ceuha`UgC8fag4%ei?4}m#U0`|;wdp^rZ4aD_A0k@0kN!jv)DjvBX$pn=P}^z zcO|$fAfKmf2YW%ElrA|7dtjj(fQ%ms&V_za`UvM#ngsXm zd_UgW_`eByAL1j!k0boLPJa(i`4ajsN_bg>k3zWlZ4CWxNJn0$%+A718@nL=exy$V zQ*};olR#c4=7QntvY$ub`P6K`-nS?X_A#c8bxQ-gShpH1+!@at!8|cIUcl0w{dv3u z_i0=Quh$vt7`QJaCoPBx$n|P!u2Yk<6uv-QF0KxkJkMK?-;e15`%MTZ>s;gciS(!9 z=i*o5VezQQeLzgleL_7{Uf$>NIeH(29})RHo%#gQ_350vj>7wMu4fhjvtS<`zhl7b zO#1PDefuoz`5d0*hw=RW4$1N{{!j6mh2CEd@P62HKf>Tp{#>tR zzP6rP5O(x)Jvbb8=I;jisVG(#Yl*xLv)uN+TwR2-Ud_apkk457y9iDJ+ai1xI1=ME z+Rb%@el9ikN#i{etjo9o9l7p_^W#pupN;rE;1ZDKUkOI~oBz4be~vf;{&vD{Jjne6 zlf~)c9Fg~Jh`)6Ia{}Qz(NBDTo}?W~JNUa~cN*b;!hhLR!S(S{IN!TV(FOgF^?Ne) zBY2MnjD6X2R6L1&sE_)7viXb6QzA8=pYS@I2kF_brNycs`{`DY>*Y;Au9vq5Y2Q`k z{-(@bGP-`ydAekCOTc1XlIy|yy+J77CWMo_#BT!PH|0P+@BJ0z^W_U5pF5_0#WR;! zLaZUS5W9*uFGhcNNpS5zj+c|AS4f|bPWP&hZw9^z`##dogFB!%OJDaI-p7Z&38cR# zz*Ki*-A6jb66`a8E(9iz&v+jk`j)%#zCYLy@rRaTJrc}_`7*~{o9A9YILEKQ&Uf*C zn!*b%WBvbbZ|UtlvfE&{8|zH%K%O7|{phmp5$GA2%eo-}@or-fkL!#$5o9|*v7F_| z=$;0@MY;X{IGiicjDHj48tOLiZs^P_Jlh6L?&n{j^L0&3IxlkFnwsm>J)F%9{2BJ8ZjG) z_y1gdFl9HZXN>CtT@A-mKQK!Hd@!4~xGk{Ms`Z1+dmCG^L|`U-t*VR;vf0 zKlt>1-4WM!=wjIK_aXX?e$Q;ccPkRS{iDb?>yOx{^c1d3>tftW@F(c$qka4c#7})2 z`QkcX;6s1>vVIJI0h-5E%T4&c<2Y}>0^wyh`S2qreSQT_dDdIw!@EKAJfI)iFM|F0 zN!Ult`hepQzZIOLbjBKs{XPgwXZ}n#!|}-Wy#r)D8U7mdTKMODg5}&j9q)mi#atdd zfOeyO6=;S>rnCGypuJiYh;#RVynf#gviw6pUcc$LzzpoS-t6ml_*cF^i2WEK%hB_& zpAWE|AAbSQ70&tao4`MzV?Kf3f=K_dC(HdD%2gQWXR3L=9xp;ayv3Jy$=kj^nD5G$ zll$i&;!i>|J?>_vOg|{(|uQ;BR0Vg|}Gi=WErVOE*sT^B8o?SCaiqgKh&&|5dOr zD@`cft4Q|&^rvXw>^M&*Ekb=kwv&~E9E0+d(D6L-4_wce`s404a6EK<@Hvp}^|ol~ zjI3|1Wyt4Gtm`jFJ;2Fe4dl=MD1q~5U%_St9R5b6YJ#g<8;pi+r0TNi?>;vI}&q3`k6ov zcW0p|yL9f^VvL99&dyDP-Y16f9`x~#5`^iJrFF1y<){WJ6ym(zV+lIe%LY+W!Lce!1gQr=%7 z=r3Fz_lk5G=xEEd3tzPU!m5 zUj*@`T{G$9L40Y~S^6UMwJ|ri`=!%$r7q)!O6P*k9CM?aC|xwrW!>}A<)L%Llyi%v zYX3HkI zr+)!@l&k9M2YQ5i9lBUdRhOdz<43r4(B)%lx|&|6Itg7frj{Ed9ovoiR<~5T9CVAA z+uZlkO#@xq6{r~aOZ7N(*O)r4jr5d2*L4%5H$gubQ_pRZJ`(8q_|&^kU#dIG8`Hp5 zk!~I6hOVFVeCQc5jod=%ErD+AzLw6}1Ls3b6PKg1_jgO6o4RJwPeQMWx!sMDUKr?R z?mg*~(A#60yK~Z6?xAksZmi<{wT3YmhXT#|Hk=o~5TbgQHj1Krl0k{$_NB1Jn_>?ZH;xj?sfouqd{S5I-5 zdsh1AKzDH4rOWlg*L+fRbg8PTK7sD!YD!NJbZ30s)5pIP=q~tLqu1x5JEgeWeJ`D( zH+5H6pt_H52HihJH`hkGcc8nw3DOIppGeWeZIb>t&}fvKgY>R$ALk~e=;` z#c-FWPLSSZ?TcSQg6=1s06oe*=~CA9@ui?+W1n=tNb@a?@-ZXv$jir5r;Z)v)(3j3 zs|}qYcC`CG&_i8g=$*LY6>jD2yFs5y@w6)|Jy^P?^f>79F;BaDq@NG;I5$E1b?B_I zLBV_1as z#4wsn`Xy_ z_uO+IHVVB`%3$9D?y5X56^x_!RB&%)wN!=sStO-=FH5sVyyyhstb@)E&L}Ujx69AL zRi8#_O|#zxd(>B&y#s8i>)3AnYt3<|zLolVvz__`bwjhM{tc;)<`?`h*SUQwB<&U_ zh5F4^E2K2RPpey`p@N@PE2Vn{m#ZI0&k24_{aD&1_-*xbDgM@I|Buvfq~U@;S9eQG z1plP&m%bGIi+Wh{-4?Asq5dXaB>1d)LK-7j^`4aG3qGs_Uic_+uO!MIQUkv$%qBl%?KJks5-pw}lWxlwoXT5>8`--h)ua&IC2v>GE{F8Bg( zoP3wyFx+FOp640o`O)+I#Cd-DJU@G$CHNOT{(>@@j=!+fw%N|{bB8x-I(`y4?jC>b zoAaIHFD!LzHq}Q>^_|YE@7$bE^~ueq`lzWs<-GcC&G}T{z1dVBHP!b#uRg6gpXx)+ zruwL&gT(&aG|B=}b>-8K_` zUEg=HJOjNb`0y6^zX=26GBoW!oUh4GzPi{RE;rd%hugEm4wBDkwI zQg+T0VZPEj$Zw^Nl4r6vqOX=~*>9mo%g%YBlm8BQpYIwuRdAzkjJ!~Ans%*xknMcR zvC(&(timaZQ}4KscD>vWT`bjsgK~~MiTxcoEak|xX!rKbk(1#(3_dR@_k9E&Z?qhF zIJ!h12cDpfl^3!L&^O6@IR9DjH0@^j49Ba%4{PJ(OgIm7Zm;jqx5!J-)v`QWk``&V z$`u^%3SOq&2A3cx|6+8mJPKVcPXw>i#>@E}UkZK$z7n;Cy&gSLR^dF!ng4$9$J!)0 z8C{~cE`ndl)h5f%d6_ex-ss!qO3oh--ml#u@8S4-@L?@aPKEOzC;tWXopK?%TCM}1 z)$Wp)aQqBd)$f+~vRggsIA2bK^BiYBL%~7)9(feHM86N*QNLGS#-59wA~$gU+u)1z z0$GLg250<3;7j!TZ0sTq2Y6iu>M9-Hi;BnP?{5%9M^evG4!{egkGw4Nf9Nh05$Cfzp z#q#i3%^MDGv(e+sT6t&~&Q zZ)5*TxwnviuTd#q!SUa*|9kRiwg<*7H{O$P5c1c8^EuuI;**Rjxlo9|4W7gCOCdhR zzfFFUeHG?!lNSs5_Zr*eS2(^3;ya8F<&EsMSpT8?Hv291Hg+}m3&`KW{uW#h{*vwN z;}rjg@^@t1pIs0S%%lCI<8O!DnoZ;FkUOwxyd821o5tHAhuGbq?-^rI*jYY`?KT0bHPK{9XX!K?gL&3@iFWn;HBUk_DFD(XQ!OY9t(~@Jdgb# z_yuqQ8TY3i_G2D;yL>JDw_f^IE_~Wq|91Ii@OS1eIYQ?1*WGf=VvINYf%E+Ec`hS! z|K0NbCAhyhepvcm{)McEpOT~ttncMN*o(pa!2hsUf-|f=va%HG^;f}7o;`958T<8v zct4K63GpG;5AtyKd*Dp#M|mOp8*rAjS6;#X5qvXv9a%bz`FrJ4>|epP`hK~8DUL6l z0N-vMkgp))__cb2T!7v#pIHdcf7Z`(oe)1@9g-(KL;Ghea^`&dd? zKdfKmUdy8URjVJ7(*?J(kIGk&rRO0(C?At^(c2{&|CqdRd9?n3)g)&=CyxJz92X(e z_eySsv9jzrF67th9*?pzI^P49;)x^cKSF+I z+w1AdJ_=3+4`dr~++Se(JkGCWInO_B!TrFwbB<%!3V5>=Oe+jdW>hM-~(1mPov;kJ=Swt@Bu5%V?Iyw9fI?3?TKS&gl~of`8TWXRw~T?e3m2=o0-m@Kn2pC&Gp&3vf?QBj+cBOYAg{zS^lT(KEsG z?OvX2_D$%Jrwm;!hrz4t3p`aEe-FII?(MN&p!)C7eLOknYT1Ctxk~#&&vcIW1%GH? zlOqaqYA{ zz|;3dn$IBgC7#*nYIzFS4h-~^aeNgxE|B3l%HE2;)YJbZn$Hn%YG9Bj2VJ7KfyccI z0)su}?B3`ho+kDt@VLNG&nYtAzD3ed&yZJeK2jybCj>6@tYdEnAJ8xNWUi&S<9h;E zdMaNf?*Ts?xXP2Uj(h~XC~%FZo-M=U>dHX2XV+^Kj|IOJxZabwo}3Kc7#Qo>!_EM2 z4UF>?zfN)I*T_E!6z%e;A+QStxj8;66{Jg5r;2exWCAGkG4kR)4?~e2csiJE~SeoG}Vb`!1qKl-j!6ySVJdv%G|1ai!x8z`%yp8;ssBx;Gz~Uc@_$u z-{KX|ZB>-t1L{||*yx!lczugEJyq;WAYR#Gt4IHU@<)Pqws_yu|3mT};GbJmdv0U@ z4}7%6N1g(~CtGayWPC*V^B}Iq)Ob?2lV1k6i22l$`Z0MM#=r2y)sVjjC&ql`*~LB! zPL0{=d36WH3`)UvH| z23;i01Dh=qmHt0C^^2r(aO;*GlxlRTv>x2CWhW)S!HE}1+rT|qc2?#cBJThnlaiIj z!{ndA7q;xC)c!&~i}5t2{8w^YIPW?pU7+MPIWCqi1sD1*RLa>mqx&iqe^LBFbh^_2 zG;LzMpiIdS)T<}k%k^!*0c^nSyf zmX~vUyX;&qf3oG3&8F++BhRZJ)f{)Ow?ETzbhDlMRV}Y=Hr3~xS3kBn?$p2D^5$kc z^_yFcYc|#2c3ypMbDYMX&}F#Z7ruX+o}Ju18J|D@g8Zc%r|}+BRtWK0{V`=7$DP+lty`5S6+-;y7A4Au9RCLTFP0ux zK4t%i<3Fx^E#$-XK;8+L;U`8>K7>wu{YxQi?4@J7`~K1^FIX+%8QkaYk)mE#N&g>fSM(}0qZ!x}F$z~tM_-dt)-FlVt`uzoE zCc6u}n0+yLivI;=9vSy%ORE=@a={<8dQoZX#ra61A^-DMYm`*M-?w^2X=L97@z-0f zRd#8Vp9dady{a^_@5lH$rAenay!sHf)gaFUUnFl(YHYOb z++Pm0+NdNl>KpNoNrkAND0PAy$9k;5*%-rhr;WC1F_qcNIS=+QYN?& zybRw`E|JE7n_@p!dM9DMlm|W;yF+=Y6V~JPgkP;4%6sU8c)jCH>?cYM$LamjPnERJ zluxhsK2@&hisR`sp`Q}>sWOQjMt`P+$xN&)+^SK#$S z+yP}KyA=EsxQx94yfm&sd7WJaehys6t^==*`&sFI0gZQnJ%`N4-_OcC!6PBR5Z~f= z*K_(X^heafg(77mCMEqjC`KzCYinGzlIV*Qk`^M*`gbzbJ8iaelmC zzbMPl)c=FHUzEQ6#QsN=Vm2MWN0h_p65Y9feG+#>Il(So3!g^>pJmSn2j!zmAf5JO z8M`x?_v5J2L-5GBqe>o`Z{K4|giW{aF=Y>$=KF2jF(q`dIN#rttI_U${H7F>rEB1I z^>1;%DZ&1<{)ym|u}#W!^c?*vcwOy_Z&IFR-vBniZ?Y$1{CDMB_B|N?UHJoDqCW_3 z5&wr0Gl14R8ypAj#-0nVH;yZpvzLNfsmGOZ>{S>)q0C^vhVc{1BKF%D|5Mq({s`lL zDmCmcG5(iwi2Vb`|5E;AAIA7erNbpOzrQekQb}hka2=uEIHlyUEpRLKlyW~i9^5wm zw6dJt0h|Q>g53?=E&gxi6uS?&7r5s@8gC#tDF36}z#ajP1utZe#rPRzD?1P4XO!dY z2f=;g&nm$T>Q@531U#C(6gpcesnyI zj+fQy!H(VQajLp*2$_z5RV^8c<72;CT~#Xt4~_S#?_L&-PmA}dd&pA%^>Dru?^n}? zVO$!9Hq=RMI=)S{3QhBQEZ$UehCBI1(n!dk7H_H9nN&}Ye=XF4F^=8&wot3tG~X6# zP8QW)5B2loTc|VHlfg^kV^rs_K{)-Vfy?6K)Irxec3)4$t7Fja<8QpGU+2W#$CCtg z37h7hpbpP=;xzx4;uBQ!dd%19{5Yt_qUY#u!+5oNP=#dpx80`K2W`|u%IC+2Hfplq z_3>@oeD6n4AC}rRyA~Xj+o_ib`A+;^!RzDOspaVH66Lp7)tjC9ZI`HDdo>0=k^wwEK9{UQHCdKEA!0B6xRvN3|bWGU2*eV|aZPMbf*_-^nkV=;XuqL%^1rs#=q%{wJJIcQuc!{|wjhR<-V-ma&h6Uj^^td>O9m z1?8S<%gI=;w*+r)-BWGDPU3hcb_iSv@$T%)z*GD^)jsU2IX{Dp>(>){s)uiP`n%s( z38|;h+vQ`h-dH)L=G{T_pY|p=;R3bqo#a{Iu+&?Pu;+v8!O3?~e7Tb^_febJ<(Pk= zntwON*RmVg8^OVZ3)P%_if;!eCG=A(?;(E)?v{|QuDjRq9BD83!h}oI+9?!o0*9r6 z>bwHS?)wD;)eqQoemGFAW7GQq16AohC%+WW7Y8I{s3~mcd~ra+Ahj>LTB74=h+0$V zfb<5Qq$Nq=-bt7_FiVGvsENxd-+srL zUsxT@?u33qoyP8mo~N#1k3v7C?q=VDUZ`5nQopI_r`191$I(kv=T~!_^)5%3s@W0p zdh{}NCc6gxtm^#wjFZ0)9Z_r9f1_8bC)hES&iu>N#1)j^1-)7w&b}C3uI96^M8Bl2 zWZ#Hhqt>wt&}-FG?8ngS)E+CT|1$J?^%nM8^agb{dn42>qTq>IKTrL|3Ux%E=SaAE=e=LUgs- zzcY#q5X`0a#xwfZ%x?*rbJ@GU;SMz0Tl$ENGUA18d@Z0GvuX9+(v+qpja zZNfgaaii0Z9`A~z{i?bNEnN-$4<{T@!|a>ErxFgT`WsGsj&wKJ7i?6WUmw8pE%2~} zBWfj@`XvUBs$U5%l8&j;o6-Im!Qa$Ew$nc&_`BMOrv69tyq?<91olv?E+530A2 z-50zn==EM%>ExG68Q@ofK5sVra`48W=6#rb9e7Jn_ZG7!f~$glZ`Hd_{UT`!_>-XN zU9ycl3tS(xy%2+Ryq}5QdFX@kACTX-Jx>QQv2H*c_ljMCG z?cTo0-e=M7^KY_u4d-V;{-8F=-ek!G{Y$0s;2YYcdB?CH0Oz&o<6VYcBssU&v^M?V z8z)ZwBI$967qz+A+rVCg?(ZF^P<#dW@iqf+{n7i|KsMdq=C`@D+0OlKNt;2zZabKH49`fHlwPW?M=vYPGG?`U&cs~&0VQGT*6T$1_CwS{ApI={0^6q5Q>yJs^J?K)Y`U7~pXfw&X(C_S@ zd;3lHE<4ZL1W#-|*}GS;ukG#LGidjC$@69#PCs&|wt3zyWGV6?T(4`J@69uv_#EkF za9Aqv7NU!!3h=Om0^AQcfAoF=?%wu3Z<^)g7fE}-A#gQ%j`Rz7K-;Na$;SChe}J!O zTj;GO>;Hh8JcZuG0LFE@nmmBriG2fm0C)`4-_O1Ud;@q9y9o0i@UCaC1_$H^yuYB` z*9X(QY71w)YJPn%&0B@0{hiqMLGKTO^V`nw{!RIkv)-v~XL{pfoO<{EGt+wkx)j&< zFvJI$-mt>z8?2Z7v1)8FMPxc_P0c$ z$IGy{maJb2`Agb{y=pwIFB?7Ao5B7cxUB6H-a>X5{iOF5GS252X`c5D!LPQR@BM}> z{SNs7d4YGY;EJ{jy~A76e4O}uZ5Mm@vYp4b%=l98S;5=eKI2VHpnNC(W!q=H1KAdQ zZXztL@Qy(jNwMJP+pO@Gv3r8wX|u}Pz#azP-S$NphxAt_5ee`_3B-QT_^wcMBiH8 zpZn1rd=>1u;G#B3z9zJLyms={Qk=if2tQMV z*sofC6~?(7C-z^c~>r#GbxM>^k|j~HgG%-{C(mjzBBBH z&;xy$gK0i1z`rGC`0~*3djsIV5-;^tuxrtS;Lk=<{_kL;{a{}bx+s$6~zLH~boMKDxvg97BEt9ropBk(Z*M@b$gcv3osqp6`nDoO7PIk7f5CD3e$;&5x9qbJy~%bpAUw2n)Bc|v|m@T_z4OMNBmw;{hz$5P)@ zLjFK-ImZv;{FeFF3Gr(?F7s8QOQoxJ!u_Y?a$nr_&U)SR>*YS{7F<8RKlcR0%Wri| z?9KT;>#FM{mfl(eW2qC zUmd$0_`QxReVG#|-W&W$$LD?3?90HrI+mUH`~g3=2LGJrOXvCQP{;CSJI^1#cYLYY z^!%~b*FO*EuUp?auYX?k<&ydF>{VatofwxoKs+q1^QGNIPGOI_+i{UJ1l%TRoo``2 z#cu_7N?PwrzL(8qPU@fqM+eXFnLK8imD4omO&lJ6(401r!e$Cvg1c@y~3 zq)J~Ex>%|K7y91yZJ6f7i>3YO_kF1|$bX`@`K*Vj-nSdhmy6yBybB zB;9!we#I?kyYB|}1K{aBYJ5vD-+lhB@kP+p@|{qBZ&Hn~lH&T~;0Ka+`1D!McqMu% z`V(I^x>~LP&rSN&SIF@?@WP~8UlsdD^k+Wn5vRUd{tsN9^tmq$U7~mS9|k*+_TdUzG{vi0$pMVyA%bi`nbDhn)`I z=-=mifPFbQ+;*RD7MtGx+wUu3XG6Tnv){LvJ&|2T=KI5b-<^-)e56K*pGr93D-?V< z;b&hl`!vQIeT&)FkIwbcUwo_CozX{q6>NIH?wBvRg!((q>-3v%INN#uaB8RDeR+as zb^6O!9j5$CpkG+}+m|+%Jd|C>z6Sh6r@wvUo}jpM|9!gC8DD|m<(fQEq-$1rdH2RMcdl+#gyM4-9k$&C0_$RqPNukVBe1M zI8A+q;GaF5QtwfoptVf;cZj4qY#1YgwoA}#+} zTp#ueOBZW7tH=*Rd|>B`wRP;Z;9;EyXmKx6`~&bYX`nXgWyht`F7VZz2Wj)z4eWc? zIB|M>T?6rl1;5pKhz3F7`om>xdVagGmDI zYTj3Hz4|n$56U-cHoFKM3vNvgewgdrzjCxRj#K}!THkZxW3^%D#Bb6@vX?@?!<}!^ zt`qWq1K)X0e4KV4doAQImd0uS6Y`gL8mBGb_$LtG=)YBaMu>;o-m1OCahl(4+WK?i zw`o-zpWfi~&(+e_()vr-%h>e&@m%f1s}x_%@xALDZ|Bbk=4$$S$8`P`=#r}yY`}cl zFKN71Oy>OY+Nh1u{MKE@Yn?V>zCPz?Xa6T?eb`IDvEXd>ix{7%O=fSv_(W|k`yGr= z(w4J7!}uhvlKm6LCu_CrV;G;T{l-3v@!Pfk*w#U3{M)tUH*kJD|2s6bB0B#LUGC7D z(C+6k^R&V@qw$n3d78S}agjb2`Yo33)GT%$xE>sjhVv80#$8%__F8aIzDw)MejDrW z(t5GCfv5QI()y8cze8Q_(sIzHQVqn@yX0%T(2Jz6!5Lld(N41WfQNRuSCigy=C?@t z8RJv5OVK4d-TnpIua^q6(d@I}pnRW}!}cF?_Uk_FAUhu1&AiF63!v${N}<+J|)ho$M-lJ}f=siZc-_YJyC*M_`LZVjH- z<$u}+bdl5bH>xfme5VSR3^L`D*aGE{|yaKP2aX-|F(H z7G{q}7i)So#ixU}bt%y{upb4-#fP;z!Jl-Qs}0=l@EtsM}&K7O_KtKfR6Tstecee#Q1mrtGbxu5@gS<7J4_3M|lh3FFLLfEgx z(#zT&b_RH9mzT9&wN8Dhlnw5gyhaOuhx;Yn0`8mqinfb=JNVM%SGE4TDSjXL%H-Fy z4d@c-_9Jk<*zt93$zCU3A{BrOlV8`$ekRWZKa{*d8~iJpAAdJ!nPjftpzUQ-{RZuU zV`BbBZ8n+nH)`r{;&>aiIb`m?Nt?%Un%^d^_MH4p+TZ8ozoDs3)Q|Gt&>DXi`@f-W zJ}%CuLaQS4d@8iuKgIkC&3{tNe^ZMibN-uJm`&?_Q)_cd%-^gflR1C0R()FRzgfHO zA2I(eEf4M9-`>*3!qM)YFNLMIv`J|9`qW!mgAfnMZ^191VZLMK@2WNHNrZsZ>UvN&>5464-&PR_u?)XD(Ho98A7@Xg=S}WuDZQ%R6exw~` z{|~)g>#x&%Hh>@R`mvUShQ}lDQ(bGca`u1d9awXx{;BJi zS}l7n`YSDH()=sI$Gd*5^+%WJzkvVlTCWwe<-Z(%qt%h|{!k?C)TY}wzU2J=b*=ub zwwIj-`QDUWT6Tcq!@+@+@3nfi6K|XHllD*xijM<_+aA=`#YEjL<&ZY1CHX#x_fGjm z+ryp(?w@j0TiA-?k7E3|c8dK3_==Q2wS4$X^3LN&DaKD}_3X9aF)4p*wQ&^R0v@08 zuQo28T!U8hqwKH2`6;@d-OlyQ^234^wDQ0Qal5^E2XbKroH20X*3vq zzf#ZXK)xM4K;P1l{4n^4K2T3gCO?buLHdTSdP{={xM`ULhO zsJ|0@7dwLE=jc<}>)A8d?}Fj?CiO?jIG-s{{}#t-yj%76&#Avv|CmkdyH)>!-Rf`W zdeg1?x9mjllihCBeGULjK#`ChCb~%>NL4;W_z}^-I{3ApiSr zll9Bk^m+Hm`Us)^5XA2|r#?@g!VW`y%hWvmL3SxPDCg;q2=#3s9yzD}ZoQnn9r8n| zckAnf{J!81&dI+=|AhS?t?l(1Sg3|D^|^|FYDF^zrOD=!f-X=pyN9a6#%L zx|Bw@7yaH9T*o2fe8TWLs;A(9T%?a6ORJ%NUFxIyIQCZXo2kWm4f}oYw$#V;{=H~E zj=xMT(bup)2JcIKT;I(88hj`XUk6i012jU-r+`d3q1F z^L^Q0Q|Ig1WXbs}?_p_yUdKKTK9jmYZ$QKMm;Z&&BXnP&s~1qe>EOQI7wTi!3(<@8 z2)bJS5S-clX}yx;zk;vnzF60LQ@!Uu$4m5VbhX?AJhA&yy^!Oh!FP2p)vMUK=x21R zk5gYQ&jruwzD!R;m*}s8AM3tcpU(aW{j6Ti-VYAS&*}B#;D@=+t0M4)I3H<}1bCLhrI**bBpJ7 z>0*jIKH8#8PwG$p2IH&r;ewC0SgnT#Q2Zd~zo5^&gnRJx_>e*~d zmZd8226h6tw)@Nagh7;_0^ZgA6@8)L{oP;H9~eyWUJ(De#U{O2aIOA^UWbO)mk@{F zN7rkIIQd1AGr!~AEA+ad@xN&u+d|)9v(sQ z#Tb7}KRS~9BDiIbxAcrr&d(`O#>=EGQJ-*cY@_wCdg5yE|O7DM*GavW$ z!`FKLZI0d73t#Jd(eCTjul2_B;{9@+{Am2r^L#m3{}{#(%3teO3-MU+IF8fzA?x)? zLcCV5*Y6h`mcGHq^V!m(+%Bpt{nR7sbo9>V_*Lj{o9+B=!l53!nmr!lyPJJ4`uk?j zLGNkyGV~A4ehvL&v$ui|_4ujTJ21Yl*}KsD^_jSyQvCc`Q;!3B1b-rhe7eWa`Wkji zFWet`9@M3Y&ivgx2JAym+JfhFMo7@k4LC<6Qw0p$cqe;ID?cTmk`Yg12 z`!?yXlKJy)P5S!t>Ng8sAK#=`3BID|ANuw8I^((5BaZ8NY`PwCT<G=j(t!4ZreOBGL183x5@R zoe%z+Vb2(UMl#L^-U)}l=GC*Me~aMyo~``7yHcE<-(&rQ*!27!=O2ZhgTH_IYihiI z9-E%u6a00QkH3fUXKK(Nm*VuBqto+y8-F&sME_Zn;rzRue*(wPf&+3p|9uqa{Ymsc zd!E;y=WXZtoAdmG;H%OS{c1O7KGpIM@H-z9(vtki=o0-u@SSO$`~~b7zvIsSO3ohu zemJd*e-FoR0T-tw`%_bKzw{~SuKq%FwfrpRr}&p}yb9yp{CnA7qf`B9-Dy6u0e|Z( zt-F5|x-e;IoSx~IQ^^9#Xmq^0@Q9yI<-;H_!B{A1YfqeK1(na?jS@Q2bc zU+QDZQbSsA|4_ldr}g#c2$p*d@CQSbKM3+;dkyvnFCbq7PU>~JKetcR7xfzDf1EuT z;$i6;{}S{ZX*zgNuWS5u9Df>od9N}4m$$DZdQz zAMACjf8oVs=kpnzl5+j={iB}U>kfaa;JLl-^bZugv{%0W8unJ`SF0EJbJ268&%mpD z-RD0u!0A^cHGn%M75aCh-XH*C2{_2Uqr* z<&PWexL6ttF7(az7Yrp|hkn#A4JY4;F81fMA4iw?&#<3GhyC*|r~Eh2Pxv#hB!7;c z=dZeo+<<<{4}(k5?~g2G)9dN|y`FBi^ZMjyuO-dq>&@rYFK>=JuWxGg=bG)*|J^In zY^s0Wzi@;zpAvl({7#NPROVks#^bXE_+^eygm_|TmH%}iKB(6!|9c!?0`bMtYX5e2 zIs0=V|Ey=Vzk%bwL41n8+<%n)54g!w?mxkHK9BGCj8MP2SGhlNq%+?|Qp*7RmCn%1 z{wDTdaG%gC{!^nUej|8DXubc$)#UN$H~iV7$@hS-32pJ8Vn2+2#~-Hm;*Z@yr zXMy4T%6~umRxq4j`4^J8f4%>Aj=zlg-}oi?3UT!O?Hj)?xL*3kpGd~KJ0ku(mxHMAFxS2$nb@24Gbjo(j; zgrZ(s1;2+F`q_WsEl$1r{h&ks4D@#Wd5AZ84*92}-Tge|ZxS2{9rDNB>eO$?`8EU( z`zz3tpOyZrf0qz%3O4yi-A4J&_$Ome_|tO9o4{v-C;TJGJpKv))o6G86aMQ3M?xq3 zd0g*&|1J{x%U{c;^_}wXCv(5Q{Rf45_`Ht)nBYk0Z@)A?x}HerjK7IZ{r>g$o`7-g zCmCbV?))TUgWyO=GU_Rx_s3%-Pju?t{qY%@XxhJ~px?-4)Bf0oG)dea+vq^%@ol3s z+8y6EdI*k$Y$Jo~X@6Q6wQO2XOT(Hht|!(QgLeDH8e0TMLb1jk%IEdO8{yl<^|Ue8 zq22W)8fkaX{AoQ&Mp~Y@o+P8@PI3Gs<0#r4Kgl>DI1)-S)Vrvj*3;Qo#-{Zo8;N&| z{Zfo1wA(MmNEI9jr5ODwAJ-EJr5c57>es`VN9O%bGs=Yeu#{$;5*!Jo8HxGP`85PX zMmCzp&q}}0m@dSdg8htQHto*HaXlNG0?51B^_xyPg5Y7QvCw0Aml=JNwfR z9B8E7>-2NSA8d?4ySL9}Mjo5SzrxU`h~r;jq>y?1D~uj!cl;}i3k63)R~W;&o^GE^ zBj$eUNBcR#C@e&Czfndx+U+;Wh>#~Pc_?)YPk_XI~mV~sklr}f-y^nXxX&n-qVnfu*lyo`4H-DbQl zI1;+esN#C+H{OVwF7}&fj3aZu$wnF4?Kj!b|0nLxWFrmj?#~^@E+L+kez$Q(h&KiA zHD=C;j(0M4sxk8+G97PIjrfPrJpNRp4cZ-ls?kYsBsA6NOZj~NDKv`NbbC)THjugB zbmNdv51+puEjn zjm$@>AFXGBv4qV178%RXZofrFnczrhk+Fg6so!GbD4Y5%HPkuc{ybw`f_D2oV_YUU z5_-nSrhLBrmK(i`#rZvF)RTFBD~#mFoVeR>g;6dz5?W!@pxxu~d84=_nxB>ag0Tke zKK{I9^nW}$-pSatMs}D?`@PmMorwBI|78_2vrJB*vq?)W>534$Y`9Y!J7)Bb#FRI_P+J~Nug-0uq`?&;|K z!tfV<5(P&>Ul?gV2CHwAw*VwOh7I~lv*sAbds>^FWP^Z5IXV`z8${l;H{Bcc6i3Hgw=6o}Na(1sm(2Z+8F|a2`w^Co8Ak<2 zLdT4lXQT6L2sRlDpNr;arJpb=(C+bb($H5#$2%GOkFjednfB)&nE=kGP|JNes`HY1xG@6nHgM9`;%`@XH&m>&4py{S725M_3-;HW~JarsKBh{ zdg?dTocF#szd|#nN?h+Wa|qg<-!yZJ;7Dkixrg#`y$!+XX8&zYJ>_Sm&osxO-Ti*V zoXw{Fo?~WwK;zSX&oOTz^Lpl(x1!zg=a{z(j)dlz)4873^O#w~ru})`JVEAubIss~ z(fNhpFV-aqj)dl#z0ovZIKMXws%d`IZ@#I2gywz=%$aC+ehW->d$fNfw7^V7yT{`q zbJWMtcvkvSvjFYx&oVQwCOY29*ofJ2Y^7(jN zX)a{bddkd~$=q+X`KnMKmR6f@2#$nSo7G%T`(18IpGD^z3B6=1qblq4j1y<@0(sn00Jg?6bH9(xT(sNoV>3^1B=oU4o$G18 zcbE-q+MiF&Av?wSeP$M*-F}~$je;Yg&rIuEnvc`3A^3%vho=0j^smi%LcA%s)7-#z z#yc6i+sxlZ^|U{`%_qpbp55kCXm|YGW~tyvXt%kB>uEiE%u{Sy&yQyEcj9{XnyF~F z-(It~;7Dk%IfU|gzxSIn+0?JWTtepg9W<+j`ml7+?7iC=kNQVK2hD7>d;Bz-8-#dP z`cbo9h&Kg)Gf%N;e~z0K-;4Wm-295n;~zJ7qTTfzH-8iy2^}|^xSsasPcv-~^`rHi zG>4P9-)VCd+UuEg! zt9OIAo)~K!nftY}7NgyMt*qw+M?$TvbzD#V;;h*R#eS`=szYe*7qpttZoi;4uF;9R z`xCTgquu>!YwZ!@S?L`t=`i(o#%l_8vXa@fKV7Z8Y}%i$*1u#PzpLf>B|2VM>S`H+ zBcZNVBAUjJgt}SzY&w3rTg%AYucs9e>cdh`t6Xp-)YGcqdfJ~}Ruh~0U0~@)#Qo`G z^+&t=)5j_o90~QYYA7G?uMNSAtmLE7^<<@AY-OTp{!PJ4tb8`@&mb%HSK2??pF!3Y zWM0o8YXsUIe~@*p;7DkYHHqtKJwvPtHm&C}YcHAm4YwME`mi+IIx0948g8B8dg^zD zHR>46kNRa=)5+X#gtZ3k&ToX3^jmcOkx(Qdz6tUSSy z&@I+mkE`~qvYU^pMQj#559-%PbqPg6g-y$h|uWbQZ3 z8iscJO|wP{hVyZ29M{wSOt+S?soxB11DX5HwCaWWur$-!BRCS8X&vQy>Nm@Z`A3}J zY^$2g{T{VWpxyaBYUQ7C^2w3Vqt-&SyWhpuQ6Zj{9=2l6Qh#T>rr?uSUpDRc0;`El z`@O&l{EPWK{sOBN+8uv^)mAW^k6US!&-=Z|n#rd9S!}H#bHAn5I-x!+Eww5HM?y=j zYObgKdB)24Pu!p7RvwxAJ!fq}yYqX_>MwbP{dvwBhj#a8g#|yE+Z@kIUu9*W-Q%&` zs%6vutg#wBPX2a@_GgW?QbqIlYpm61cl!p5M ztaW7Wx7FH%cIUU%%G8{EGF*?h^3m>oS6VefJS)A*Ix57Qf*)EjdUU*#u^(HtY})US ztzXDI{>Roav^)OC)?b3*eB9Fg)Q{G)!^&aPdOo#^$=vTVD~xvgeP%5b4Cmuk8P`+4 zFRVRm>i4B}g3SHCwvvtLeuSm3t%%@A=xeJA?e5PvR-zfr&r1K!8iIC@$3500wlm(z z*u7SgMeC#e*=r3V^Z0wM%h2w6_F5wZ!}+*1j_YYX`>kbcT2F(ufz165T7L`ma6WE% z@F$(!+xwsuho!=Vg62p4ezAJDM03BRRxa9|-%+bpFkFwfnkXNS?}p$pYZU$@ zH05Wd|6vuN-TnE~TEeFNIc<%J75C?~buXF6KW$A#yW^j>W(bD!acdse)BgNp?P1e; z&RTk$xSszk6Yci<&x#cc*W;~Z%IEv5Y=_y@PqE9$JU_2pFVu%6uRSE*8ISr$LSB0k z+C6?WTg9KqcK64$Q_=4J1ndZ#_NSFSJ3-u^R`!{oxSm$F)FwJ!SZZbKg5iAJ4x-)L zJI=0V(|TIlX>G-RL3z<91v}TE8=Y zI3Kr{uxWn=*-Mhd{TXEU>MX8jklhFEu4j-vKroz-+oLF-*E7V9uxUM)*)?Qd&v5%c zp&ri1ZLN#Ap5b;7?H)f@*rSqZe$+41p43&G-w1mN+MVABTS^i8jj)r^?*5FjXA5yS zAGgbeIGm5$HEi0S8|~t5G(J6^-e|8T^LlQyUqZX%-)OHF4Cmu^71z`8GuDnt71wjK zok8Y)x7b6_ZogaXOu=wIZs%}4^}Eep!lwNhZ?7YBzlru9p*}24v@^Sl`!mtbN4xto z*{%`da6WDy72-|7d^@H`bp9t}3+!4p?N5RI3z^3+u#chL^%U5D35N4=TklEzXgyQy z95$_|&@Lu(ziDQ@`o9o)(>NBs9a$CUd`;b}`!RH`8ts4Cmu^ zT(9W-8iKRz0yO1kr9Wyf5#mk3$LuX^I)3Kbg(0e^{h4b&P3H0E+NEfB{JHi@!Ek-t z-oW*=o+oYT0&zX_?KCp?TVVG_yZsi}{RPAMxSh%M)NhfU+*|Co*q%h@eoO6QwA*i~ z-6$B&$8D>RxIfR>h2s9Kwr?Qw_^a)k(C+xF?FoY6 z`nX-l^|YRHd)!6hdS0^Y$lPy@-Gp}gt+8|aI{9QcAGeFq?)_n{T`$D5(%0Lkgm_bM zqaD*PI^N0HH|-5-SOYFcMFb$-n5T$J+0?0J3BqvKN5P|E+ccl zckDW}+wUDa<6?0=@7TF$cRlagl|no#eVe^kh&KhRZMA=Nypyptb`_h}Q)B-~=J9Ln z{b+am8v7T)kx-3&hU;lPpV<8eMEgfVwe}b?_xs$wAMN)0+_H-ehmA>1K2=S)i4|WBcj^BNDb_R`4 z`?Jq3B=h+D>}6{1YA9`Sa^P+j|CMf9`k4P8;Ib?RUs7 z6AYgpx2w_adJfyOheq?^^W%0on&R;Jal7wjG=Eyp346>iGOg!??YkV!i>@qU<``i9dsE5yw+n)-C&yU-CxSsasj6M8{=zJrg zf9+?<+)oOuM7#5o0xt=M&yNSTa6R?&1WvGNermwFQe3YukcM{q`2q_CM?$_p1?BVk zsUA=>oqEd8O1A>3Xm`I`1ctC_zheV?*|guWfq%)op4fors%Ss>yh^|j44+pCB%-N* zBorU0V$*sO0!bsp^|T2LLA&c|6DSuP3AG8-P(H7xT_89zI(}Aq$3O#{=a;96moDs1f4u`SHMBHmzqsVD@O7Kfit$5Lij(@dpG}q22Wi z2)rT~K0h9)Z1_qL@p?$n?5IG_wc>h41x{Rt=J7`bg4vGU@ka%c1jFaY1HIAi@isaT zVbglX1Wu8;-?f3z^pq5SjZU~IJL7ZPsU?JL_UrykZ;7BMZ zka#2J^YMFApa$*k&#i%@LcA$BK9HY7`E+|v4&;v|)A2hw;JsNKe{#T&cE_I_Xel@n znjA=`d_I2f2+U*CdhQJDBJ=*-9oQq(ho!p%4T2+~y8|bsY=Nk!431pJF z-+h63Xm@`11x^T#gzgIjZ=rfRe(n!cquu>^FwiK(n}Ra}dACN#I~hAGkaruI_GeZ= z9*^enX9c`ycl=oaTQGcnJdi~Byg#!8VK(j0qk(!d_bU$U66(WJabU0DNT@i_#Pzg4 zC4saF(fLL~;lOY*_j@8R3GL4Bi9n6uNa%^cQLd-`nHR{I==5{a*~iy4 zW&i)G(4cajpC4{?qQb;g#1&)+6ND*~OPQ)7h^kIYRZ)aysJbf1R1oISAf+^j3W}(x zOsC(<5EMaB(;y|d2+a`Yx9?tS|IYgJ{n~4N)?S~pZ@PM4=blrPBl+xoI7QPhi1*9x zA1_+WS^WK5S+t3)v-`)3M#y^3ez>S$cI+R!f4rz28LszZMH_&z{$oWOIg5TCD|($U zyMMfBE9OH#9YqT+jP=>~)kU4asMlH4&speo7M0JT{d5-1;4J!CTeO<2XVT9W^^x_Q z{e007GF+dRik4mk^`W1aiXH^U`Y#nd%vscbsptv9QR=0l9?XY+UM{MgOZ$1Hs2Ldb zUM=e3Ec9M2s`xAI=hdQFoJBwXELum_GwJ^;8YJsEyRRrQFRr&k>o4j?hJN~sJ^;r0 z{Y4*h7WMm!J|`Td`isUeANqN#sAhhw&*tNzMZl={ZqePGh2FbGD+#mTTNZUqWfAB&ne3%wtU#t28LAB+4&ke}b*kiDa5 zF=vR+q<<-j$a>EHt*8eX{Fxv%Tu%L&Al(a$^(RR8a~Aa{NDmW^QWKW?Qa1IGHEw4Af3?@22NM=4Kg$9(7~kjk&7{UoJD zz^J#EbR}n@x0kepaFp6hYQ}uf`<+yI4b|IQ>IFueiB}?LZJG64Cy%88bU**yUV60y*ZR9NKmrJh`j#A~)R?LTf z($dnu#rjdILK*@_y~Cwp&O+~SDMvU;9WEuVhkVehl%^rW=j%wR5g7HVq=z^Qy((!9 z;V4xlbz?s09U~RrK=)TI-2{w!$4SdM3%%o{6@=OEIi+^Y2fZ3;5E=G&qBIVSdefw` zrTKb7Z<^Ffn9bu-H)nDEPL}K&<9POaPN|Z!xPGTeb;xkO&yf6O&<|X{Go-_TvHls- zk(@>SGo<4Pv)^+{GcX_eIa6AV4E>xXZ2?BTbENl3el~HA^a)}1drm2b`Ji{MH2o&( z_xaL1VAQ)nYT_*RcY%~6%;s@P&q97)Z^*t-s^<*x?Dw2fmaMbib4qQ<;Lk#->SpTC zLg{Q^tiMn?kF%)1P?}4a{hm{5zVyVtw{~wNws_dbdc^ISaj8q;-VZ{oc|b=EL>5RVuqR?l+VEyHv|roZl8{ z4l-PyR;lnds1NhNbeyg+}XHmaZI*4$TYL%)nANsjh>Oh9;6G`L1sCU0qb$h(O zY~p^Yi*S^>UmD;nu1}k^v^kE?q}!#{oJBv6NTq*={X;)%q|z0%pEc4ecW}n~Yovd2 z7X7S|{!KVat&z4uJkA%7OEoRAew2Drx*Hhvo|5k6EcBj|9wZ#4o|3vSAN+Y*vhSpN z&qz~&QSUjak+aZyPDCnW?E9Cplw%Lq37CsBg#_!tDEOxgO%tA4~2+hJGA*D=_ML@({_-COmnB zFq_Baam)vQ0(o&K><{#kayu~U?Irhe7W>;vE`KWSpUva)49>!z-^r`VdM3S(+(*`P z_I~mZGWe5{m#(G$q~r&Iv3^Q^n6s##lAj>Vet#+VU_SISRqlG4_H&S2*Tot2%H?*> zLa$u5pP~Jf%axo(KWTZGtY^}P%afi3efT{5L2g2ZevX!#o`ZF`-bc%OKTqo)E$_=& z)IVB2kZ_bbTCRq8yxxD5Tae-U94q$#V?W2suaf+1;&}Nr!cppYc@Xo#pA+QiFTnml z?@w|T81+t)`#6jJog`Pin2!gJQYXpvoP|GsmgVkvJ(E6FF6S&h52wpr$l%XRx$7mU z5B|)QPkNa%)}JY7IE(r-VrR*$v1E0jP);*Z{;lfxlF#3aFn`CUJdc+&*kzMGW2t$T=Flfca^*k zXQ6kMd;sAnb(LHN@u+u=ybc-ku9ZiCaeqtXshi?{vxy~gJK-p`MBc<%`13b;(f`Hq zne>fvD`(+PR<<|u{o?!En`HYnVDP6&eyWc%)^C!Z;Vk-Tl3yYmrJCe^h{t|zlZ*cy z>qn_(c^WY4t&nRu3%wQc48l=rg**rI;q%oZXWyWDcgY=Z(*3o{InF|_Rjz+4zYfgi zaXHIb_;asZ{&u{cN#8He;4J)kKpsGb^Rr4G*aG#zpH=du@6!6K;k>PqjDo=Wk>aCHdau#}Pjq$dp!cL~zfbj^lIL(1 zdQZv2gxNeUPx=7z^L`K6Ps^J)LwqLvoIFC-bM^~z!-sLb9ol-ibr2Z*SudabF|EH| zK83TWzh0h6I7+RT=RrL7(<65yLq8kjVPHHzz48dj&n9~1QNnBp6@4ZI(9@X7ji_fcbD9`{c^4asTZ85qUZ=>h;U5oP}P$Jn7SXJTUuy zT%O8VoX5B1L9(7nzbhyH6YoD~zb`i;=l8!u`$%rw2J7JWN3!!7XRQB`9B>x(Ka%$* z9Hl;zDm&@xq@8N;zlYPl3`*)-&lsrHicR>^+nLWbj8)TE2z) z;E$xN1;+Z4@+@ajUsBc+j#84+kNNOu(3 zgFmH;`va|Cs)U?H{ZeHLVfK7Nr2^vddhe$+Awxf9$|hj!C#Be<@&2-jl+sF=&ErZp zXK}r!DvN)N<1^`UCE_glIaDe8iSHNxeLq5}*#Qjw9HIO+#u@7$p-lL1td~t3q3ljL zN*$s2oIyWI{Xv+sWklt>)`iHW$(nU?DH$0*E&<#m$RrpQ#p_@o5z)E zh{t|rDJ{s*&)G^3F!ocY^pbowk1KtI**vZcVm|nNp3=G#-w)moSg&jaM!nfe$%Op6 z*xziWl`xyfm2S?$pE=5$o#S{mk1I`_#d*9$nN$$h+o4^iOxgt){JBh7wJT?=f0^|GQR+&i3K;dSQqJcr^sZ9=N|?>#N(1JDKi4RFA=SH9 zSpbZBOO!6oLT`yux?4UTn9bwLG|s}GzbRv6oz3HlzdPu|`N=8~GMt|#CE5el!Jj7O zkUcqL{U+rw&Z2&kax`H!k1Nw59{ssZX-9_h)2#FZquvVT2a=yntWbU-%;s@rQc=9$ zDAl60BZJ;uNj<-XTp5ITzP};+UL`B%^C6zi<4Ol-aef|9$`q&% z{;X2URABIDmGV!G)?cOkA7@d2mGUNGHjgVq5Rd*mqLk~gew2DtsRKrT)+pz57J6%x zzY=EixYB_6aDEaSP!BFyG-r5xhXpB`l?GF7su%B<-OsJm0HfY!rHQlH-)1G@=i`Mxo0SsI!k<2+pR8xn z{mLj=&)IJ)i-Ne`4(&ZA0^SI(q zhWxzVko}pmi8I7!(%Y30vYxX?lzG34>+R5T%DfU_@Q3|6atddxpHp_@Eb8YJg>aP0 zDJ2k({(P@wk-?u)r5_meep0rO{A}VUWsoqN$CVMx2Y<$tIs3%>W%qL{Ex@QZt_*M% z`x{rPO7ro+Y#vwYIg9i2nN|)N;<^@6Rr37c%_)*-h=*59)(IyQwFYamM<) zsTt0q{%-0Sgrn4M>O6=?fA&zjk-?um)nQ=Nlhm(Bel{VgKM-c~xLUA3><9c&)H%qY zr>Tv=sAs6XoW=eOwJa6)&*pKpmb383Qpd@9Che)k2gLPqcBr-?gFlniwyCfV{!CU6 zJBTyZpRE3Yv#38=J(h5knyk)%c=V@4U5yO=Oi{N0qh6`{9?8!pO4UyYvw2+2VLte? zpE~_u*dOSXsq=tQFQs;J7W+%7c6mM?n9bvAC1>H!RCSoFvw2*dbO`9@>*ef2)h1-{ z=Loea4eQ{~5$fI*oU#59>b{&s{Ug)^3A1@zt%i8?=MQQNGW2tl+5?PwN2{-rd^V4( zuMuYRxH^dW;Ljh`s>5J^pm(e~0~qy=S0m11f5)o@hv(ykKgX-3oP|Fps9VT-CVi4R zM%Ht7t-AP#xZVzJy1KX$82p*8Do1k0`qNc|v#38^4G2f6>FQL7M}JON8djQ2B>CCIO!Ya!Y#vuPVLtdXOD#Jp-fxsTTdf90y*jmpv)Esqs#oRXg+Fy_1!v*U zdFm)x&!lIo_R*jZ=jS4IH8Px^`D*VmunzvrSFf(-jP>WM*Krp0=c~&IN2&R0E5xHe zm#D+Y;LoM1ek|3yOtm=+z01^M!fYN_r$RjHU9PT12E8lQw}EkgSE=uj{A}VX^%KHu z9#?ai4}M>xb{_}*g5I@i&GB@9OVn1*Vt-3iyC%Ob{9d9~au$C7O&ufaY#vwr6F?vQ z&Z-^A;CGX{=|oruznj$SrqTLM>h+vO{U&ueVK$Ge5yYcEx2Yq@&`+~!pG5Ums6J<* zw?Zu;%;s^m9O6;0MIAr}y}Q(klc`>-TFF`HwW`&G**vaJhj`SxS1tZC^b2~C+5wE$ z?|yZhv(UR=T~M2k2WI!Hs4bj@-)(AbCSGUvtEh`O!+OqsL@hWauD3&5qZXeE41TXs z-<{4G>#tEi;4JE|QU61j&Ex7Q#A82?tJSB)`s{ucbpbHyJ*8g8S?E2bUPGA8<7yM; z!+CsK%^`z7eePWShmx;tl~_nfK{X7{V8B@mDMdtS{UgWij3!(XW0OKJyaq4$zn zG9$kZ%ma6 zo7J}nv+u{%A45(vdo!zgZ`mo@yv~w?{dY*OxXQAh5^9i%> z$F)X?N4-GnMh3m4wgnjXx0hBkC+;_!*h}jt%4JE_?EZ0W2{7s%uHC>{?C)^x7Q*cQaV^4p(5uvHFQs}% zYOesJUX|9%S?E=1eT3QlMcNv(P(E>mtnVAJ+yjKd(1r z*J!1e<@F#wlb)tc<1DVYbqtlKgDq46W+&c)#raajl-SIFDy)U1U9zK1UlM>pA;8Er$&K z%+{K(p#99&o&d)Bv$eIHML)B(7YMWO$F)AphkoX0{*|By{mj*BfKhLrwwSZfo2LyC zj#Bfq!o`pe*XLrbp0l_<3$-j+&)Ju29mvqnRoa}ZXg^nJ%Yd=|RoZgSqW)Fd3c_q2 z*V-{3`ng6MMTUN^)rzm?`lz==`y*$ew?z9BVfOvFHVfkM^ZGZf6B+bw(8hpK??%nO zCa*8_ZqynGv-`)jHqPRD-=yWpdM15~rZ>d?)h1Q1*=XZtnB{0@sp?%F+ z)L)_fNSMvzTH&>^KKp)L>qLfr?$QQqaVqnyJN?XlY?C&YfzCQMg&Er}nXW`G& zS}R#+-;ZnEWSxCKu5CpIf7WZ!4b-3Y+6%x~f4#Pzv#7sb+enywKdud6KJ?S0l`f_I zY|y3yqh7BzgR{`<)#?bd@5i+Tm=AgzwGL$PXOq?ojCz~3svBcJvWd;wAYnF-Yl&sB zpS<3X-KQ1b6vwmg$F*wC;2-;bT&u{&`)A*eYn?X(!})nn+jI+OtpA>-HpP1E`*F=B z%)TGj$~c35lzLxlyDipd@5j`to2lMMS`BC6&qrD<+_U}~hQ|&fj z+}}2B1!tkRO}m#co5!^d%m=?e(?(WMy)U#A?x6eIuARhL=xx_dBh2P;Z4Sia{=U+t z-bwYo)}8^z{e7!F&spewtGz;)&Ewh@%!mDbr%k(y>iwWC21dOfwbh)3-jAAncRn7N z{hm{+ z*iX6s9%oU%T>peHo5%GW#A82cz53x;pUvZX6ENx>u5aKh^bXfI6K3Yt>i2($ZD^eW7Ue*UaCAjA2|=qbop=P!B$jCyD2{hY=A&d@76;{Mq@uGeuE{+y{N9*@`AJg%2;7XF;4w<3c- zv-O52s6Vsyu_rlW{n`3BXHkE)UeFoqvw2+CIfH(bnxk(*27l)26;DyUdHM{_LT{el zO_*4R8uG04d#(u8S_vb9? zU!@;Hn9bvQ4d%o3xkk?-LqFH*oxrHKMDHj0?EZ1Rsw>_vo5%Hf&f@y~P46P>?E7(j zfUM{2te!)Lewy^=XJ|i7`V+udze#_Jv*@Quf1WV=eq8UveCX#kz3^GkgMOOzVqnx; zp;vJhdMosH!fYPbH(`EWZ^&-Z?dRftGwD{nlC!uz|Inu+Lq99^QDpc$uGIB)d_P!! zrT!<*qW((#RKiherCty5`1k4oecto5pNI6NFHpTz`WDVYZH>uLS9ddOMSU#m|c9HrLk6%dd8bm@y< z20gew&+6|0qd)8P0nS2ioxYWDlv=0fFdwe>3;LWMs@JWr07kv_`kkDG-g^B$!fYPb zJ24;hdUX92s<%Ne14g}GeHv$>*Q<9DX7jkd1@qzjY}89OQcU&Et9-XK{Ys*9-p{uV>O9>1CWnKU?)#$k5M_UcQm`Go+sajP-}~(>aTNhV-)u zN2wuw0p>$LpX)uy(9f_w0*rcJ>hizh{bdth>Neph^`&0Q8TQMb->nb+AM6kGzR{<> z#u@c;`VE}L{&M;)gxUQndIa%!zQ5PU`l#Nh-t}*)_me)vS?K+w*S(%!2WI!H=u0^Z zzsK~gWIdA}*9+bN{k$JJ`+s^VGWfl-F@y}~XJ=zVKdryBu`6d$e`lkJaFp8FD290K zXBT4uGWavmh=9?b-HaZRpH1v$Y$D9=S1|@KAFkgX#_(IPf6&|0=zg2-Pcp_hi~UJP z+2pROI7)`*aS8BXV z^4a|=#>a%&{VGNd^I?Dc85JMV{goN^$8>)wqlUBCU&`nu%)TEth9REsZ^)i%RDY7s zhj@0siZO??@cU4s2^su8!l>B_^}+8WjM>20&k@F4&Z7Pi#zMmEeidUW=0iV!Ft#9r zKSvpfPia3#8#{9rdPf_35N7wQ7(T?K-+we3kwNcRqZJtUcf7HVqUd)GnE;0s(X+M88s<(4Sz4^ur&O&d#(M6cu zuVM^9Jf7c64Ef8r-%R>4qnxuizgHMl$k5N#MlUj)->Z!wV61<&QSeo)mrY!4EF#RF z?`^bl7JfDu!(=^^ZZsy1K!5pubM_5J2{P2b$>>Ff`ZpOvz*zq#qws55|0Y8w9HnkD ziaA4l_B<4${2QnT=i?S*1Q_*hH70#a^=>s92uG<~jW*7rpWBTbSF13_ zWIbnh8%@a2PmfVHM*Hb8rU7I99%BJ#QNPDnOgKvQ7+K7Rel{4R|E2x(8iPM`M!k*3 zIA@`^(Wv_+zYffPe`ze`EUwQcV+&c&r2C99vYxZwFy!&L-VW_;qZ1jf&)df9z*zrn z<1Nmj{@ca}gxULVj1kO-e%>**{u=AE`Pi8B8|~+PV-{zj_r9@}F#A5+DEJ@b!}a;l z=-~|Une->d5LwUJ|1lONCNe+Z`P)0R&yD7tfT5qyjpKIajQxCWoXA@87Vo4jKL)d})jVquz*N73B4W-iVPT%;slfDrfO|{KjZO2ECl|3oz<^Z~R8` zvx)DGU3ZD~qty3?%~|M;8nwuv_mi;z81=@CE|Q;3j2XqdQoS*wnzJ}RKN~r+o=N{^ z=o7hr+>e~Sli7j{pNCz{mO@wuzjrbB-<>no-^DzTv+!pZ^Dx5f{Ws<`h)2ICnptG% zXE$>tFzW4LK1lMji9O862uGXn#7BtM%dF>8wQ^+BJ#kKUZeSzPZaW;a>Sr1vwolJ%Uuzd42s{Tyhv zO0=H?&1ZqJ{(E=?hp0m#|S0lsqKFh4PAs;^9XPMUnWBs$t z8##;mXPLJWX79f-+b|#cImaw@Xg}wg4Zx^(zS+iE=$&t_CLE>CH`if4=v`n|yHxK& za{w6iE;7eB3%!fXSzbOKI7(e)HgXo9hrgQrWIdC<#2h8-IeVcw$&c&p(5^5$kinlT z%sybOe}$RjEb3ojjuB?>zcC8~(1U&!nfdbsM3~LbX5n76pIgis z$k5NN=2BqPyWPxk7J9dv&4k(eZ_GB#2Y>!<+LPn`MyWf@YGBm6(_F+^=-p`!5oYhd zF$;ee?{CPy+pOmd@tO2L%q&@F@4qoSkm2+2pgE@m^1+`6&1Jw?|3Py(XHow_a|L1c z{u{F$^P!)1a}*i;dDtx8o9m_P^;4s$Co>OEm5 zrsVa7-V4F0@mz6Ff+Uo_w4 zEb6~#eoQz@y=dkzAN+aAoKYI)1H=Fi;alIYd>*f|@=;w9wdtj{py7?1lQU7)GH^S`sC8qp)(1U*Z%{pYb zK5v;#z^J#y9Oo?bwwMKFw4W`e&Kde)_g|a6`^Wo@QUhlF0i03q1G9y*(EGrYr&7HS z%yQ1cpFy*ktY^|&%`UQ@v$vT8$Z);CFk23U`rywO=2~E^|AqN1XHowPb3I}9{u{F& z^TD6(X7NF^pRdemz^M1Nc^7A)_qBOH;VAXB*@^j}_pLd0FxC6c94P0EdOw(@hvZr4 z{a|(wX77hL`#B4Lel(lXaeOBIU$c`ltmo`;v+B^e-VQBc&8h$fe-hT!z*s+FUB_9} zPgu(cv-jUvt(Xt}Ot6NL;rtX>`e9rj^>(%X#98R=YMn}$z5m9lhj{#ZQE2rZ9`83w z?QY$D1l5~l-OE|%O|l*&%-#=gbwNDp6fC?#v8JB@^}(Nv zwGbHl$yir#7WFgMb%di-#%jiVI6tRaeaO(yY1R-h>ixwkJTcy1Ht`orCd}SPX%%yZ z{j&Q#tX5>uJJZttMEyC-s^%>Acb3&fn9bwX0K}s|=UC;_;`*8N`PK~1!k^hz12XtC z*Qz*)`ZL!$9T@wWYt7^=>d&>#BOImXT8l6r{F!I$KU06MuJ0b+{@h?yp8^c$=LYMeQ)&GhtWPDk-(nS?M)hvB8h}yncB_N4(7WC8PtV5#vw7UA;tc%{*?+ep zvYtubY4woxoZV^-A%j1W)%F*t5B@~fdSI*{SsOTu`jNGnaFmLyLClAK?zhTj(0($TRC9VTWuAe5&Mx%thSm7vw7U=;w=1m z%#vru@$7w+Ryk*Jex9;sAcH^8So)dNpJ%LtfU*8FR+_Wu=Naor!t8yNRxRd3KhIfB z$k5O8Ry#22y=d(-E8br=@uGDAVK$FjRh(hJ?DvpX?K!YN(0kdcKbJG=y<)X+7W;d} zDmX9JXY;sK%31jHs%2+3|eDkoz3HxKO6R&ugB(bs|p$X`NA4U27kV=+zWX;*8jo^ zIg5V2u%-}Z^SD(3@%Z;=yOl+Te!jB0fKl&j>p7C2O?+*=Oqk8%RzK#0Ki^vAbEx0n zS<`?~?*}W(S?uoztKg#8FE)=`rJRL7KU&RXoz3G`7g=ZXxHW_f{v_<~xlkYcN!T9% zWBr8vF=tUfVSi4T&ExhM=0iUd?3%yQehTbGz^J#YeI;k1x2wH`Fq_BiX3Ph@LVFY$ z{NCN3G>_|}-Xwb}XQ4OAt{}|jak~cM@%k0n74zx-WV;&}^;CO=v(QuRSr_Nyf!RE6 zH*yw!>-Hd7XY;t7xCHd!JbHEsGWeaew<3ezN&7cote>Uo@9n9ag+ITy z+X%CH-0p>VoEP@Di?4|LVe`0M%^CL3=5c!tGWb(rms|<;!Ji8I7+|blVIRj?)UU8l zCd}q>yAJcApTq4=Wbmib9t1|cBW-PQygxRN+a6&ykK1LOh2K^7>Z@RXpm&Ttb~R_z ztF}w8p?cMJD`7T|+ufYS`8m$E8{&92kK2`;g+C|Rb;#gP#`dp;`ruE-J{%b9XY3<6 z3x6{9afI1CZqLAc@aI%}H8S*bn!N=W_5NZHkbE|e+gk~W*%Q=hsbL|y`**tEyV?OjV&mKjFelE6)|Hk!EZ-HIHS?DdW%Luc1+^&Rp{QI-e zZbAmVMfN&i)VsnSAo=9(}=LWm! z2I|iZb_X!lzro(dS@d&*{S{$0kK5yz5B}U}k1Pc}=;tPT^^Me@o9#i)Lhoj~avAOC zX1k8F=;szYaZ|jWN#Aala2B736?Q8!^mCWpkcIm2dAQ3SyP4L%%l?J4sDGEe^YU0f zO5J7aoI#)c9@6eWhJNm~6Sq*k$gbur^dh^PFq_Bitq_lY|L(V&n&Nty^n-RMXVK3p zd+M!RAAg_zs6F*IVCd&jyYF^d|51D2=2$PAc+@_SFngY$UCmkav&QcHd#umyAF&g6 zP`xMZ-*FcGJZb-)FnfN9T?z4cexI_Nk-?v*?EzpsKhM~OEp&g+*h>ksdE8#j8TL11 zKW7)*8OLYRFWRM?g+J@r$k!8kpV|>&_B=tmhqJie+iX9I<1^_m>?+RU zdVguxBSSym*v0qJe!j7f1jhQ`*vD`d^}n%CBpju_v1egE^pmqYkfERN?Ezra8?^^X zel{^`4-sbXhqp&DAM}2*=iLwc1HCc36&Uq?w%2hM`}^7USH}Ib=LyvST+=i7Dqfw8{p zOk5S$%O+e$A{?b$r6)c#H<=EL9 zLHnt4CIe&rDrX93(NC3=BFw(ecB(KR`Z>mFMuvW>oo-;%JI;BTAQM!j>K??^s- zAEonO!t8yN&ZMVcf8fu#j^7pUm)$?&R6NTW^)7HaIE(#V;8Z+E_jiFai?i_OLZ@+E zyw2W7>9lhe=jUQ4dOohVLtE(hF9L%<3!Ql{amM-!odujl{e{kA!t8yNP8Q;E9$DlJ zAcH?wI0fse-ePAWXQ8*)kqEQ*Q98vCk9t=-n~*`T!TBB-_jjH16Uomeu5*4P%-#?0 z$S*^G;CG`l4H@*Vcg_b!y`|2DoW=f@I+qY;?}v99F(34nIo-&hmvy!Pquz3-peJ8n z=q+~|3A6XZJMEms^=onxuf*}0bhA^!SzNz6oEqeOy&c-!PQeD~53b+c&SYS$f44J* zv#5W!lOoLC5ARfAKJ;^s(~J!L{KM%6M!ox-mq|W*KfLoV!tDL<&H(0v-b$zORoEZs zJ>YZzquxVKac|sjHt~?tK{!f1vk3rj#AyuQp^Xv^-d2m_}$~Y2aI|foDWHU zHnG9kMwrdx&M4-CUavFt-*kT)of=@&+vK!z7W>=e_^;>Vf!RFnRB;y9Z?iK_)-&nX zo#Hn@AFkhqk6RPRG4$yw-q=3g4st{Opu+7J5HBO@!Gz z?sP&t_h-l+cM=0}zib|NOE`OL#?cpr?+0!liFxHP!d%Crp#r2Wgak9?lakqGo>+ycs zJnpt3LqD$D_7SW@KdyV&C$zrnR&o~gUALMro5$Vh5Rd20cUzF5pU{0C82u@ByGedF zQS9~-X7jka1@qy0Pj)M|!u~+7#H|HJy(w-ZXR*I2ZjNx2n&Rr8#{Cc3rS1aG5T8kx zxh-TpXCL6MLk52ib{GAJ`g5?m0vPKb?B2y$)IZq0pD>%p-A>GhehzUH+h{+Bx@Ewq zcbIzsXQ6kPdnn;3b(mX&`Ji`%+kp)J{K4%7M!lolQIelc9Oc#zo~H<_;sn`I+YK`Zwr;jhTF_p>~Dsf7^eQr za7#D~e`dOkWIdBU+ifT7Is0696EgU7fxC1&)CYeqa32K5`WLtla~Ab4aGxN|-Vg8g zU_SJ7p(}q$`?<)i1V+8Tx<_#qdVh6~Cmf~z>dwG?(3|geBZJ?UxLbfx?^3tqtJsfh z;!<}t;V5;f+s9e>bD5hRiQ_ZrE8Pyxu%5H8b}PS*_rF8C&YkfMF!*zwTa@FB^{;bP z&Z3{|T$eDL$K5iB$Me(ZHXuVk*So8MQE#c+LGrVSrEV8tHjlf#m=FFebEke6?>99tN``l<0>Vx0+xi0`?{rlYYoJIZn+>M0UJnjx)KJ>HF zE&Y-9^ME@Y81)`)u6} z&ExKB%!hu~xns!C&kJtJe`!D6ZYgJ>*X>Rv%;s^o3gYp6uXooWgIlN?|ruk z81+7MH*psG`_QfZE$*Mq>floN)5Z!m=FDY>9!z4KO=4rFzS8d_LBT;;v2V*F#CSo9mIUl z%eiek!Tvz+dpDfG8TCfpy*P{gjk^01X7jjP3GsLye{zSAL2t~JccywjyH%Wp-p_6~ zVK$GuTOl6L6~G|?0q_36Ef&2-a25^ z)4XAlpG|09{Y0v#d0EclJR05*S$udopM&+k8H`(7C`_*3i+BZEK1-mbgxc&uOS z?ao>FQ|zgP**xx*Ks;XW$=)Jl=%>VM14g|mUOUOpCZ>2DgxNgqbz?sGUFvo04*Lha z{k#!i)GPC*?h*TuO_X`72}h|iuaC3vC*>`k6vt=M2YC@^aefZ*{5|7(JG8?*zX%xo zIm~-T;*9kV^PcA{{5i~fg)p1Py)6)r{v6>A$gw_qzonN}sNPZD;hcruQQk3x**xw| zhj`RG+S664_eXC!Fz)YIubs2dJJu`J^6|h?>R4|YXW`HBUZEbZXVQQ2$~X&uPWHNy z;ryK94H!@#{5i$D&EkypPw`f87WGf@?j_9Tajyg7v7hPQI5J%C)4fug>do-VI19ZQ zUOC|?HN&fhc+{KewK}jr(3|D$&i(?&@5embE8;Bl&h|{g?0q|4Da4~*otOU$E`DFn z-Z$@+dQ`98o55M=)q9%=N2z*m1md~gkUiV0@$>l*pGnX4=5ZE&&-a>YefdVYrI}y+~2j{D9O(zuJ!7ZasN^3S})64oW~{J5LwTpZ}19>p?~;$w#+L- z27i`&!^q&za&OnYXg|xn-8qYXmU}8;HjjHH5Rd&dd3DIp&u!k7z}Qc-cMZwUCYrq) z2(x+IYr%Z*dxcj#8TJo)EnXck>fPlva~Au%%S-%@`g508!ddv!>NS$}Ogi$~$$HLS z>1{#=e;)FdmOy>*=OOPwV66X;_b_Ks{~_-Q!fYP*dN3dQS>?%l(|#WDDuGe&QST_u zLhn)Uc*1NR_hw)|=&kX(k-?wGy)D3~_oP=aCH5nmc+y)$nBA}9wQ?5zJmrm&^-TI1 z&)x_23+HE@SBVV%bbDjS;7_+_mhyP4-|e}aML*r%WWsD7_sSt2&(C^qDKhla<8=a~ z-UhFW7y69{2h%AN=X{s`sUSZ}b)bquwU3owL~ACa++>*e~||xL3+q__NvD zMAq5&^`EpLe{T{W)X(cf4NCqW(KxA7M6+dxH><{=Dbe zsaT&q@5Gx5jCvn>^_+#?hh8sXHjjJ5n4kA&$o|O79+20Acs7rF9h{+GHjjJ7Q{#F& zv|+E{Kw#)+*lRq9Gu9vWp5rX)4|^{YX7jk$5AoQ~m)@L%V}16#6K@O()jc+)C4WBp&eTF#>W zFWwBoQR)|O4#Z zqF=#T^s~F)feif=`OQbrev14_f1v#o`BOQIev14G!t8n5ehtK9KeFG24E?CSd?eM= z{i&RVp6<61j#9ec3-MfU$TofbDB6$fS8x{n1b!_t^s|?rLx$_KmtRyx>+j{OoJIY; ze3vl0-`g*Pc>X7J7&K>j<;wZTo|m4}T9T{j%z~-%Ps7ujMSR&ma9c$k5O6e&MmSpX2>0 zz*zrye?QKm{_*}ngxT}`{A$dHeopXPkfEPH`8~j>cap!Ab@qOEe-s(|nd!G2Py3nauLZ{XGyP{di+*PM>j|^>QTqLu5B<#Y zD{4Rw`Z?Rr0;67?zmBuetMf}wp#9YO(>RNM&huB3b@o0=zmKfv?2G&yGW0Xw?>Le6 zGvD6~jP>XHuX7gl=lkyxX3zKYhcO@exx}yd6Yb|xzaAL%F7xMb7J8TY3kb9KQTmOT z4|IuK6^jBUs)UX&z`sK*Kro-r^W9i>+E^k{uZ*H zv;X0bAcH?E{iY1{XQkf(jP+Og{hUQVEByh&?0MV%Fy@0l5BNQ&f*$nqkl#O@`m@T{ zPmA}TO|0^p2(#yH`<{f8cLLhJHTw*PToI`PhFK80&xRf52JP|JeTz z;VAX7KZ^O#&sM+sJlfBH`~|?MH{>tkEcAx_2Ey!l+kO+~gWl(U$N5xm*q>C-8TG#O z58y2HzVr_z%$~RH*FZd;pAo+U8P4N3zJ3AK%lYM;gULO>hF3Xt^cdPJ7-bkZk52J<*Wd?tNF&`j2I z_L0GAWbo&hpymq5htIYfH&U@J1{{a;Xd2i1EmIES;)do8$-Fq_AN#So8r{|@?)LGO(~Z=rf`2KAhU z-kZTNVK$EklkVj4TyMyJJJ`e-;@LbNjF5FUj|UBRK|J{VanO1Q;7 zoJIYQgPDZcJRZ!0clo#-f&Rz z532WNa6D(B_hs;B!fYN7>L4EVMuIM6(EBDB2gc7|E+~ug`a&-kM1 zzb}qw^LS9j8P;?5e}j5t@cY-G_f5^!#u!VK$G4SC&)@vp7G$59^V^p98|;hoL@vUJnS51jhOYgvW3e{TvXUNSMvz z;VjIDehv&fkl}hC91Z}Z-XY;Q$%3-#1Ua9VfOx;a0_SQ&mY3(N8|WR`slEWv+$=ntbPpq0Do%2x;4PyPfch(&Kc|1 zgf3^{Pfa+PFq_B2a)`&j7bk{Gk)fYyVJ9%^og8+N{A}Xnu$wS@zIWJ%`QUeL=sywf zm)$=S)&Qg4^l%zyvA^lzbi(ZYH(@>IgWl<37c%T`Mz|Fi^=5`8Pv+|hy_sP|n0-GU z_HY({&kE;t#_{a^H(@hp;rIEW{8YUE9omJVycQVzzA$|BY0g;x!tim9Glbdu zZ^BIwkA7biPVI{I+5OyM12F2%51-{M^yY`_3A69V!+y*Me=Z5PuA_RFhNCag{aqGT zyqIU9cUjm;n0-GUZs9Eaxjby_j^i`wtHO59!k>n) z3}4|a>Nke}M>t9~hJz4~{#+kc_r&__e(taZ81e+Cqd)%$XZ6MU?0)XB0~q~T8TNA)dMm>L z!tDF;a2WH!p9jJ@|E78mg#*B-w<`2s&#w!;RbdNZ_WgLcj`fJ0-3A1@T?16anrz@1-j`i97++ig! z>a7dwI19aX;T*#3`|)rw=7T>kgwwWAz3y-b81>eNrSIg|h2HwGg)sYmJY2_F_|p^C zzZ=K1@5jR|XW`Gk!ov6BdONh&!omSy@aMJgf%iFM{nx@(oJIZD!p8}-c|7cac=YGr zq5MIt&+g|AD}hn(&9I8I(0eniABDI(r{wSj$=Xvo-8ThJO!-!v2q-AMj@=yyz3oSbr#-&sp>{ z6kbl4&EsJf;?bYa!vSRIXE-d_O7*@B3poqDFGHCyo5#aqh)2DVuoW5fz6pDQaeujR zl;md7zxPLZ}hgr_TpYOvVvd-r5u<$?7fBt%~c|0sb27i7HhmpabU&CFu(SCjn zcjqkn`88Atvw1u$fq3lae_#@QSXRk>9_HI*gT$WBh2RUWG`p&`T9e0 zK`xGG^LVm_vp7H1N&UOH-VUuMseca){?sHN|A8~suSq_|S@=_ve4a3y$CG^!kDsp- zljWnaKKp%T@&;hkJ2`n1XQ6j;@^->(9#6JmKKN6c%prr{rzHI!>HelC>o^O&>B&CA zY#vYMARa$orzfMI^7#;-NzY97a2EcYm8{wk?|+AOZnA0&82mXm`Tl=t{d1EaaTfK@ zO@2n0eLtQYgLw4k{AA6~u|E5KWpWWP`g37&F=wH7VX~1ho5z#Qm=FG3lr z0!F?0N&T06J)t*0*-V(tYd{COu8vKhqLhK_GImZ z{JMBQ-W|!Voq@rhJCa}Q!Wrw|k^G9YsDDTD2g2-qJIR7wAs_m=GdY3`{@k6cn@IKU zNiO9q^zKPE5oYsvGJ<$KkN-%P6@otK-IweH#{I2Ke#u$rtxSGTn9bwKg5Bu;9!U02 zqIwS{`-|xQRwZ>Q&q8livWYO8$CI6${~uRpA79s${r_8nw2Ek2t_nHN&*$7QadilS zYSSum2@@1Srpg3Gm>@F^qV5nxWjav@MN4Q@wLuURQBgq2_Y{LHPY(;rzU4J=>2LHgFbxuPKb}8P#L^@xs^?VDNig;T`#$ zah`RBcX1Z=*A=cJ%=Y7jovU9>*;4Jhy3rh*J{di$H=EL!O zx^M+D_}x|53ygZt73NLL))RWq6{ZQZ{di$JXW`F=!pgm(^=v<0SkGDb^Ge}3a<(4Z zj~9;b4fB9MuND4#AI@0+wZc0%i~6q>-bng z@2$eQgxP+)a6YU@y>|+&{h>e5d$-V%sNVa9&76ha`-OROHV(}8xcfl=?v!ZyxA@5{oqgxP+)a0BLp-bi7&74^&R=Pv9AM!iho?shgV^fHBe5oY`G zLW?uZ&%SS2IK!uU+Y9F{iZ34#niu49&F^?j>N0{x$rD4nme>7>vA)p8I7*aJb>RHl4&O*g^ zDnE?+bEtF?FxEd*x|Fk+=TPY?!fZb-HDNx?bC|RR8Rj`c$~~Oxqu!CyuAGJ5ky1Wk z_I-FsgY|g+94&>&pm&Va2aI~NrAbFb^Rn;5OH&B5`^P1XGt3_bbEM2sFfZsGD`jTV z{*IHRW2oM7Qb?HHKQ3+HEc`w}Dwq|mXZMdwrJRM|r%2Vv*?Ob-r%BRms1LvY)1q0R zGUyNVs-;$7)LS6+a2EY7kY>z@<`07f(tOUspM_E?+f0^_VXHow$X&Yg7eOwyDe3<8Qsp{BBpFLkGwF9HxmC{PLq2 zr%7r)9_oWXP0|`*tluQ9<1FeoNlz1I*T| zmxx_7Vep{Th79vOBo&{;>!aRk zsgbkrXSI}D5$T7)YRTg)=6OUKCh=7AF=_J2be;|=M22}frOs0z4)b(M7gf^wozkV8 zMg30cD#C0(E;Ye={CoPev;`UF>5_6!rFzdvlQ|2$=cK8G*?wHoU_I(>kh+jT??vg* z)2LpzbU0_B*DcK=90uJ|C9FrijZzmf==Dhb!07iTX*NyL) zd!=3yPbK@L42fsr??}1xdB6C+`1hqYWbpfaX(KS!e_z_fSTh`Z;^f&j7uJ8;rH*-b`nn|caY;Xpbvk4c9J`gvwn=`Pn1V4ggE#;QGWhn zT7RPa5@%6=qWl_RwjY*!e&O&bwIV8;X<8nLZgWr3~ z;iXhBUw+^++TS$!Va`Htn!JuM+mFlLupax{Tb^1=_4biVfw8}R<(Zs?-oElY!eOwl zJRkF+zy0J^WSF;5UJHzRvK+fSTTkf8avfpzJf|FT7ROJOE3b≀?^z&l%#GxFb*g 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 literal 1691648 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

    ?n%(os)F+Snwdv@9p1q-oAZdHp+mnc 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
    >)&XGzF#x-Z#5VFJI$sa(5mSNwd(pI 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

    Bz#t*)n;5pGFq?QqG_nA*DUkJ7G3qh*iuZC7z? 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

    ;tL*^nHH_I1C&CjsnLi=l4(GJY~+) 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 diff --git a/bin/OpenMetaverseTypes.dll b/bin/OpenMetaverseTypes.dll index 01dc3d813cd9a4dfe4ae8dbcd0975368eecdb784..1329aa79ccb756d0a65661e9fc38c1a40f609da7 100644 GIT binary patch literal 114688 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 )na{Se-w*porE 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 literal 106496 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

    &ZzZAJmfpq5Y5&y`w1u20j? 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

    eE1gXYBc;iwUDZGZMP=y#^HKOL< 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 From 0bebe94231c3b5aeaa24a0eeb38272a08b73473b Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 7 Sep 2010 15:45:33 -0700 Subject: [PATCH 08/35] Rolling back the recent libomv update but keeping the ExpiringCache cleanups (as much as is possible). There was a report of non-finite avatar positions after the update --- .../ClientStack/LindenUDP/LLClientView.cs | 6 +++--- .../LindenUDP/UnackedPacketCollection.cs | 4 ++-- .../CoreModules/Asset/FlotsamAssetCache.cs | 2 +- .../UserAccounts/UserAccountCache.cs | 4 ++-- .../SimianUserAccountServiceConnector.cs | 6 +++--- bin/OpenMetaverse.StructuredData.dll | Bin 102400 -> 102400 bytes bin/OpenMetaverse.dll | Bin 1716224 -> 1691648 bytes bin/OpenMetaverseTypes.dll | Bin 114688 -> 106496 bytes 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 0925222fb7..cdf8cb1b23 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3529,9 +3529,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP private void ProcessEntityUpdates(int maxUpdates) { - OpenMetaverse.Lazy> objectUpdateBlocks = new OpenMetaverse.Lazy>(); - OpenMetaverse.Lazy> compressedUpdateBlocks = new OpenMetaverse.Lazy>(); - OpenMetaverse.Lazy> terseUpdateBlocks = new OpenMetaverse.Lazy>(); + OpenSim.Framework.Lazy> objectUpdateBlocks = new OpenSim.Framework.Lazy>(); + OpenSim.Framework.Lazy> compressedUpdateBlocks = new OpenSim.Framework.Lazy>(); + OpenSim.Framework.Lazy> terseUpdateBlocks = new OpenSim.Framework.Lazy>(); if (maxUpdates <= 0) maxUpdates = Int32.MaxValue; int updatesThisCall = 0; diff --git a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs index 194c064be9..e43f7cf57a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs @@ -140,13 +140,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // Process all the pending adds OutgoingPacket pendingAdd; - while (m_pendingAdds.TryDequeue(out pendingAdd)) + while (m_pendingAdds.Dequeue(out pendingAdd)) m_packets[pendingAdd.SequenceNumber] = pendingAdd; // Process all the pending removes, including updating statistics and round-trip times PendingAck pendingRemove; OutgoingPacket ackedPacket; - while (m_pendingRemoves.TryDequeue(out pendingRemove)) + while (m_pendingRemoves.Dequeue(out pendingRemove)) { if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket)) { diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 5255d30d3d..9eaa758bd5 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -252,7 +252,7 @@ namespace Flotsam.RegionModules.AssetCache } else { - m_MemoryCache.AddOrUpdate(key, asset, Double.MaxValue); + m_MemoryCache.AddOrUpdate(key, asset, DateTime.MaxValue); } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs index e7cfda1bf1..7c12b8c0ff 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs @@ -53,9 +53,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts public void Cache(UUID userID, UserAccount account) { // Cache even null accounts - m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS); + m_UUIDCache.AddOrUpdate(userID, account, DateTime.Now + TimeSpan.FromSeconds(CACHE_EXPIRATION_SECONDS)); if (account != null) - m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_EXPIRATION_SECONDS); + m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, DateTime.Now + TimeSpan.FromSeconds(CACHE_EXPIRATION_SECONDS)); m_log.DebugFormat("[USER CACHE]: cached user {0}", userID); } diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 23f2b10d53..1ac9882c24 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -148,7 +148,7 @@ namespace OpenSim.Services.Connectors.SimianGrid if (account == null) { // Store null responses too, to avoid repeated lookups for missing accounts - m_accountCache.AddOrUpdate(userID, null, CACHE_EXPIRATION_SECONDS); + m_accountCache.AddOrUpdate(userID, null, DateTime.Now + TimeSpan.FromSeconds(CACHE_EXPIRATION_SECONDS)); } return account; @@ -226,7 +226,7 @@ namespace OpenSim.Services.Connectors.SimianGrid if (success) { // Cache the user account info - m_accountCache.AddOrUpdate(data.PrincipalID, data, CACHE_EXPIRATION_SECONDS); + m_accountCache.AddOrUpdate(data.PrincipalID, data, DateTime.Now + TimeSpan.FromSeconds(CACHE_EXPIRATION_SECONDS)); } else { @@ -291,7 +291,7 @@ namespace OpenSim.Services.Connectors.SimianGrid GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName); // Cache the user account info - m_accountCache.AddOrUpdate(account.PrincipalID, account, CACHE_EXPIRATION_SECONDS); + m_accountCache.AddOrUpdate(account.PrincipalID, account, DateTime.Now + TimeSpan.FromSeconds(CACHE_EXPIRATION_SECONDS)); return account; } diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index 7909076907c483a8e9f7f8c60580e42c837ae0f8..54681e4bfed65437999cf10f4cf7b64c91124b49 100644 GIT binary patch delta 213 zcmZozz}B#UZ9)fg?!&B&-BT9TGYBvUGTvlxVF+Qk!@vmS$$)v`3{Sy4bucf2;RBeb z59UQO{08$Z!MrF2PDYSEM=&p%K>*D21oL7Tq`eGW`Gm delta 213 zcmZozz}B#UZ9)gL_u96N-BT9TGYT*WGTvlxVF+Qk!@vmS$$)v`3{Sy4bucf2;RBeb z59UQO{08$Z!MrF2PDYSEM=&p%K>*D21oL7Tq`KbaHVtc5!xd+&*2AG16Q>w@rHH+{BH} R^LE=P?p=K6*Rn`Pa{$)fGUEUM diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll index 12a2940f688a3da87142344ae88559db4a4c326c..59e39bbf6019b264f17837be18c092c771dfc35a 100644 GIT binary patch literal 1691648 zcmeFa3A`LdwLjjOnL9Ig?vgt*$xQYhE+h>1-h^<&683;>LcoA5NmvrLKv*)NZbV=h zh=7O)VG&s(Ae)GYh=}OpAw=XMA_@jXANnGXr-+Dvh=>T`_x+x#?yl*XN%|srzR&;9 zP3Cmfsp{`Jb*k!Ab#-<3zVk12;*R4a@O$q)$N4Uf{F^0o-DEkEyWRV`oqO7Uve9=( z%>Kzn2Oht8sI*j7j#EdTTsr#5B}*#HN=F@AQlD5-TD+vR+s8g$I=OPpvD3P`GMgCa zIlDW~>=AM2Z@YbLwkPd5C$>??h_vI}FxGKOn!D5YOn4QJj*}IBkJg(E>aYLCIS%;z zi#xMEEfI->7`{13p4aXl>+Hi2aNnXK!hg?=bvnbmDDjfxpalM38u7jSnBz=acI;`( z5Z~=OQ!bX(Rt#x4W#Ke6q>e^dbYt0>=Pt1U0{U+js%x4$_M{3jimuRE@-e^lhkUzQ z(GPaDFyk9f=F`5>^$Q8E(9aD_0ZA#j9CA(iU^a9Mu<#SMy-G z?t-IYZb?VxA$H8d43b9KNsQ>E4kV4XlNixSok%L!NsQ>EuB29MK}zeiU}0M8vtVI+ zyqZJ41qk1)Ln|xa#pM->NNa%)yWZ}7dsy~zM)*|w$LO$KUdm-Om$Y=UX+4gMe zscdrYp4rUUqiEZO`SxtGI5(fnW=8e?V(0&@Y9?jH?adajUca^7XvdU|D3Gk%AX!EWin zmEDP{#aOI@WuHtoF|Rl;o*Ee|qpFhqow01fkF}?_$feS$LVJ2%c|7vs*wr5^bY&AL zD-5d<2EV>0K4p#5=Zr9GF~9ni6F&`gm!IC|d>m!MI+I^^uhfOk{;k?l1r%QE4~+^& zqja4@9kH~p4@}$%15@q6huFs2oG;L3z|T2rM<>zTa*p(!8heo!W+(E(>_c9d%{J#0 zYV1TjvXk)09>F7`5)RJY?Y_hL`i!vus{i5SljXFBc zYmTQQf=h-JTX&j%li8n5(sHVMi>W1v(kM;CYCHDS1hh<1kRM?P%jQ0DG}6}iyJ}lvjj1t$Rr{_H!mPS}OVXLN4 zh3T%BS?kziN8Qqly}h_t$rML$Go>lc&?eB0uDwvmCMuH=!C?vxLz{w(DRq>(ol2Q` z+WPluiPT<-trv-T43dXKh4ZOw%I(>zE1Q}$t-#>4@%>A195ZbuXldFZ{R^{g?ddXV zKiPkRIa7>S*rG#HP_AVE90{UW$^PA&WrC<=f4^jEXRsu}41=SyiELYCGhKAFn#`zt za?MzaiD)K0kW5$lk@)LuvTqkOO*AV9CUV9gurq#ulE2)>>?J$aj7kn9le)7`8P&0-jl|*Hd_-COEJe8=Q?elLU>ZFJOh&Yu8hSi@Vc2A^htPO=)o|?xl9fE;L^v5 zPmeht)#^H4HjHWhDJY8{W{rAz*cd!0R=gKRnG$`|VpSg9kqcJ$&5xPLYYXCFEL>fa zEZZ4wX@Of>JEHFdFV}At#HYp!{kTT-a%vq93Un0pVM||ThZTky6R|V9K-Z2&5o3Co zT{{|OLYVw`8FSX8=EuvJYbE=j49|1h*Cq;3W>Tz*D~Lp2Z!BJufM?W$wQ&tQmZ;%! zCefFffHOGcC;N8N$5^}!|C*eFS`a=?Kyo56kj6Qf6eRj$g`urk3ld58WeTVYTz|zJ zxDQrvc4!+MF@>0kLq{rBUKQiaVOzwKmF++~*JM%y;D}#O>+6}A)8!O4*6o8>tAPdE zWaC5I5wQBFsB4g{bC!1lXH0nt{D23X z@)WA+au?9^f}YV1WAXYehP&bSJ)+CYYxwP8IMicy2<|os z+o1%>+R-RbatPqb+OY`6L|Z9%GNv{f0nK5;WWGDsy|yqKxMJNJ5E99%K4B|lI%^MT zSJ@M!_GLe*a4}j>tadA5D|;brN=zM8m$@UEDlR~i!vERp|yR>EV=BP*s(_DWQntQnv56+$=9oLoZ_V!qFSUD=!E*-SGo^Yck5 zLA*jC_s#W*2QpFp0L=0LjMo`czwyFd$o(!O7$%c7G&u?zA2T^?XnbT$^%-b^WbErR zP-$cw2Zq)Ul?`EMGcL_lx4F;p1Zi_BdFE`%LYA(leON9qGhWgq^-23$NuRGz+RsY5 zsy^vsNQzbFFhfjz(NEhSj2aNB^_T0p03-L?^<3bP`y-z#21iFH_dn~oa1to|pTX2k zw#w!V3)knmQkccKF?%U({t@UE3Y(C)?pD%W!v@nED^2OV2LDjby&elzj5ZFC_g8 z@78BvNG~TlgytatvgMGBm7JqYsVb|)}#~b!#_3Yye z`)l>=#lk-GL>yx3!TL0e16a^CX}_pX!+;Q^y;`4!ks*`qIP)aIOeH--`A*VLbL-RS zCH=H*>eJ{Z{j`tOr_oPlJK)0W*-Kb7u+Oe%FE#9|>e&^;{$@SGGOM=Rg{3?zII}yNltD+CtIQj2HFYq-hb*cm4r%-I*}4VrSYo1;$ji zU5s^P><@-+=pThfC)Y3+B>QNe&B3I6C`b(|GpSaWR69&_FRSMsuDRa;SI>t==0@7{ zA#@F5J?N+R$wA(+m-f8D&r%JKn*sk=T6hy z?d!RlgWJ@^X85ksYE#>j=^7@+iT+fwT>{CzNrj7h;E(#IiSrmb3w{pMk38nmn7Lwh zjqA0zJqtMma`h~vJEj;B$JT*66EYFgu~g0}!|IqF>d8YN=c@31PIrKpb7Ja9zYx+j z+1<%Lww}$NPWIw@HaoeE4-evuTqi!Nyczxx&GFH&CHKkoV$sHZv9MFzd8tjdre=rW zWpTBkPC@=ym2=VZQQ&Y3E4ZH&?i6w{9r3td67Htt9vg6fC|q2k)N$Vx?q=k|AA1O? zc1q)n(dN3sWn(MD?Rt5)5-uB?&D~eHY-~37SmCm<+1zu5%f@DNF`_|->Ev3P{ZP2< zCN}qX!e!^Mxm_6|u*=!pe&KFOu4T!cg}W8G7-_t+9V%Q5WQj6H6p#A};cgS+-Y8s7 zKkdB#CR~h~b!GdpaM^q868}cH>`HcR{#m%Z0@2IA1EZ%-zAl?3c7kyyj`pcCn>2N-7G6(6?9`SmD5q4Ta;ABD(IqKDvT|u zlO>fgE>L)>yc*=W+e#{9T;B0gd8IcnD^}$Z*MUn=;tt%)E~Ydqy|RK{l&n<1*LSN; z&cQWFwL1_~Mt?YCk+Q!?VT?;VS_;RPT)KSC#aug6 zn*tPY>GCyqh+O)9aOv_bE`2|^borXQjCtw%!KKT$xb*$t(&cOJCzzMMA6&Y8i%Z`R zE?vIGrSAuqF5lwP_k&B9Z*l4S!KKUBT+xiaA6&Y8i%Z`RE?vIGrSAuqF5lwP_k&B9 zueoALG#Ya0@-_EVmW{q2T)KSCl@inUgG-lhaq0WPrOUUt^!?z{HEQ@%eS~_wdB&}TU`2n zaOv_jS9I7_bLsM}y!8FZOP6nP>HEQ@%hz17Bz-@)bomySz8_q=e2Yup4=!E4=1RTM z_k&B9ueqN@y`5O2^9P$g-)7VMgH5MzA=CSVOQ)~7r?Kwo{lTTv*Ia3T^#0(|>04ZS ze{kvaEiS!3xODoOdpdFH{lTTv*IX&b{+dgtZ{?-;M_xL8i~DiSrPJ43vE_l9OQ&z; zJxFuu^eryEKXB>vEiS!3xODm!cdq8r>04ZSf8?dp*W5E$HhO<>>GUlwy+62g`kE{H z())u;r*CoT{ki0iUYdcwk$LY$IA-zRoA(|oz7j*QHBMmOD_l%M>qh<02p7}0I__n{ z#q_O?`$gfN5aNDKxR?gmbC*8)<pl;w&CC$~XlFETiooqI>1Di_O zY^nz~wX)gN4{WNX+2SRrU)XMNVRd%<4o-bQRuE=DDri^`*o;3(t|8dJR1So#Dc@#O6R@d(&88|~Qv;h#T>@+H z+6n%>&KB{Jv<13e-JB~gTo}}DS$+3H0`qGL(p`BXxXiD)(xiD}AXeJ$Gb8HdP812S ziY-BHCR{j}I_|c@1+r~d^-$wl z1XhD!J%h{YwYaQja9O>YtGxp&8f@0D&1Ox5eRzn?ss@`iZ0BZOgUu?o*{p1^S;sb; zwGH<7LTpwy*#8w`v%bN8*Jn$kXMKYknscze!41thSl{5Xnzb6znU-rVD^zm@mo9p9^t6C0vYhbqHS+?!_VQw}rbR#C<}zmxQ>#6YixUE|$#D zk}nH!rwaG-5O+`Eem=xKQn*)yxaSJ@3nA`R!o8AQtCxODxL1YpJ|WzzL)_mB_nLaH zjK9|f{fj+iMs?l8C!&pgRvuFHfsxPR+7zTb%D)Vve~RJuvtwun-vB& z>q)c4fUGcZSx zkz8vW(DRpT$+f)rRLOfCxt7P@QMlKKxcdtCOCjz8;ocD9o+8{EL)=db_a<_!_I!zO zZzdPh8gI<_ig0hK&uhkvw_peU!E7{vWqR5IT$(_0#YfT>;D+Wku-P|gHqBtOX%OV59W-0o3k?D;?V!0Ba56O-1YFv|%1eXz&4P0? z%$B*m)o&9IB7dyF%9IM`nI9FVF46V43g%y`QLMtvhCs$m40z|#yqVGAx9SjXl z4l9AqMxQ)ZT--;Thpo(hJyOt3?x(9u76XfH_bOk>*+2D!|# ziQMk8Cs-yrw6Kr?+$ z;I0r?-xK&|h|2|{SoQ7@SKkx(R*0+D67M0`>XCXa@!KKpL`+>`)q6u+y>j^-a&h%x zENS{Fw)n^&+6k*cw-f1+tPgNQD`%_^a6{`;tPgNQYgw!ha6{`;tPgNm4VE<42e_;T z&BY`#Q)7LA%WAN=tPgNQ>vXISa6{{KtPgNQ>vXISa9Ir+S2{WC1KiL$9qR+!(A7Qb z1KiNnJ?jHpR)dAh`T#eymcaT5dItN&KI|X#6U$Nd%##S}eGeVj7GC)jczk-Qf8+LS zVr6GCovNGz)|W@4Bc>~uHD)T9Bw|CXeq^bA#p1zd;0(A&b7D-_v1%KIUHR|~ndRSw zaJ9c5{WnIx=tu8k^ml&r-x=L}w0G|PjGpdCzsKkg{OALWb``wL4>Ed)A6>=hjehj| zjQ-J&KE&u&Mep1nFnYEheVEZ7`O*JiG(X16{0O6m`_UgV`V~L=D5HP&qd#JF`?21+ zk1_gbKl)=vpYWrPGdgyhm-#1*9_>ee%IMeq=o5_o&5u6G=q}^EbAQI@=ltkuMt|-{ zpJLRV;AMWA(ZzoB=Zt>Kk3PfbyMFW+jP5znJNK82Ugk&tlhI%K(PtT*Jju)aD@5TA z;F}Z9`8bY38&uf0yfhO#WfL^Qi%80!LA&WlRW87xGo4Qq@MOfnd|F^-S2CX*e=+>X z2tL$M$R=;fri$&-BoP{;P5}}EW7{n>X}e&KQ>W|H@@IjIz42(hcqWj0&jxSu?hjn; z`>5I}BhZx!wI%vc(TAlx$X)ju9z0?CkUlJvgbRUO`-JA4st@pbIOB6nI4uaCF2Re) zJwxZK@-Vt~rjB7hG{G@^@o=_2EZ2um>BBkta4rwM>~*#CH0RU$aK1iZ2PNe1K}i<` z!OsT43nh3EGklK0LhT|RG$d?I&Wa$LIoA)^?Ft=cZPvb^!>r`ml{(BeQoBlrS*f+F zb(pnUyGDmut+ka5SN4HvJCj34#GND_eJ#YRuc98R+qHpULw%xhBobym!AiJgH1?=r zGj{dQIm`rgz8#RSGA)6wf&yWkvdOVrv|mnUH&7AwY64uohbGCZUdWjCwsHC;CHMHQgv3^KkPJC zr9S2FU?&FfKyZ}>E7sn$vq^3K&E`m*j<9sEO3h+)r){-uq<-JB&yreB*mL=LT0Rr6^jHm+oz#brOqxsBdQ>dkm`y_;c)-jT38 zy~m5*cqYJaCs#Mo`<6PrncL`%b}+uicyzs+VTs<6usppdh~8he^uDHv-nZ82&D=)s zH1%dYy57yOMDIvgp5C}lN5A}vr8m}J8rt`5b$T}(kBrH$wNuu{x zExoZq)S&n6b$T}74SL^Er#EvOy*sEk+pW>@kT)Rjf0B` z(#M)0-IfW`6PO@7mkF}Hnjo8i3DT-2NJagJ_rAeMm9)Ao=1iq+oDoiJZSp(}!9&+W zi^|oQXIUB4*Dw=C23$QQhc3p1xUw>o;a55XF3X!|DE&%{z$Jcj5v5=147hY_k>Mvg z11{ZKWVmI7lmgdaEiyc;5iV?*;bx71>kbP6V>tIe&qpn7g!VObYp2XfHX7;MFqn64 z3}&(#PLesvCX&<(8m~3uNI_ir_0Pq+D9N0uP=hkaFWP8 zQ**{BU=ohPRG1Q-Jc}6&+ljXNP(=7WtnT>t_w*e-g}OHJl{!Pm`om zK_SKux7E({!;oJMB5k!Zf=IG3p{4Epe7 z=wHYbu)lETS5cfo*G$a8oLJRy(aZdBOQ4!6U>sL6I8Eni!Z`$nI=Qxtbjgx;G{@4lk6$18)T8??u(rE!Ooq&;3ENmqg5!qyM##houA z-lTnr+^;}xnQ|Y|{qVRTZy@&s0SqUJ+!H0~c+g^PsUJq$Kgo|IY85}+Ry)}bcemA+ zNMtc+ce18}NUDb0OD%Oi6gqE4osZKx?-Jw;AR?pL^w(0>?BD$fF^3Q{BT=sXM|hT2g}w^nU86oKQr*#fz0j1 zv4@jH=Jt|=EhLb+LvU_G*EgANgoG= zK68UeTWy{nX{#OLhZD7f5pJ$e9R5?mKKzS|HyatN&V{*Gk2@5hLv%=nj=~nD_2lSN zQ%cU#06^S$fTF!RhAs1M0=|qPK0U+vj{L>q2@F9pFR@8mccNH6lfxm>m>+BI@)wJb zP9U+ntvlJBGFkG|I~?3O;QJl20+vaPo-w++ZE@S;F^A6U=uR%~PB7HjeQyG|oK{~HahuAT7qF@NWT;1vJ_GGz+;ul$djvFuFIGychr>u+{f9mmT zH)ub91~XX=CrSHxU6Nh_?M~JH5=7FqH-bp}iM785u}tkvMv52b*1cDukCl|pnpuE+lf{?<|kuH;S~Z415<_aL^# zty4^iS3`UzQF#i7j^wiLgcIvbiQB4T(wmu_PssYP#Y$JNgXOAU0;$}AECYMDNc=hy zyK-@pA1xO*S)fVt-0hV+k$nwbNTU~=_3HJ&K+K$e15URjTcAU@p_QzBOuV;Vqu$+F ze5d}T3;XrQaZR(0*num<+wO^|DRpw$oR|}n*ZRSc^R<4}O)^&aWjCd)9GgIt) zBhu^J*%fSOMON@G<=Hr$k=cmUIOs95FC!fE7}<{z-tlGRV~p_r zF(Y#rxx_^9Kv6>O4>RQeMtGNtk&iRN8_kRy$OvyYGjb3kpEZ$#89CoX4q=2hznE<< zBj=dNJVu60WIiLjBgSlpGIF*=aNTEZ3$JvGJ>VK1a200^4SO2F&u^90~3YrCh-5-vYB8FZ=u!a(ElWJaL07t>JNU zKGit*E(b*Q(;#~Aop0q&SA#?jzWJo#oQLdVW@PX>bJ;`EpJs?VOPZgIw|kqxIOPq- zG~d9qSjqsN3qVVnC8nM0?#T+SOL#G*$KwZ_)3@PA;`E*-43W-uQYX9vw=I^noS}Q5 zZ6>h{T`I=snm@@G;BHD&$5Yka(ZA9wt9!7U-GehM-k#*$ThH5zyl>a@K1$wq>Un#U z_g(Ok?UipsyeuJVX)6}*Tt!ESwIzpcWMMGtL}B>8>I#(IUUcW(tbs-0>C=B>l8>e{ z1Li@~xfig~bjG!79$U;-th(3i$?+UfmL82p5RS%8^EP!uc&^?;x^y zM{3(&A{rL|(>92w?XU(8+oh}5j{(?CAjN5VlZK2+Uc!w?(4!JKUt-o&W<-_2-bk&cI+k77rdkJYP7I#^(LaO>#Tp3%r+vm5Jzl*v^O|HI) zl;YeP4=IU^8=T!Y4ud5&(qUd+Pi5RY+eCNcF@_^+$dAZ z*$-vfN$T+HY(Kk)%l0@cFkM{<({!P;ojDtBwfdz_t}cHOy!Ps~LazfIf`ds`j-$2k zmdk$w9FO;z|83>V})DTXy!o)p7!tegb!A0SR451ZqEnBybn_(LA=_Q9DQ z;LHthW+pf@6I?O_>`}xC`Xe6kiceE|vT?F-k@}d)^<#5nU@5+8lpwj?eHIn1b1HHgiK1 zGt(5zOjAf^S;Il!adwurc0U?Hyz)Iz46#)mdjPRS1^atN+0(IVT$j}3d`ToMyNcD%pLtbxe?|6Kq!-pCn^{TaA8n> z1o5fAU(=l%v9^E_V!VDkYM&lYO3uU``N}1%iNvZuM9vC)MW*jmb6a@mM~KzPj}1M> zAWPhLhIi9==*P{H@#0vX0Sz8!Zea7htNY@(i{ci&>|4hAszXeH{E?$-3lW zw{oWPEXaV!ljyGy9ge)Mjdd%(#)*A??7tXW>05pcqOn5!B1}HUCoZD7hJFK9`8j5L zC|1-d9@Kw>8_MJ*Joy$JhL%^sXbx$*J$E|W?yl=)50grP7x5e@M19^G;W)dCK2!0^ z>oE&BJ7;Lpf&r}SFf?ufrt)}YuzAn_C|qi<9gXFmSPpkV`;npcJ9r321{irkB4cZR zpxZD210!=ICRfS9I2a^AMmXWDHOMqM-zKxu^6#PSq-nS!DL;nJ+n+)JJpxZBL8B|F z(Tm7%hSoxhpWmfrq9Ai)Rldc$fNO`}0<^vS2V{=P+rGg&lf3dvV6~qxw~Q67jF*A0 z2(QmDW_~D(Hp{@qF?lg<8G5+AjHV$}ZFkc$4D94IH^b1FZ;-EH~MguJ7C|6<3Q zd`7(vZO7tm&qynDtcexqq1Z0@*16&oCz~?siMPcaXHVern>W(1oY;!RH5NoShc2r% zpga!Uqm;)f!yzZ9#IQCj2Eb`j%YMvH%#2U1O$MJiUf!uDKO znd>lvatu>y9g5#gL-zPPsy$TGZudH>x(@V%S4~`oZd7%We8*9*e*cc@h)tZOrd8{E zmVZK}=r^QW-NN$-j`j%X(S^=6lUrw4lWNx+^`WOI9B2&~b^SV@tMAw&{Ej`s@7UV2)pu+e5inWOBLW6aj0oGl3?(oMNq2_C z>hIAjad?s4+^~6k3GrErkk^DS#sYqfm(qOB>7*RyJ=H%V3of%>f!%5^OBi3BNHiq< zsdW;ZC=hs7HZchlYciKmPB!@|Ihd!Pj0%IF#pFx$y?85R+Mf$_i%ptII5dydt8_Ls zUtmrlNWNV-_;gxvp2f|?=VVit5GU7OrS`SofCS7;mCDtgqlRX^&d3JhZo zp;uw)d}krw)juoSsd^_nOS4`2R`#51S0E(Bq9kEeUc>oQvRznx?8QaiF8Ox<}FmSB?G;ab%xxszHYD=q@p%>z{Y`Zg3Q(qCT5IG?tOC$lBLlP`W~?=`u+v3NbJbbvBy|IjwY7Q* z`7Er}qpg+oOp^_Sgjiu~WubC5n>E(zv8^@pM(C0qi3}sNBgJ4l!eBE$2dcUZd#@gW#9h!>c4SPA)!$&oAzIZAyQ8rj8?Do~h$-xW=QB{#n7plY@86%tL>pTB4`NnRTgX zribu4&6wJ#89o)+)_+JgwI`gxQ*-y6bky9{T+TmfW5;<8mHz53ha!Z(=PI-2W3f`8_ljZG=slA88iV?@l`T>|u!;-F zDSeN$$mV?~M!>OknZW$)5GUwd*E}B;wKv+bdK-nxBs+A!>r59?H>HcJw~SRrSiQ>A zFB*-x_f6@sYNl}YQ@KgC17fi=2`syVF1i`HOnfd(V8`cqaWRf;L*-{;(Ec*oBwDA- zq0>I>U)Wo0R)Enp{)$}c0tl!ShIK6UGK`%1a+(b+J772MKw z*>1@OlZ^lfwgMNn$F>zG>E^aC<5=ixFV5(W;nW%pH**xB#uyImH!}tfk}ENs&S$)h z78pwkZu@oFkpho9hxkHaaaINH%g@r2?GX)n{49l)>RA-3yesNqTda9G_;9UOtQ}rv z=4Zg+X6+{8Ft!O+*20n!!My=Pz2?CVbRe$YK=dX|6Ou)yx&!XCN*wy%#8~Mo5OY=n z(MlUgImv>x$Es{1n3T0wQefayv^$@|VKR=nWi|=L-|{6KOB4|ftuy_zTd17N=0xRO zgUTJbPJ#F|%n+-xJ!U&F!%2(W%-}a>uE5+(gz`mx+FDhxFyS+RoRxBPf z>o9Z1pv1n;={?;h6}JG2#6X9&5tK zAUw{5mm@shgl|B2f(hS?@I(`S6yZrG{9A^r^eFI=k&wZKaKGQ1oC8l!b*z{byNI5Zc zWvkRbBDMc)seA1}-$d2-FR>VZBja$3fmOgn|7?r#cQUpYhBRFBeX6&~-bAyzXn{A# z$Orjqea|MZL*97GFuK(v4KQ0frBbaWrZc zo`VxS{;5G&8>h-@D31h!m&Jy;v>`h!-!l6h4cS>0Ewew`kezkYGW$yn*;!dFv-kA- z#g3iHTC_fw(X6Zkc79g!dh+jP=Vu#OPyR)Aem0SH=8sj`Tn0Lm>a5^Ab%PbY%?dwk zg&z;Xu_~Kbxu-?#zF_BM+pD1GhFg*?GByyHv`U}Y?1XMR6Wx3TojlW+Q;z`^%)v8V z{k!Di%e=98rJ-dP3kDlUxJ*}rYNQbK^M*&E?l6>VhX9+>3us8U?>ynG#N zCZ#JFm@-ozw7)aTn}D-WIDHdP-}~uscAuladsu?}Yw#=McMN{`9Gm>@gX0heGld`j zI3S*d-wpWPh~EiFUxMH92w#ie{^q>v5&jZ>_-dQ{-4A*WFusT5xj6m<{E?UizGKqg z#jywRwI+TN@{B;d3%`>Qj^o&l-x7p5d&E{@r-CrHOW{_s#qSNAdnrb8 z{>2dHG%jKA-or5qJ@{Eh{$&t<3%@ktpTV&kzmfPA@aw@ZhhHAQQTXxiXdK7kcNM}1 z;)u__Ie*2m4dU`8aac_IDgp0WckiO!&MN`ve+Z1;jq82Uc2$* z)!PAH&s0E7AsGaLVvm1M6FfXhyrjWP=28YPT-pf})J{0n*lr=A&LX*pc(&~XFKzJB zxpspWF7L#N>e>MBERNhIG)QbTg-pI04jUwp-sl!`E zyiSAHnd>rmT_HRdSL13|oNP*b1i?-txlkjnVvPuy#ro|wh~4-!m{f3fWEio-?NC<- zi1!oh8Im;`F{oqFvBx0x;A3GLF&jqgbUW3HKB8O!t2cVAdU_rcDvnbc7V8qh|NpAoHbK0h=p9yAQr=j zBi)he`~dN4BHlrAH%Mb$k1>d2a$^nR*f3&`+oSFi#Ak`~Tawsx5H|5TMAUWh;xBM< zVO(}xp~U+s*JsD&#v2*qa}$h=31JyoH>-MpY1-2i4_RtrZERq93>Pju`X=8)9ac&cXxJejsv^!cY2@o$Q*u5l=5fLu;0ZkSy zx|Qu|vO%1jn_>{Bgb@pFK|LEFt|eISAjnJ*>gcz5DfOlXanoGcAeO_3MYpK-#>t+y zB$%`(We|ODE~VbgAa0iHGl+d*#4+v|byk3QIT2-ixLqR#b?wj_^&7yGgvd58^q0X(+%SE zFyeR@qgbHhgc)_EMh!pMD+J>Y5w|diTjT}};$RqYf;&NN4Vd-mh)Sm&XBfm8xh)Oi zmSMz+?nJd$OGK3Q!CoPzJ#J+Xx5{m85VsB^PI4!yMbQzrF^JpbW*WqqVMNz;)pA2|;xq$-^M5nVtRW@%`Jj*=-A@LF*ePeBo?`=s? zt)YyUC}YNq{3=b1Wp^-$JG7c!xxH?$dLsZ#Zwag^B-?>#n~GsE3bXRpH(hf#b~jdY zaH{E)M-eKR{$V1-PANpHe!X~`xSObD0Um?lDchn&FR=E%6-mFz?qqdAfXATK#nB;G z(Xr8rGuSlOtKSrNin`Xv)02aH3HnnIuc*4vk@TD6&QZUu$7|ZXWlA|-2Fb}!Ca^SF zo{TB;`t?2BJzTva`01_8a=var1w>i&oqIFC*mwtOzH?!WH3;|OY5;?9v9z%ctY6eo z?op}))PmZ<7qtgM>OhJ@3$6F~o~a>qJcs@rvpW_pVW@z=p(!Zcrx?rbSQKsvH&2`p zv2zXKUQcppQ=As=Lr1$ut7AfXokqPbShrs8$dF?0pgVTFs9+1$>bWPo+qfee631xW zuY~UI;qDd<>0@>J)l5It9ovvTPSV{4rEf9Ei4E!Fb^0NtRY)&ANJ2Z=`c3d4?qDi$ z8nR5(S}bQ;K*B(iBo`{D;e5AU1Nc?cBuhr0E$22#?y!<2Pot1dBfmv*SD=H&Z$#*} zvNY<@x&jWwOLEqW(C!979U1AIMxs?}_quaK+-v3gEa zr+1QjlIq!-J#he3>$^2VY8HrvC!IcUdWA`$2H&i%t=`ze%%;t=F*Io_rp2$LspvMZ z!5eEyw|Gl*LpAFLZ$vkwnzk<5HE&6++rbidiQ3z@t2&G(T}pCByqu%k7Y6pJCd zmY#)e+|As{4cfJqU2!Ywd|$S%(<>?aCL`OQZJ-TWbviCA8@IBZ(l1CJC7~f~cVX%m zo1mQ1H$mK`4Ow&ryYt<$+tZM!>(`y=wohnCYhAjf?o!iYIhXpd#o9IU&$QT6+*8yY z(rN;`KEPJIL2^@v+~gnf}K=I-7NS-hc_cba7q;2zhQM~}UwSC|L;)*aEPAzSMz8*+zK4{AqW z>FC}$1#vagRM|h>ibR3&k(FM0(Y;Tgo$>qalT``H%+FX~mf zV(AZNdCr@_x4PCWox`R^qIzc5Hy*i!l`9Zj%T4+wsjW)L&1E9+^E$A8f#)G(iA3$%QsAgNf7q&oS9k)k_9-i#>oqC1>^LP7HNT}m z%<5VR8o=<@!YUw%zwlwLTp1`k17069kB@%UhOMyRmyt7pu-sK6z&8lc7 zrFRyGs8)sq-i5e&9E1(Dl|WuliAiyPJ(|GJQXq+XJ|yr>3dDOL)+z7-PvC=51#&ZZ zi9~e*+bma2Ls0EOaHKmJ*N}?79sLTIZ)D=V}QC9}2_x!V{mk^aiJsP0C zNYwOpAY(vS$Lu!CSAndur_e3^8y!@ML`?%gQ7;3|Cg2Gqry5k>u5}ahmZiGZ_kKip;6G#}M1%|0B9c76`4FbSe;6NXhp*qxPEsJik zM52}jsFxD;4ibjyP@~zEKDI=n9tu#O_fZ+DLye{@=WZnu72Bcyg1hdPp>5X*W`Q6X zd4ZtBTm3>*FQk}df}If5%LH<(9a(HC!6jhJmc~`55{Wt>KwU!A^GR+6sk2D5Uco(( zB@(p?0A^j7LG?7r%RcI&MT_K4L*2TgJCV-Rodml6;rBX`6&SmvS?ukf>dwO0n*lx~E1m*q14UL>(Aa$S7KH zXSE3Vi-n=LxX4=O%5#hT8>L$*f<#>;B7#}w4T!5%AmKW(XPJENPKMJz>A?CM0k>1j zo@(`MNZ>0JxOP1PU-1OK8dczJ6iA{*?c@!oy495tS37{LtAww40{&(Rqw8`4HuL-DPV{=O;J!^%5_L78j9u@o zN8RkOkunv15L!p8t$T?|qMi;=U#UmMElys2Z4Cf}dISN_C%K-eNM-d4iKZ(r3`->HyMoG*SN)QJ zyRsp?V^D`VN#s?g+*nk(-TYoK9YKwH07CDhwpJ09L@fe<=>-=ORW3;xdLO9YCn|}$ zK~SX)FsSY&`Kdv*FXhLX$#{G8nc72?LZW^PKwW!!{C}HL3cG9FSFr#>B6;y25S2tt z13)X(;kMt0iAtho1Jz8%8C1uRoCD(9nYyB-*|Ra0Qf6aREYb|~KPZqyT?_1@x*Jp* z=K%_Q(iX^;7_DhPLR1p<0ssmY>e^PQb}^`r6ax=`L@NgOZkI?@ZV$iJ?|`71OQJx0 zyRjJ2E*2@iM4~PbR2oN0q*@ju!n_L4sW>GPb$fvNG}U~Aq-W2NuF*`6=YyOQiJAt0 z52_;Z6p>RRQB=^b$dCbDa{2dN@FRo~W_CKqi2AEpe3$ z7?Du%6p~XSQCkB**MmBOfcE~!z}rM?-*}S9DUql%0j1lFx|XPSll&CK(^b|gqP4`e zL?ux#hEUTV1?nas?*sKcqLQc`0AO^TPrxN4=f6KxJecH^NYu5>Q15?#s3V9phY8=8j)T@BSvb7FoslFOYLciV>eK-B3Ze!#%j_pYRz+H(=CeU15_LDAa18?*6kc1vTo=F$E3cUc zRM`-yUZ56H7JT@)QHey2+NYHW*=J}hO>=PL;f`uMtSRvcrV@!dewZSzjVj_$ ziXc&s@f7s}sF=qxKeqMk)MB?}E@4`HUI*5{Y{e($OC;)@mI7HHy@A=RfvLn7B}f+= z9aZ4r6iA{nv+GM3JUFsr=8#qb3!cDYRDnlOAc-;QCJ@_bQfxpCO6aYdW}?r=7f=d` zDOMmQC|0QXc~Ux}OIb)MBx+EMM=5GPNzgk(QoLpU&gfE(q!bc$Y9M6=rQAYtCkT5E z*9N@t)05H_UCJU#AyM}OPZ6x*l&qMt-vX^h+7a>cZ2AC??J;brMRCWqKrp;nz%%w-Ux{xx}uyG zA~GL~C}Jr^kf>dGiV7;frCYOGTgj{ZjiOfmDHKSe=8Hg?E1im7L?uzq9O}xsk{U!X zaE|W-^%F!TQF{Q&z5qQ2akU(TsCK9F)}*?l`*c3TULsLf1JKy{b_%$k03;^__&=zXj*e~PFi>h+eWXn7Cz8WOGc z_-2L@iQ43VR=V1LA{r{+^H3sDdwhVX=Mj}eE&2da`Ob(EiCXaiqMlDw61mf0t|~)! z8pN)_od(6~0g8B~2GUnrr{?#r9^9r7yFM;aZA8>!LpZ9OFtb!$+J`)QZeBrk&Wdc|19P^9MZ1)`ED z=U~s|y6;RuT+Id{mHH$HOJK<{x_y$ROE-WBxsm2>cYZEsUl|=Odz^=Wm5m)>9r~(bLll2^4OP6sAQAyMy zA5|?U;7XD^iE7%fcuweQk6(xAJzd4pTpd{d!sC}IkVHKMY~xK{q%3*l^nDJ)w-S}a z8it24*iaw#`-sEvS164{CFc2Mn1rC3NirLxR~+}Sy!Tg$O7elC-cD2!8EH(%X&7nh zJfioUe>Qrj{~D!`sKZcryK$aDi(F2Nth{Ed3}x~zmq?BC4x*B%+k8~@3<2LHNzeBh zr!@JfQ?{=Yl|8~~VheLVs1B6-9{jqb9) zK~xgEP5hdG%~~3oTO_-Flc*%>4M1sKb#Eyg3g|wNUgMkebSaVr?j|aUVzG@~8!ccD zFW&NTE_zG*7NwAUpcc7@s3dAP6y9#X^J$T#@6RINCMt5bu^ku;m2r`3^mETly=q zm2M=F4Wf@CWIuOko*w@t*zRQaBl3v3oo?O@z#X9Oba!?`x_JP4VQ7!fhW#niz_ie#woQv``RH6%iM%nBpI_M%pg3BN+4^e!|h-9++zl5mSL9p-OL zJC}r4+YPx)xA{5J+%x1+zJ@I3y&57;F!*3vLoU;YUS`^bL_4k_i|Ihz@mE^TEN3)i zF&&7HXt~F^$26py=h|;$`T}>ShV<4Q;UOBIL|q#){sV}s$7pRKZASa{nW`j8ZY8uOUfE&PV6{0|BHZDTh5$|HB7yUabLF;&0q$ek;X ztu}e{lWX30^boOsPa^Wd#&gX(k7U3UWyFLH*+$B%k=)JXv7ge@O%?9ZuTPTaBKZ7r z>71t7vN{`|$#HA$;>M!obOt&oxQC+}Gvu{0L+&2#zKyA)^yz%W(B047yfMRQo#9n# z7m$V`>$i=S#DD>5$Yx%1a+-^Ojk3&JMetr*H`9>X+I##*47!o1GecdwnfI_q<13?j zk4GqiL_HP~@jT+{O^{w#sLp%HLZ`|ti0GhxND(Az2b^L%sK8r8Li3^Wf7M$*N=-@B z+>oXpy3&Sb`=KlS4P8frC-~5n8h_egnSZ4#{Smu1iCPxw+JO_2Ew2CaDdS_*ltf(- z()4b`y=(D$kL<7K;%ir-`J6k(J<2VY-bP!sCunB8YIl!u&u&OG!_|)N;qp?KhIDiN zy$9akHohUzya;Q^-N)UfAllbVrXf*#6!%bf4qjmuR@hu_FLnE{AP`P8m)rV+ zI-J;geEl&^O`;wRnc80Vh-_-{1@gq6T+1}L1~YYj2vy-Og4x3z#7vqw|H2!1k8Vge z(`C6}+RWXdA>CO1NUTU~-;ikL$DG&UJyC}@q#Jj>g6Z2enJ*dpD|eDRt>NT4`-h9w z+WxQ5{v_&Uv48LufX;f=E8%3XVAVBghvDQ<29{!s_~UeNM3%BvJeqNV`b+CroD zqQE1X2n?>;*Ebbuu!?=DM59Oscaq%=TifO}s!F0xg;x66M{{qHs(R0s*|zcS0_LMH z)Bc%KNYoV~MRr@*JPXnb&1L%cAVRb1?<*bP)xg0~Yv6SXBvG%6K)LCbI}){a-zF-F+6}0ttt~=Ookem5NUv!X(r?gZ0w2=SGyQ|8B%+|*-R~mm zqeNZD3(Z(c*%86Z?npZ#-l0Ge^&GIxZJ@Q3_3*ABPlNOVORW7M?}JC`GVc9YgK{3PIjT#(9sZB8lQi(*}>!a%K z{Zpd8U{D1xI_e0bk|-)@-=Y#-*BVrI5NRG*jX&0--T#1g>hs0pHysO7${+T?do*T=Q4!$oZ) zDv5dt0Jh2NEMS}58!AUdA1e8wuM&xhE%LlcU<}V9!`KJK8RO) z&6-OZXG(Kv*Map%@eJ9R zgelWl9aw*vIw_FE2n-%c2?U19|Bg)XMQiQM56Bf0CndV_(~*d%?F6eZ~B!;RP6Wdr3^mPphMf+|l~+>c=3k?VAiHVGR?R1)>1pvsgv zc!44xMyf-N*7wE}l|&KB%(Mjc1xQhEg8;Q|bA{KQ$40mF1WF-Mor`@bn;@uXUh*|H zY*02^yW~nP!W?NLQAyO+fHE_$1BkkW!(?OPoYh5_N5W`dtD(P4de7Lv@Kt zqGBib7GO{nNVWu_uC{-+XI?C&45d^o(#)$wfh6Y9ZJOz)OFjsvILD3 z^W^d2PXMiJ&85j_MOrVnY(mXQ)bb6gS*s70wAO4gH6u}1Z&=N&ucbs=qMAa@NYtI8 z8J%!Yk=|70Us0QzQZo|u&<53P__bN4W+dv_4XfF(YjZPdMxtJWX4VtYL6vftvi;2e zQs3;OW+We|c?ArDh~*=?2wo__aBW znvtjrL^I!?Sr>Sr9^j3%6QhrTn^Ovjd0|5!C73mYE>^vr{*$6hnNBGr>L$M|@=_!9 zIO6KJAl`(*yNI$ULy4G~3|$6@NRy#0D3C+6TtGw`4tJzL z5_R4NHO26o&rZ~gL|wmOH5+#G*_oP=sC%K=|D`LCS=5X~{c?k9HvHP$g_@D5wHsEm zVb|ua)Qm*+E}=8lE*>nyjZl=*pCvGM7=1evg*B-fTJoP10Wu% zzB5~Y$NC_gDaH7h4y^xn-QE;PqILzgeZO`t1uoG7hkF-zAEJ_|a{yqLs^ukOR}gh; z{S2dA?08o^!TLqZ`{1*QN}{d@iZ!IE`-u7^2#kYOk>=k=-^9C@IXUXR%zY`4L_G)W zqI!#B5=%iQkPL!&wIRibR>%7hl|=0Y0E4=afTxjM9!A9?as=bdAu5Tw9smWc>vsvb zn&btd;!<`eU*Sl*J?0aYM6LBv#b?yLMYHZDtD{7M8gmM?h;oPeP>LW?d+-!dT#JzR zXdVWpuGL_Zh7oaUR1t?!1c|yMBw`if>gm=ZUXCi_aEc&NB~@RFEfH6HfwU;aLgtTR zs3RzXL|qXQaXUq6CHB~iD0fT+h1l|(%ZRNR=wWHlHxCFJ)g-mzc4b1_0^J(j2> z>Ulx+*PR0B_kp^Is3hvX&1qNe6H>n=iA@KQ+m7f&4-%RrnqxVRs3fvS(x5i%ksR(` zo8yT}qRyM)>v|J{`WETK2!$*V#R)DZDv5HI5!HWoejRodF_IqXWu+%j1c@58p+uZa z5hQ9lMCjR?1l1hG)$t%<+t{MD^rCcNYoipCYjh=!Q$LP za-Ur$X`qpYr=>(CQBMY_YY7;?wzut^_+s!#P2=+vL81hVsImspZ0FAVNR#m(NDM;JhKD~=QxbV_ zt2k=iwzfv9^*uxNfol0OwIos7MYg9NVdgS_lveR4iXf5i*sk9Y!-Ri@@FeQ;VV2;o zs3mxnB1q)JxKT?G8U8iGlc<-5Qv&qN^l1_6;Lj96B465#RD$8azfO1(wJSAh)$!|k zrJf2MAGHL3p$HQBbZ>+b$XFK{{td#DsM{i!z@Nac&##E-Z3nS(3rx7e9OhKQ3PciToj=Hz|T-9UmeJMCgla-D@L%i0E$=L9&hy5j7VP`9nl+ zQ3T04p5kaOBJxulf2RnNb$kG(xroRgfO(rDNY?QImC@pL);kyuv%$VgcoH>8_!jq3LM6be>yB~}6KR!iEk%&1W1^K{c<}EL zo;{0PF6sOO`XKpJY~Z{EZxf<*P65xJU0MC1?B#3_PA z%^9YM$e-0oPy~s(beJL{fAgk|B1kse7?Gq1k_|UTq$q-9!;KMXiXho=V?;YekZiaX zm7xfd4cDSND1v0ejdYz9L9*dSx-NFCpn<7XyoR1nw5hNRKyzZe0k_|VYW+{SX z!;N_SmSl-U9zH4t57`FS;#_{PKSep*sWQJ(St3ynh%;}t)v{j1u;)(vK&5=8Qoe85 zsuXo!e;n>-LHX&+5{dflI!a-SkhLMqpCV8A`PIu3i99?toKi%d@bi0`B@*?{FiR0x z1fRPuk;wDSRw=CQ@1c$9rY<7SqxeL3iA0sEoa8ibQO)WivIu@bu|%SF6%oyLdxt*2 zX!^w>2NFs~y`bA_B{P1LnM7~>TeOJA{ck_idGV|wcRefC%Sp+|6St3!F zi=mor*yj>yAY$01;KwCPB=V?3G59>8RSLWa#J;s}O2KvfNOi%_R+dO2i||SjSwx8< zNaQ1n%}dd|UqrqT-iRVdB8%{RRAdpo6hWe1*^*ta+1^|!1+OVk=Ru3QCu+agm?B8j z^U|W$FT$&f$RfC(szf5&v6`2Hx=UZED@F25w5TXI4Y^aRM51Qmlqe#+QbZ8ZHz`)0 z;W(MTDY5G0n3EWPbl)Da$r6l@KWc7`yuLo2=DG{|_VyAHS*TOd;p5XsI2HDM{FR&$ zj&t$NcrbSP<~Z4kPOpz{;YaZ<<`K&W>!UOLs6cIrXnD*CCs`gxGM;2CNS~9Ro^<%y z{5g)39eQPBCz(lBe>&Dl#A{E2av$ApjuXp`D5arS%>_SxOvS-R>T#&rMdJfU514ry-*_S5&C|jGXGT6P-jsCs)ZSc$v!h zia-XXcclD$t#!Ek?(8TAKrWV{cO2z@ z=7THu4^Zy?L-qc@SZ)+qSL+8+BDUlI3*||nx;~ilB%C8rKL?#qcwQ);bTj4AIHMz$OqIJ3=!~Tb>2e++ z-47DZF`m52W+R+TGm)8Li!8JdnV;U~oa4!3`QZ0Zz8n1VB?^Px33uf5_O`-cTbny_ ziw?EMPmCwp${oYfCDBF$6kBLRKM;40hdv*Ny?L`_cX++t()|zoKjOXwOpdDBzoxpn zs=KFWsp*;SS(3~Un4##NNyrRK5|99bA|NUPP6i<%Y=!^@)d7{B3PA-C0|)|QRKTF9 zsNjYV7ZwE<5D}#4Td@(dj0b~iIGYOs?GXDXAR zhe>9pVWa7}YX=!e`po;uaF0oqcb8!<@VCK=Yi({&sRvJ*FzqUW{3jWriqb@vB7`hR zgbfyym;G&*(PgNZ9jkgL!x1TJq-Pntk^fkv*U^%Mw>krpMW=E~TfUXmyB~U&YYO)0 zm|b3M**#N*Tq#={uq!TG)|yqL1=RVHPSkk~wO(1t`pED3R8;X6?DO4DWwN!SWmu9J zdKO8plI%Ex?w*#@ySO#jD>TmO^G0mLj>w$em8*rw)S{`5jXvhr|2}d~4|A(KQ+kgOXlr?GJl&ee@b5PxTBc4Zq=j*_ex={e*{S{;T`l(hh?sH5#uX!>JVcQz9eL7?3 zCLQR#alll}`5ultvc{RfPJ%B(jRLv1f_o7%g2!YblH>OoM-sHBZbEWP6*VhsJ}B7| zB|A~GM3$oJKpvjVIC*3#lIA|NIoo(Il4BWZPOY^L8w%wh^GKD|=OE^9G8;IivaZo- zt1N8bND3vo_J&HacC=>DR+~o#c`^`LP}gr$#l_%(SbMA1Xdxp(*2?k?<>J!IKwoanzf6b@``P-!iH1YVaoYB15+bfz|HOmzNYKNoEjj+wx6=`it9OV|w`F%oR+F3<8 zG>c+hGldkTq_$$+^Uptz3{l?>z!3I$cr}S&N_SD>@Jn)jKGrbx{lB(1Cwjt7@On$74V(fzb1dhXI;BsSTxqvpkI7?G^S#`6S3HOHiGOchQI@xevI_*}t zRNQR13@*#nGI%-rD#)GL@DkwsQDhT+%3{xybxOsiN3rQqYT<<_OwBiMAVd^w)y@=@$E8!X7t4GzdF zE5{v)P|F5OJ>#49F5DG{-#PSHN!w zzcu*ngCD0k#2<-Y?TyeM(U44+;VotoroHKAWFx}1cvyu4*4e~vBEp*962ay+eJq8| zc;kZ2Z@MjowY&+zy4I$?7;S2u;(TW@1c7jF4@$mPF{Qwq&ECNfebjOawRXw1pwZR- z#O|3u8<2WbaWP+t+@jOKvXB{8sIX@>Mm3>6?Tngb@27+C5vL;59#3Xm8{zyh=JdJ@1rLAxg^ zS1ofJ#sKW=XVCmlgB~os3IJvuDDV2-Q2lTvXqCS~(BB70v#~qE{e1-_>C7N+DT4fE zbB242x_pkHvcDg&70un-A0BoX_GouH{g*`Ov7;2a95Q>FWQrnUPJl))d1$brMt4nl z{4ct{{--5!F{dNvbmX86mG!D%q*Icj zIuHp2XEcX2NlU$p`P1XyA^h9&ntxvN*Ib#qp+BL5%KlAI@8!pAmw8Z&$5#Eg(e+Ei zb-X)Bbwei;vL+oXWUV-6$RaSkyzkh1(V z(iw5K+xLUKj<#5+e;AK~?cV|iVOh}Y7IhtX}c?P7G`W5O-e#od8fEBx35MxnTL{jW&bAZb-`c2seiN6u*LQTZp2 zuYt!IH1$2^4V&%6~&|S=N*FbRVzwm6tmGX4-fSEZD&Pw ze5KL$eg%)1nQjk_k&C_qn9qC^lyfieeLv>uWni-&^k!jOS8MPHNc$Yo#3y|)Di`g> zD>EpMQhwQ|EyLJe+OP{6!*bXgW3ac5h55p8Fme%gC_Sv013nUPMZ?p8do_G3;64pM z2)JLvzX3d;;gPps#HHb*0ngX)+W;@n@ZEq1^V;)wdJ5Wez+2&I)t)oyDQeFadfK$- zaeCUd$9@|;9on-OJ)PP!Nsp^NZ=GWDodPNeg5VK&9KiYy(d7J>BkIztg!kD@<`RIKekF+f!w_CR z;2dDC(T6x!MyoRxkgcsOX!WsL|ZS7sH+sk*Oar-qW@)Kr* zDW!5T|6j_+6cUhB^7SW}gQJkh(r=^m&4$k$+z(J>EoHT^$5W(NQNm)a(pB_cP0)6; zuH85~mbU1>bc?ma2D^&2mkzcTYX=M#i?wBgZN=JNgYCuI;=#^htvc9UtPKzL6l+6+ zSXdtz#F}+^5M15hHZ;9Vs^7>hdymbWtYS_!#b7EYxffSV^#>^bF_6ESDbH7yws=Wo zX?FqV?vi6R>PRPTYS9ImC1+cADHqHGbsv_x*zZ5tf(WkD*c~M^TxwhPZ5RRAh=nw^ zPoumCU2Sa7Mx@BBYz7<|+wTI7jP0MuSlgl9-kuoSR|AfW?MA?nvAq*;WNd#2I5M^i zE``~OjO~&1M8@_UdLm_{9?&5;H!%Czballdf>2OCkwpj=8Z z4uOg6m#sLnfzq;;U4`ONAk$o=#M4PL29V2?vs^j*!HJ4z55Vjnm2U0AWdR zXDnaA_%N=vKc(WI%=p_;duD^+i!X*9i&}q_X+Tq0ZKp7e&5{PeR2rJe{>-7SFKAH= zBVRGRf-pNqln?G(v%G(xVC&yuGOt(3oXTV-BpHIUllj+JZzby!6zeyT^$*0d6C`V` zySn~pJ?f7$#)&G%TE@6VVi07E=Bma-g;kwa)d^;c#ZZ5YoK`7LXOI)Jh#Dd|H>dh{ z8Dn)S2KMq1W8DkJK-##iR~2b_dkg-7Nf+|rvqFz(#?-&ZG*41#Vnksr`#h|J*&s+M zaY)x?-?*Qd>PVol@B%x>?>2y7S^XZvr= zc9Vu{!NVx&vtTjRil-eMbs1B`l7p>gBX)2KFjf=h8elpy-YF2T3I7S=t=ahdfe#+R zqlx+nAfhy$1>Bx(JcJ?}a{}X?#yMC~Ey8JvQ3e834}+=+znj8i;M$BoSmD1t6Te#U z(~lB=>dZ_82vlO3GDT5~tI?ED*7>k{X`GER3oZq%Dy)JTa86>U=q%%K(51^ZA&>I? zQ80Mn9Gd~>GtC09&i?m&IX9ZgH)9<9qU7x`XBL_naDMfF$&XXCnfxrglGt3HpNoq> zD$hq*o=v*(_7>xuYzotEjqcTM1^xo))@i8w(GffN0b;c`NBcEVPAZ-qls8fPcA%bn zlEB^p!C^b&@cNx`I2#1PpS-4aVFsKTr%Q`#Q~S@T%S#Zmxm|AoCY@Br{j$?LQ9n(v zqon^$^~+B0MEx|uj*|X2)h|1}6ZO*sJ4*WBRKM)>PSj5m>?r9MseaS3%9#Pz64O?g zHW+71cVaU?1P6aKPKw>lpa9*fmU>GqF(l0SofW&AH;9N|{=w}T2C58%+7|j7(=GHOr6~2Lxeu<$1 zBt~-p*O7G$>@N+3^h*pCATgQ)xR#raLBGUM0ZEKFfU{E_V?NWMUt*{LiP0RuwOk!z z0b|fFF;sxWXb#{~myR*W81zdF6(BK^0PMnDP6D`BM1)r-9L6!t4CxmRDnK|i2fTYm z4EiO83P@ta0oNok>X_k%^h*pCATgQ)u1#XBXAJr!h6<1vNk9gBe;YC1;GbEpufw=5 zoI(uqQ7*-LujTs9nMBqF$*r&yk~?LlOftgr1bh@`Gdw@RULauSmB2OxTtIM|;Lu}N z;Z3rTpd2c|!JK!{Q$LHzy+y!LZ2E=SpwD z(wL7qx7m0*P@}!d_0Iv(Xsh;|3y*1Tw?Bl{i)4R2WCTSKtU(%nKr&%d@#}p|^bk--M{upF5I{z~FMg~yE3GoUz@{I=UykmAmm;wb8# z1P#kx8Yr$J#d+YZc*JG}JdRU5-bIQp$2{UgFQDKaIC$X5nO(2t&7bB@DqR-th1)1iR`bR^u^n zA8V;vjqd^oehJ!)w*jfB^9NO)DR>aNe2(aH%pUS28g}IiXqcF&BU!VrWftbpFrnC? zh6%+EHB2aWs9{2}Lk$y(9cq|R>`=pmVuu;6$i&^)mv4STQJ?!Ts zXbv3|iXG};LZNkVmWByMtYOOdjEB$nBDBXRp_96joM6V8zE+=*%IYYrT()|~O;H(DRx;j@g}(LJ3F zefLo81s^t~FmJ#20+;yv_j?EY!E zA?@I03}P$u-oeNIc#ID1gsSSnA{P92G6L4S3yKNjS2w&2ty-OxUJAL+h3uL7iD;Dt z8_Kf@`Kq4{pO5`?yAE#wFP=gIWi)K3Jk*I}SN=%|MgC2BcijgM%l{=%seVO_iq}9L zj<#T{iFKk*>%3$p(Hxcs7QZlB46Z}My<)AZkrgt%8(H*NXH)0!1KJv^VPbco%mU)s ztCp&5H8Q|h4NIO`dD`-H@bq_wSk)l-3;1WKV0K_!g&w-W0gZ=FjqiJ84D1jZ7-zXS zAGG0El$wVQu`r4^5(5j=g$~0*-&JVEJGJQL3exN2h<|Nx%+J6NaPincDIlIqYx~TA|b70O=$r0z;q0ZA2FiDIh3D*pw;PL zc_=JDv3xZGrzEY$QwY#$YM)30C7GFiaN=A^DQT9mH8lxV)s0%0pE3ceo%`rK3nTXE ze!(T+Xg8S0l<;PQV{GP=uFfaqVHr#~Fb}FQE{0e4euGGhUS({$L&8AO^msQ>5m^=( zHLLm&W0djH#}}Z4kqI2|&<>FbEmg+9R#d~E$A-}!C7Cv68I_4SWyQHRv1HVLbw*S4 zDU~iWmn2lR#?0=jnW+yWIha&Q)iEpDHVdKcUk8!w>KSI^T1YsGVJKazG02wkTV`^~ zY;fwqJPDBTe--8ZN#xzde|EGId=6!vl~b2e=31eH$AQ*kj*1k8bsoA;oFNbXju1cO zD5Gp@AI1&^ABt6w$%P$wSEotDmypP$!wz0gnglE6-ww`h#;V?chSUyahSK0uogOX* z8$qn)MfIw1j^}x-->!}awayrn zYGF2HX4H_$!QM!11UhBQJ3Z&2T!a31$1(aOM*W*0!al+N2rwHgf}uS@IrMHkY!3&f zaa^~ISB(!xxXuz}%j}smR#Qm)1sf5h265@eVfjBmMmnhp3zgx>|Y8i#Nq z9)(=V5KPL&Js5LH0%#hyO6mxZs0<*$v!D`i0BV+*%XkOO@UNKRM<0u9B=j#4KNw%d zlu?$ZaiEkW>O2z?se*V$nF)%0~?`jN28aq8QAn%+pj^5x+lCN1zaHi5m!4OZ& zaTyYyZ8@}^fN8i5;i(qR{==Lnt-%hy&M+||uhSly0x>Z-!Tjquv}|f$VktI)j}w^J zMhr+IzJ%l=Ce87Mcm??U*K}MCbihLjn6EC(bt^}tb zdY9gG=7FTR!Sa36pQ3KwjPmO;GX5(pRNs4GsBz;#gDVufDg}IYg?Bx$Y^ruBD;KhA zf@=`C;RlD?CUDlmIaRG(a63@PHV(`*`rw`350A!b2ymwNUQkY9*&(&~^6WhkeY6S_ zt*CIdUXeNyaow3QrQ>Y|r*)^EsZ!-`1{$CYz=gMp#zWg^Yv*U!adDNx|1_i+ffkDg zEftTbID~I`TfnFGebMRrP&DcN(%EMdu0XLjul?TwOnNUJ zsszl8o%25t)l5~m4toan%sm4;I0X21X9pYR=Yt@)0gt8)vZ1@wn)#qZ)95{pc zKj~z{r-jH0e=2S^{F%6R_>8zt_;a|a$iF1o3OT_*WKJb0`>(~#hW{n59sWjKC;Tnk zl$gIG+6sS9CmTL1L{|6*akJrba5?^G|Hruz|6-y4NFpoz6P;}MXNh8ke-Squ{mR2l_~LNQkU(7r0D)Azd_rj&!nuOgQYy zI99kDooqNv2bmsW%;;4QB^ zFw9Y5ISF$ZhMuZ`SGq3c5{k?p{wyttv)t>zTb4_%1u!u2QHE*XfIRru%Suf`P*4Qs3lbb>w2(u~3<9RAw-dmU z@@}{h#e8NRD}RNMD6=8Y?e^a#7eM=%A`}$b#{wK*4U~7$S};~@sIekhVK^gEx&J{H zKBggD;ZsbRFt&yQALD>r=51mim8yGQ}%6yBT5H-4NsmD(%1uV z&ie;yTQSj4lz}*kWqVUyfT}!pyUbYGWT9TL27#s*mGX7HN zz_RPWr(Tc^k4(t?V4+4@Mv8C(grUnYyFurQwP9zIuZups8%w7gcGIbZB{=PNpDm@N zBGxMftgQYKrISh|A`m7GGWHik9yEYiHJ#~d@oz&(jdnPV51{GddM5-_Jk~Jyu15;I^57JgpA$9L&~6-Q)Q6LN=4^XmU6J@tXC%&QiqgW z8HevUL(`M$(R%xsvH7eP(Ob@8V8x9MsFRM&LROjg8H(T4VfA>>)WT>Ev-5wVJg`QE zyBRFxV%Zd8C~a+wAk}WQhJ1!bv6R+nm}Rx@c<}w^!Bee{_gS*GC7D)7oPAysoCzbD z+0+B&(UGX9n{I~RIkVUM9HMOcJUre9sWDZ&c7&V7q^T5hx{kO>DvQ}6#i`%9D{nV# zd;wRAY64C_{6(0bgS#RPG&>VU>IB+1w*}k9<;rlK%)(mh4A9mHo(PH>lh* z%fRu0MWdy*^OboR$XY+F&F29Ya|4+Tn@|EtqeRGmAY|-GWrQAxjgT%%ngqMSwv|%G zlrBoUox{FC$FtCEOlmcdmM9B}vLaDiezru}M565W^1mlhRoTrajNLOW+HRiRvir3P z=6m_Oqh>dv-j}ulD5H<)##~&CPsvXAGk3BCo!Zha$NPd5CJO9}0Hm84gW(om8*ehH zmC|9o6LJF(;(dwbdk@Oj*nhjB|>y-Lq&UKe}taA|^6#i%rCs z=6McGz6`1I-d%W()CzKOf?8jY@!0ZT$?hOzYW&LMeLK-VC0JUWL$|v>I~g-j?ep%NZs z2Yv4q`T?CT4RRD|UhonXsBNh9W>KJrZBT7)qMWchksejrAYQCb8fv!I88?gmob;LS zOY{5%)aT!B47wCmgN)QG(sCKvOEL7^km#gtKTBHX9~HHqn_D_R+amQnfVuD)sQ0&^ zj?0D2uo{?ES~LFLC~Vl9F>Hx8X+FQQUB;cDsc*?rXU(sM>V5vHU2bsPwL2yzZoAEVLEKw?Zb%-wG4B{sShI z4|)G#2TJ@$cwl2)dfUrE=csYwgdUqY>9Ls_B#7~BtL@g6(YAA5iq%Xjno-sC7^*4L zY_mAlZQ`DmNZZKZ;**d;{~Y1yoN zr%DwzZCGo1G1u=%W78}+)=c$ITK%`qRR5|br!5)Q7CVKq8&U`lp%8dAN@2OGa>+8I zq{366|5cFMjR#qN593iz$)v#=BFmS0Q_(6brzTUeu2?I#t*Z#b4K>7#d0w%0G9)T# zYKl;qE}aSqG{_2DLB&>nHN<{V<(=xlW$-_%nEidwN>Jm80di0+j_#NHX3?jr#Zl_c zYC)$qXBXWReMW}VVBcwQs6P6tv;?`@?p-;NfY+_{HZhr@8aXAyqmUu@Z_6O>S(?UY zjqzuqe$8pQ{qxGsna1Jf_;mEnmb} zM-59m{83!3c0(e54H3iPxbijj8^rE56Z>^y$wqNcsf+p|082|JEVDBO*YAUhhpGwO z2M&#I;*r*Kd_Ew?H)(PcK4d#k93u@+#ZnrsC8C8j!Pj{Zg##eXh;4H zy|$p&(Fk~ldaVb;)N9Ph|95)*%Cuf52Cpr@L#=)xgO|#6Q=^zsnyO`?L{(pTOUw8V zqW;@6$ETDobNo93noFR+deEC*&cTIFoNy;AI@0%ca-7#@bk2|ZThkcc0T2KFSuAuP z)@F3fQ#_JY(#8i-arkqK+#)a@OWs6F=P_Eu;Ha>=oj=I6&o4JMi zad>14w;G&11F;-;d6Cxi%9zGg3zh22f_DkcC*w%qtO9!xc#{O)HaoCS&I=ui{G5e4 z2yO#i{r4CaW1@3As7H%-@E~yNRZg?VBp>Ww63NhRE0?GO6j zXPgsb+6Q|GW6{j6;xL5e;na<7`q){+RFwO1uY)~)JLHJok3SNz^;@K7<1mr#bKXi*vIA$`y9el6l@Xc3&Nmbcg%qgM{>wg>h!f`s8G0aRBcZ}my z8kX@GBj;nS0(T_k{T|fFob)P)*JU4?MS1gwGM7DrU%`DPcrC@b4kN!FONM62!iQEw z2WH6*{H;h*Mtd`bLYPt_J2*Nnyrn+}e><2=5Z?nLzaGnACay|yvkj`v>~yk?PrOh% zP3%!+;D&`7vt;9bC0w!%q-Yy%8?USuuP7wE zz3{@Bvygd}Z_Zh9I%deGenakEsPzy#)>z5r*Z>Ejj7!C~66fK#Y@s4|b(Y%QcHGDI z0k_@%A87%+GNcf)b}>74aJz8pX1P|RnCr#IK`wyc^4m#eQ*_m_m!EFyX%1a(VGR1ogbXB+Y>E`%;s zN^RQ~l#0Q;_d{EYGfxzj5o)+?RpTI-w&-shdd43PqO*f)Ib8RJy!)jPei7+WA8q4i zgug@dk+|Wa?(^u$_}>TZ=qt^J^8En5Lc3KyV@ba~eHRG49|ALCPu~L=o2x&fFN@$K z?ddP4g6{^LRiU*d4DYlmXOzzXR9}P=#3v`flbCi(A#{Qc&%mL})hkw5XVT-0E8drk zGuRhimdGECRVXp9J!=}NMDg1PRQ%7x0sX z#2(|hm`2dm;A&(-V{4$3K1}-$qyHu_mWwUpkpeo z4MK*5%xQdH+{(za@dxB97})LS7RP1yfp@&pj(S-d4v3xXPe+@+aKgpa>Q_!y%fe*-QLA?6YBqM~n;h67!lnGYU zUAYtxXMt`(X?s5fQL9sO(8ny@3)_8 z5!wGaLPsau?4!S6X}=Z+6NhI6Tb{w;zXgjA#WvBFZeot{ZPygG{wvm)*}%6_t$s`3 z)tMFS)f-o`US5LwE12ssCU3!TN9sqNaD6k1CS*kc%lb)SSy8~Ueo|Og6tJwH6qXeQ zEbAwQWkmtY`cc^Pm>MezSk{li$^m><6tJwH6bDumu&kdH2UZlYte+GIRur(TpM-X6 z$eIG06_iG^svId{h5Zdmd9X0?>J)B0iVokH^f8pisfB%D0SL)O@geIDUux^Mr55wK zypJKWdY52}d|E;g<8FN?V6CY{q_kOmz_Qj7fkIZF7=E5CQvIQ6Y)3o85Ep&Ras-cJ z3yQ9PD{6DpTu?Qq*^e|nh{s^(qVAM;Xd_~7Z>hE5;&MfF3y50n(Y=({dk z!#DsG?(T-m3tMR2Eq7iKgoRAN|3G)GXAHsY9-j^^RfR_^H1Mo7!d;q3Sg?s?sk1!vA_b1E;;Fl2Q z1MmTa`2f6vFdu*qB+Lh3)`zN;Oygj}d;rhNks1Pg2w^?|A4-@Hz%L`rN2c*|JVy^R zm5U?s^k1=7;jdV`s03<-y8Pu(~#a#rvk8Qd5Ry&G(={~jr$@4JXLTD8QF zgUUOD)~1qy-CoP8L>W?1l>F%=&mH_wi!X+OM*T;Bj}kV=$08le@=ov zG9xJa!8l(Zoe|WN1bt{m&|nhuu^B;&lb~B?1g%JdJ~1Qch$QHfO+o!q0eCedRROm* zQ8+dI! zc?rjP2&&`g(tPkwT!^N8YN`>BWb%QNkAuF)MB<=YRmBUg1>*#*Vu&G3BY#yS8yYbA zM4O&7C&RXUa5Hlw6wwqr9r}|3LuskJQzD(t2Y(POjg@z5f_+UZX=%yQw0|U4HI2_O zC?3P*gFE7+hYVw*F^6zp6AId8@AM?0?*p5YBE>f<5H?!Q2Y{&W+u(ApW;c^ zF9Wi+yr@Hhz>Vvo6e&!$tEC*?g!JitR@_{`f=fmaTSJx}zL}j5KPP}|iP9?yymeJr z7t-`}wIF~hpN>kyBLURvbPSpu381}62hiw90If|rfF?%*Xlv2|G&mAKOOpmUI$>chJp`XT`|Kq>~u&Rf0B2(TULx^e;At_tM9aarHBBW7XA?_>Cp^&J6pft=*vb+qWEcc2o4#OWpzH^bL53^{V*5`8 z)fq%!d-AT4T6?5TwNoOGy_8=NhgD=_@7#Gsjd!5GbfA?+}?>|`zLGPpRF?OFw#&$(jl zsBQ71>Sno`;pZg_SMfv7r)O;MSqu=cA<#QnfaeeNWbJ-_S{C2(>@YJpMNjc*dukq# zLkjsJB3Tr*5|DdNw2|_5BBdnUEWR)6X6H>#s_*0G#;=XOr+EhEgx5l@?gHOr=x(c& zEF5*iqJk*{#L@Z6^=||-NP*E0xL{b1)q<@g5{n5Uv6UYNQLAfVC8L>0Oe2WID1Hh= zIAD}(CUPwq6k}Q3wcoD})7hhk;7gFoZe>^hAnt|xj%{o8qPRU zY)&#|0LCqb@lxtWBkq(r}0ZsMMXwf8%row2n=#EBne6s24gljTf*o4nX z#A$JM5v9vEO-`6&5uCmskL~52l<+cY__K&3{HA4O{+9$HGwV&)B?%}p8H%UKrey%0 zM#!)`jgY~18X-gMG(rZ}X@m@?(+C+vrx71Rj=VHN2Fz)M43pCc862k&jaXlFv8f!& z2suS2A*aPqXh{Jw-nMr*qM zX}qJToK;3yWoOZ(bJLuoHdpOoz)W+T z7Z$$1>;9T{>&mT+ox+^HQ~z-$R!}ysSh?`Zubvn4nI*%BxlYobsve-ES(*4n4EUMs z6m~s!1Ra1-CNw39P6{Gvd zN9u2mv_K+Fr6LK;NCb4G1v=6NO1!~NiFJG`mcS<>76Bb=uyaPVA&K_-R5XDZjX)G_ zXhyUHCE5w8XaX}DfhgL6I$BhFT>q1pC#GTw%-SQMV-As0N4~D9>RU~Z)r~JQZ;h(| zEY{%T=CA||Jw*-K>b)LFjmoT!yt6a|Z#~A!vI_69DHit%i-^5X_77@agDYM%?^~OA zcWSwZ^u#jaelEHHJQDsViSU`xg;APAFPwo}bRtT%amzo|Ihs31Y1Em<)8NLyAujYH z6DI=BjP9bb6(m7ST>eP|xVkBcf=XguQvBzUJBweq|1IIJQ7rx!V6EF$MRa0KN+$%S z#uLyoVHzQ=842(`ZLGh_U$iufmuCyADT?t>4NQU3Y%(Ejg|Zl9IkQJG!^?@9soZyj zT=UMK!Gc;#%aq4mJNP}O3Ylc7zz&=(n816hkZ%t+Bt>g$J%T-n*wl*Ku7W*z26l;H zPo051NU*2Rz`jPXYiD3DE>Q-mep<4Vg_atd#`=P#rX{N>cJLA5K;7{EjD(k+|xT9<&Lqc zt9FeFnfjX%xz$odFIS+9WqR;^d#MUFL*f+m7{_NN;A|OdMDS{Q_$CAvot(cKp*S1F zno+T2X~JKl(5#v?`V@s`-K5c{DKsl5jedhdvv$(xGZdQDqtG&!_Rm&m)=wIJjzY77 z6q=K3KTud!Pzt+VbB<{h=kpbsm7|DN9&g`$sRk!iMrMb*e;78V^f`HVR@boqNx z0O9GhYHE9`TiQ){n%Fr$Gg9Gv7e8bCQ<+QSMMh*DiPqx7VZw>xi)Ka$O6*f9BLs`d zXKRTNEGeJuBtlTDr1eDz>XpxS7a`c5rP)RZmaor76(LwMKD9eSPU z1eHUT#QAgOp0_|;3=)=;WgMc*DKj{XA41`!tA&b% zvw5@|;Y{Ay>?9QO3HHIE@gIu4&G4Lxf>FcfN^`;n3oc!28hD%Pd%d*L=cJZBV zH2nsWYs=R!gj2FAc)4c+r#XZuuR}|At~_4J;piv@xMJ;MtkwvK!zo*$R~S_aJ@g7|Uhkzx*EZHhxX*YYkxQh8AXeJU?oS%V`vmc8$f@n*2u)q*#*F9Xfk=c6Pl zb=*=>5QWV3BZ>XH>`boW5lMf!Xuog_7Hi z6uRBg4pKOid7!C@Qy`|)qf#hWN)@Jn!76IHtWxL^dbf-e%5DWIRNV3lr*M_eSqYEc z)b`Eft}68sESLH!rG9e8Y!RIM6z5){b^E}%&+P~2ez$KH=PyP&bd}E$cEWi;ah_Kx z%_ryi!g-$JJRr30JaC@p&IjlD?mTeLSu3-Pu?U=Q2cL`hduOw3XmuqG)-N%o1uC7v zN@nT0J`CPpT+(ODA%l-X$8#5iR(+A%R0nT^hw z7?aFK=gqGC9O#0HFF?Y52b zFe&Ja!37gMcb+kh#JsbTjKzMiYt`)Ff*qbO#Lg|kJ``Pa>Z*OOc>W*HKacf28UoSs zQg2tUTu1F^pr`1qYRhwO+qFH5#vGG?_fCi*VTeT@Zrf%Rv9GHyiKu(BHf)rP--C;O zEHI0bVJj&0clB5JI$}Ym(_Y&z@3teIMUF{eb~^2wr74vLx&~4)(OFLN6%d}!y?aJN zY$v`g+32WEpoMgR|FDCx382{tbZqwH7;XpH;&lxd1FP|`&EPA;XvMb^e6wz+=1XWc z-_Ff`97FfNopLgFCf~Rr`Hl$f)|R3PxnN#}(1d0)cQ^aZ(a^U~qHlLy?46C@J45og zZRr%ckb>iO=@bafPN8eF-yF^DLJD1O7f(6QN+E7;I)xHa$hjq*0-@O{ls5a#(exOi zHntNvHvt??&J>Xk#do*7{ zv-$RH_Tw0C5BT=DJuVKE&(fB-ooeP~lt`;v)+It{HuLgkzd4#7^OW6ImWb`+o~A;n zvaQ=0#RXY4Od_7JM{Qd{ZUr0F2knK94f77nxQ&mZzrPQ^0$~0T-;LiFfO|NFkM06L zAsHK}-951m+^^&02QQMc-DC3838SV!wf|C(iBDu&#=p-EbFMdCg0wyWo^nD7C+7D0 z5KrU?)8&xL%Of*#TRz#pHsU#Ys9l^V>j&6K&f(~7a5Um=!K=RV3fY!?UvQ!z`lA@~ z63CYPfH2&GApw}rkZFsODPv%_&{zeTaI;!I^XljxzRaspyw5^xk^3OHH-IKvJ_fJv z9Ah1>xA}2DhjsW>g>3eS`D^UK3st>v8gr?g_{z2J=f*&b`H$d)AkY$AWi%3$aC zDR?UeM;1EGtHL*cB=N0n@}1G-Tc><7%?Zy`p8iSYJxh5PXz$tZ;{JNYyc`PGawzP| zq3~HqX%rU)3I_#BYy?w>Fi|#cLfH*=O6fpT)O%uPgMx2;f8=8liH|8IJ|?*J{rKuM zT(1D7L)&SEV>Xzm#`I5W98+(`MY^*EvT)tHei9W7w@QmXGv(x@njOsVpq5j*H1JAwr(DWYp57QxIZzM zuVd{HpCkJhXs1;gzhK6~6ud#;sBA72Ut9tk;k89BoKaG4R=em)SY{;|D&ch`*Qt-d z`iB?&>rvjK5{(M>tTYWspH zh`P>d|B<3(UQ=EcLK*d=Ls>d0FN-Zj%<@cmSn{ljwnQ;X-Bd*|@<2KkH{2!~Fv&tfv6_%72>ntTX72SVAMPmI$Fe@fi zIIOOem-U$PvVtQoyAH9%Z$N#f`;NcD+^MQeTXW;X#Ij1$*gd32Vb!Mh36}|$b)4)I z+QBOX%c@RePY^6?JdHh1u&nqr_Hx0p{?pi-1xqzZWA73ywIPjtQm|BtG`1{xqi%TZ zXd=1?Tq;;9iFXPrUt^CJEUPt*%?MvsthXkiJzr>9#VM?;?O%m5M^`8PA5SgC{oe%$ zV4uTENOeVQSVXfHQfO8O(X0lAmMuXsM#Qrs(mfZegm_j(8qZ20o|Tctvs#E}b)@mE z7~)wWX*{cjcveXo&&na5m6FD@dWdJWr17jE;#n~YukytzBA!*F@N%M;bwo7lCWU4t z5zWd`Xl{Xuc_f;(lR~qa_=$nWX90K}(1YqeI5SB=4#8I!;nEod4R+wIIDQ#uf7LIw6AD_%M2m z_uf_W)^KcJnN@=`H{RgIUHLFyE*xl&k# zl`{~c6hKqjG@5b)O>xs`3Jx^oO`|C}&=gqEsTU9^zVxF!k8~6S(VmI9=;^8137)XzZHb)Wxd!HNVa>@$KDDH1F)&9?O}$na6>@Xcu* zp4gBmFr`YV6Avs&2}9E;T3P`qB+!&Cji!`9Q@AvmVggO+(rC(QSE;85iw03oStjX2 zKhshiS`(!ZG%Q)yuw+1~F7J*bj9b41H+W!ln(`=xP(6)a z>7g1UO1w3RZj~@NQKF~Do?-`IhWN0BZvD0<9oj3=p&0`kvPR95qpEo|XkvNU)eDr! zspC=RG(*&x_39(4i1fSb-$j51zn6fIC*b!1BAc*DChy0TKfIXyRiHyY0N+oT55Qj| z%m?6a5at8$Hwp6r_yNLv0Dh1#AAlbr%m?7d2=f7$GRkXHfGMQB5Jj2TM;`Ysd7?GAc`BrlQ5W8dQ%&&Xqk_v_y3}Q(gr&Nv|NQ_~Spev0rT&T^Od{ z3jREgQtt&-(d?`6s;ok}-j65F$-D+%r7Ky%*|!+y;1J4bZg#^}MNHcU5IS1mZ7sO^ zir2zqH@qvx_wuHdjCUt09Bb!TiLEVS@^}|3yW#4Xs*O~Z_XSXm)Zp3h?kH%)wYsuh zj(;@L#(lYCm*JA+V*zg~$C$Jw?WgiFfH!MzAn zE86^onZDS%T*}vab8gu1x1aPss%bT`x{sQ2~x1j>mos@mXyFL~z?-z`Z z-(d`3Ss(YeWaNIjkF##dD(8cU=nvshus2-8oa_R))#;h&4GJGY;}E2})l_)Atd&;0N~I^kb^Ba?`7iA8w`9*e0@k*Z4BXD*gK$=`U)pEH~|Ev$A+g+&ZvV0&j(ShIGf9R zK|cqvKZ$y*@4?zL>yWNcuL5p$di@$)G=Wh#+X|`eHh&BlTp@$2*b2d?k%Ye((CD!_ z9~=w*5&?AfDk3hmVnn5wRn`8xjLwCs{hP+o#>B<4y(Rr(1^Raz@|NkX?}fB0VleBkfSJO^ z#a$3P_#S0H0thp>Q2*%F-d_Cb&oY0ldhpnoLdH{Ck* zsOCm9+{BF+c)`T-_O3QttaLu%mQQiRSts6AD7(xNH=5-pZgSgK4V%EY?aQ*oY~$o% zEFIuPyaE`)l*;Ds!?yoQh^+3G{0-{=cGmw=WTlX)c+22!%ZzL@GTw54BirV+2A831 zoS8QKNve+N?*}5N`3BVH{s8g$o8a>x&oyA&ti~`N>ekPPfJ}XY{T|f3qOrZZ1fCDl z(S36by8cVZHCyYz!KniPw&fKSyer@x`=z?S{fYSN7f78-wETR2{;2udfB!(ls2_v} z4&UC5q^d1@L2_ISl?^nsmLD+Y5jOD_@w`t*cXzKau6S5|8-V@Ep@{V=`pA_F2D4JIen3K&1X@@Wj6A+-3jx zoMm4`G%K(^PCI%CxEFC+ppH(a&_<@MrFq7oQvWanmU4OY*slOIdIF)t0cCh6I)^K=&m8n3VQB*V9D2b!0u;>Ow!=&L zU>sr1)F)zz5&gN00j>bO9s|q|*32YLSt@;|)iM1e!F|OlRBUh^==Dvtw@?CfF!*3H zzEglY^^gPX?&n*hI&C-d6;-Ev<73Zn7-Oto+Ps&7@-wsx^;d#5j{Pk~@nBcMyBFHw z_{-qiR!GhiZ0joq&mp}Tn$;CAB{l_V~;(IK9!aweg0>uGjaeRz$U;s z0{KTFX$&aYO1izTAYo0h@Dpi@Owt@$Ydx5}vNd4OPeqh?KuVi<8f~IwdpT(nrvECY zAy0kx^h=F}rz+j%*!7&8LHqBT!J8qL|7ubPOObwXBp&{2#D5e0pNsss=LrJi@G>=O z1Q$2a*An@b&}T+IjAX26lw=0GwD5zYUu8yvzknSsdP2BH?2W)o<5VEX8iB3g5`$vm7xlcxtO1_}&na0te8O2#ZT)GS2Yw3fA51}JA1an-BfdU8y)u3rm zdxF7kN{l&BFxX3pF%~dpa4e+cEsHpDnUd%%k$o7{Ix}x1Vj5axd9Q`cTJX0E*&e`Z z1Xkuj_HvS?xb24gWv2Hg_Lw9xJ_ZQvF-^4ASOFJX0R=mmvovG|xRC!GH|yPpg2o+K z2p;P)gP#B?i;IGj{!HS2sU*xFfWXky(i8_kw1kNnU=RR;0}=wX zCLmTM2%Mb)0;Vp?^MycYJ$om^rjJAz9|d(0?y*UhuS~*UIam0*lW?qu&5r+`Bz&&; zs%-@CBUJ+gk%S)>1UN>BI|PB{sR;3aFowx!s<$5scApv8KLD%qyClPuuta4wFha9v zGjS0xPU)VKDEFZ;&Ge-+IIWC>8kaE$M$s;{;xun6`r3pBqfyI4^S4XIuA+BbQmpSx zXkha#4~^U|wRN?5uS;k?p3q>q#qvU+>U3k}$NOIQI)s@a!PeOAwX<*LmQmLzyrl}<~?~ZA@ zySmdf2PHID#%c9*^`vQzO=#W~)0Df)X&P*GLBX-M(xfLBCNbZ`AW?%#S0!DK?@ef~ zCymrK&!(p8`u2q8y`+J4v`ajOnxgrZ&>YBMngcVyVhTh$l!(~m=wikEMmC&Euo|MI zMCctQoP`K}im0x=DGz%oLjY~W{z){Z@Vs__=h-5(G#c`mCZ8lVGr(7RRg=i5QB=2b zJy;1_E~mo~*^yKErJU*J$~*_@PeM6$cNUz|+yg}DS(%*%o%AJIrmJbbR)Uc(j4#8F z8~rGrDxLqaXCQWUh&Y%O$|Syqh-n(tv}He8$fk&$0(&0sO=tM28FGZe1pQ}Iv0NqC z6J}tan-TYRP&vArxd(7g!`}v+*YGa@4`H-)Ax{gZ<@{S5Ft2M~I-o5V#hBkUKOL}3 z9I&8kK{{Z+IAE}AFdfi-8w!1&eNe@!yY7cyy@)G4zZ#2dHZ$5NvhVCLQzJ_iO_9kv za%(uO!(SZbBqZHoPNN5(ZSzl6Vd%?ehpkm%=+$S1>EtB64Jx@=>7iz3#S3(LShkrR zrqjbY%h_RPDOpy}5f+zF_)9Di;(qa8(aDCtri1&%|4ZC#_#3#KLzHkII|gCK9UR9s z7>XrGMzvR&4aTL*$aE!ggHi2O^@m{+_}*&9cq8Jw_#aTOqT9i4dvK|kT+&A{P7y45 zrm;r}mMNsM8wJbs(%7YfW%?t~PauD+Yh;W?2=A5fT@W697in0i zGad$Ch4n*N0SOs9`SK7dq7&tZ??UyBsP8T8oY%E4nip*y<-SwoT9}gi#5v^NwMlML zYq@u!-1NVAx#!{~a=$2Ek=$Ppxpzy+y=o4*hnwUkwU!%8uLB|dFJA7sc!}IEidQ7} z7e(%ol-#T5kbCzgxk;_%-j#CG|KjDIiyHW{}8pLL7t}wqkg=LAc%K{dd_RD&Xo=XgORJ zQm`mz%x5L(Rqx^EWd>Eo;T5JT7Ea6a1ZSHnT;x* z>LZe<3e<%qu8*AA#}?1Ei5yVJKOEABdC4~lpYJP-XGDTaHb>cwScW7 z9Py%*e-r3O5d0?uI}N7BvNid=A>&^1-=NC&&57Je*)}9+GlQgTr{kb(7{)Np-lyOV z0$+fq6>f~-On4FC*=2N`nJJes+%gP#l)dL^BPi=)$odt^ip6c{WjzlkESIT=d}hK5 zp0gQ7g&w)LT7C!0romwus8JM+8Xn%kY)g0xcMP7m5@>TfV4I+WZv7i5Xlx{fB+uzc zSS1_n4~|2l#2}9CRlXFQ-QL3i7p@>}&?YHjz7<*+?ZY?BQ@GQByNI-vYW`a-nnq}G4O2j)*2Y=K&vbkV*7kmNua|8YSBNR1=ybQKF4yO=u2Ti7v#{=aP2;XuN7%??V0i zzel0)@`juvSH7$`8H*Ek(9akli1GEvMS#<_ibl!3u~F#5{mira{`S3De*C?0Hnf?$ zTuW^PV{d(PtJ63axMj~W(~W@OGXT5rRb%2qj=kw&NXU^lJ#~2GOL`&IlbG`u%rQSb z=hI_q&l~B;Qi2>W z5W&=)-6>F{&hgFQ0zT}V^{`Z1c*1OO(216lt9Pce?toCFHv zeqrn=#pv%Be#tPZo`i9NOBiD>IP4?iBv2SvgmF$W#@5yx1&JM7qyAGS$4?y2 zPA(yu3W?&u8coM|_{?xIzG3y+Ya`UvqL5ggt}h=+)X z#`zO46g;xJ2;EeMx8fA^JJ|eg@_HOd+17H8tI(em&_q!FK+2g=9mf|td zYx$3%6q?wEID%oxF-V0*iPh0rD9Q%T^`T8}x4*?M+6O;g#a1ZR&&9JXMbij?7%n+t zWOIHUKHi*#>vPro2UBOo{*?%3n%3-IVe2K1!@sswn|2ky$My$<`o|Bt!% z0FR@{+D2PFGd-hGvLt&XM+qke1xGNFF;19d;u39>O*X8DoiVZ9#+VE?CbO7qlXK2F z=bV;cSYTnvu;gUl_dTb(re`$b)Bo&u|9kc5oIdZV>Z()K)iu=>52F|>4hhp!4u^x} zdwW%R08tMnyYUJyF7IIWAlUi1v|o()vAZCC@%{Mm6A%x60-EvU+v?GpW#*M9a@hOa z$$ZL^grE5|N}%<pApn?~X&6ds2QA_=Vcm?iYr4qFVME z(ZX~4N|R5-eh_nwjOz!+g)dBeOUjq#X#YBf*Q}k!$3EsYcyvbZHC@qrEsnTpEIo}k zo&-X@cA;7z)ay`<>o{I_Fn3XnphXMUb$wqQg}$hUFVP~c+?Q}AuKe>qSMA(6NRY=5 zRol+FamZ}aL7s!(K5sphr}ImTO?2qrOF&*<<-IZM#G9z{*25rAQu%k}k2hK66_{q_ zO;P#q;gF}QjAHJ18>n23((FxBc}<4Dp~}ZnzmdwVymw=jcjCR9sJxuL4uM(Q07(6KB&w6Gpw9s>Nspc%Bqu{YV-r9gU zMPn#p9&&9WJ(wjZ13ys9q`&uZ{M^yRdU8$cfFNj|OeqfKdefftRDoG+sLZ+5$fOx; zMVj<2LL5?;qP1&1&2lYYySc%*O{Oy@o%GT0lWu|qE&X!GKt6(P%qG-{&%i&oW#oPa zZ=ou;vx%E9yNL4uQyh{+2DRJ0TY6W<_0&mxBiogJo>g!st!J5M*m-DKRis?3mWFNT z4N&6*Jp{m<(!4t;@L`(noFbe#o}SQJLC!6J$!RoUkwAFj_}+i7&L>Vto=G@dGQNi2q=ZB<{5`X)R>2Oa)Bn zIl7iL%=)2Unar8vxYJ{3BO>XwIA#`Em5gX9LfgE$<6X3XYO$N&vI;vM%8>`5j!TYI zCSGJGyqrfmwmtB~Ov#)CyQ|96Co@Z;aWulDyI#!eKxSHr7q2pRj_h(L%VK&l@5QFH z7_p{by>|n-_cn9ykhoKDH@}KrT1><)&%s4L4~I|L(N(?A67MUF_u_=&l}#QX3t!ZKi}=Ur zn{P;Q@btf!&g%U)RtPVi)vfn~>7CB%oi9h?#XjA7=Le$`wGs>@s ztB>R9#^v;6xvzD<#Ea|x*-cAWBoeqOv6%k!rm=|^`}4Q~6^0lbeEF zw`!~KiZuSQdUYgo3d63!=93*LZ5DRU>b0ysY1bx0CI2Ki7>yKj?uW|FG&4(icV%tG zVtk{O4HBL?6}q<8TI`M?!&}_cDphzp-;(9EwVBg!9o{-3?-jdK6?tVrlIn1IZJqiz zTXEGO4Vz0%3j27rec*{Yt!>yrEEfDYU=MDsru}L=eLAd>wQRvAtg?yN zvvJKLY&#flT^F@nd>MXASiNUctZDZ_ReVRP{7Lw(+_HxFSIWh-)}Oc)`we4u zm8}E9JUj_=3a%T2wg7GG>o|TqjX>k`lv zAo@Yam350RV;IOnS0z8``O{^+1bPGXF6cuL{eOz<*PtIjd|%NAE_%AfAy;K?gZKc#4Xe@al^`i4hJ0xIu>*?h}#XE1G)gT0(2GV z2GDIFE*W_U^aSWR&?}&SfZhZB3xpGat#3g;fiN41VHSqF zEPQQS_%gBZVPK(AZ=peMZ3g-aXh+a4pglqRgEF9lK|xww$VY*W2Q2}e0Xi3S5$H0| zHK3b7cYuO>?t}b@kDtQz1<-4tw?Y2|eFFLt6!`xR@-Lv(zAomVtbuAl4WNObA)vKD zBSGtc)&oreZ45Hu6qW5jzXkkkTf*N==yn6)%f~tZ^f%C8PH3hH$d-#J_LOVq8(r3`U41a@~pBr$|a}@R1f0Z`X#@+C48l}A>m1MppcSC2 zK=gyjcXGWA*Ly$@ft~U!nYB=t?=!HZ!dfY;X4YSA$+FrS;BV` zzO(RMgzqYRH{rVr-$VFp;d=_-OZeWx_YuCY@co4EFMN*h1B4$a{IA023eN~XNci7` zXNBj4&l7&I@I!UyCH!vT z_XxjN_j>u*m6qmpg?9=cFMK`W6NIlXe4_A4!Y2!#B7Caw z4TMh5Dg>Nf-JK@_4-$D3}!e7%n3Ey4#9>Qk}-&6Qr!uJ-w zkMMnk?0){U$`fH zf$$@RFBE>1@I}Ip7JiKIV}&0l{AA&ag)b3)itwevPZfTe@H2#;CH!pR=LrA1@NYi9k;)Vp4(LQN$zzeWi#=2eO8WEzAO-Iz`M1prMMGB|zg8F>8P}QN%0) z+FlW}3TU<>W*N{tMa(*&qZBa4SuQN(uw=qg2gH-PR@#CHVfWkq~ffId~k zcLwN3MSORFB0ZOS965IwW;yVR2QW4)Rpb3ijjsb0|sLU!O`aAaakTeLoT2WHn z?oiaI=qW{g6}_aWpQ4qD1}OSQ(LhCZg~TvOQC~$(ibg3~L(x=4LlkYNXsDut6b(~! zyrSWXRw!Ci(cOyHQuM5%7DfM7)T-!LMQw^IE5*)sMS~QLP&7)>NJUc>jZ(CoqA`m0 zQ8ZSOr)V8TOBIb%bh)B+72T<*L($WUIu*U6XuKkvc+V%co}%9rO;A)-C2kWHH7S~; zXtbiqiZ)O*MbXxZrYhP+(T0jLiZ)U-U(v>j&QP?8qKg%6s^~gJ(-qyVXfs96D%xDp zN<~{J`bN=~ivCcvm7-*|q;G3Q4T}DvXe~wCC|Xa^wu-h;w4I{e6m74_RkVYmC5m=b zv`o#p2W4O;NL=-4%^dw1=W; zie@X?LD8Oy_EWT%q9YXTt>`pG`zXR5sElu4MYk#1Ptg;K_E+?(qB)8_S9E})KNKCP zsHT^M`Bz12D4MHitfGvf4HX@vXh%hVQ?$RLtRh!YPSFxY^AugA=wL-RDLO>alZp;i z^q!)_6#b~^a7Bq)vHA!_{S>*1+7!)KG*OYKXqKV{iuP4>q@sC>7AiVU(NT)dP_#(V zWr~hgbcdp26uqhFSVf;HI!@8=ijG%QT_p{@qBj)%UC~F1&Q_Kg3Pp<)U8d+vMOP@gMA4OsZc%iV zqQ?|nqv&Nt*DCr*(RGS`RCK+fs@{^m8x%Dux>3<+MK>whK+(;LwpVnEqJ0(Js_1Y< zw<$VV(d~*ZP;`f)8x-BC=y64NDSA`U-HJX_bdRFn72T_-x{svcK1KZ%-LELE=mACJ z6+NhEb43p+nyKhvMF%K)MA2c29#wR#qQ?}SuIO<^mnwQf(d~+!RP?f)Hp^BbUG+NQ~iZ)R6f}-sey{KqkMK38jT+z#lPF3`ZqUDNSRdlPO z*AzXj=ygT!DtbfF*NWa$RMsF?|3gu|qPG;aD0*Ab1VtYz+EUR+igs7@xuUG1FBBcA z=u1V56@8`XTt(j~x?It>if&Q#ouUU7eXr;_ML#HdOVN*tzEJd&qE(81R#ed_sr^OK zKt;bQYEksNqA800P_(6@Rf@2Lgim_4BFykH@>MeG6tdQ1_!!hqgT#4a(QPZhCi4CpsSeH2yolQg6hH7ROP zG)@t_&T!u*iux*=rD%YnzbRsu8hoChh+S(y%M`JT4d^CCcq~MZC|X0&Yl;Rd`b5zX zMc*qLs;HvBSUpTpqoU!8Mk-<#9b(u_5xeSuW-DTs9nd^Q?79OwPSFTOe^4=G~T9?+YL*u@9*nWA+RaZL@%;5bFqiq=)sUs0!`c17$8L@1LKu}ctWb43#r z?W%}fgm61Z5xWY37AazvA<$AqlNFt>Xo{li6-`z2prQ>FJ*Q}zqPG;WixFXdp=e7* zzbImtBix*Ul3I2>0yQeyUQvsp9TZJaw4nTG4DpwSy!Ldny{DXfH+UDB4@m=8E=Fw5uX^ zg(AL#6|qYcXt5%8jRLJu#4b{xyA`pk6zFwD>@o%Vx1za}|wE`WW=wL;Q6dj`IOhtz(x?B;vVsYOsiVj!wm?Cz~ z!tG^6?4kwwNYQ*n-zs94E!%rN78)$p3+N@rUb1y%k@RWkd#c2ms0*+GW?Oy4j^LoVXgUjR z!_4iX$yOVy!l=WckCEv(FD`v1W{<)DCGcNWZf1v}xoxeDp4N{0Q(PS8UJPf>%k^i8 z4MGQO6!XT?{*`hujrkL|V!vTL0rzbL+SIv*3Cx{6)1rjE_ER8tU4St3N#)R_CRg}9#N%V*+xA&3Wm-VC}I^f>565D))moFC!(73gP>jhQ!RVfrf%c zfI2`^L7Rhi0PPN%1DXd4?pXl&1RtM{>-nI|K{tZ#20aRT9u)Y06Y>Y3FMQpPxN?iq zB&auN5GV~A1DXKZ2(&e57HBU}5Kebj9LjDTR>I#R=oW*{23-uo_=9yT=zh?XpqD}K zfIbE>Y>X^ezf#6XW;Li0G#Jzd8V8yTnhwI)fwe1WKTsCLd*|bN9OzWgGSH=<>p^#d z9tL5gz@rq|B)+%bmx;8j-Fu(%nXS)<~}!>7PdW&PXv1rAR0Pj5O9r*dX0^ z-O)%nBb{WV%Z+rOkzO#;=SKR&NHrY(ka*WH(pV#HXrvvDw7-$?VElWrTedGSv@jBTY2Y)<&9bqy1re4{1`vBr;PNzk^W<(CvH`1*}dd5f}80i-yRj_+sY#C^zkw%(gq+N_O$4G}7=|m%)ZKNxWbhnY-Hqw_y zT5Tk3ujkt`#7Luzw7!w18)-))%{7v1q|=Rbsgdq6(sM?7%SfLX>1!kXZlrQ{rE3{7 z(hwt!GSbFInrWncjFdCdu|_(_NS7Mvb|XD$q}Pn}iIILWQZIIsi+zKQw6>8pGSUnq z%`wt^Bb{QTi;Z-%k)ATr+eZ4*NUM!h%kFNmWss3tjkLazwldPrMw)9R*GMNA=`15% zVWhi^^qP@AF;axx)?y153j5NUMq1lQ8yRVak>(g_zLCx_(q%@v!$?mV>3t*p$4F6j zDr*@sQoE5R8R;)Z+S5n}8)=b|mKy1NBVA>r+l};ykzO>?yGHujNM-CW7W=A=)NG`7 zBTX~XUyQV;k+55dAIc&looS@YjdZ7xUNF+fM*71@HS7WwtJW|Q7X16V=|&A(gjAk)ku#U=}jYj zW~85tRLw41v7o<^#u#Z!BkgUZLydHzkUR=`ka{Y@|<(^rMjy>@*bn`WdOsNS#L7%t*T!DPyFg zjC6*Pt~SygMtampuN&##M*7uAmF#vDs|Fcql#!+yX)7b`OeyF+#8UInR9t+1S$#o6 zK<%J)K~q4Rfwl*62J8Ny7W8Q4aOLdP<9&P@t{ubRAja%vqC3P$Cm3m&k*+n;{YHAt zNM9J~7b7{GDJXH&8)=x4#u#amkv69kBp3_oL(_Sg;Bs^U_9W5a1T(Rmo_iVS2GCug zM?lYk-T*Pof8zQ%hznSWu`&u>aS+7#U5$AM80j!09c!fXjdZ<{?lIDHMtaXk-x?{x zDWnoxA0w@4q)sDkW~3QL+S^En8tE7#U2LSAjr4$#UNTY{C#s4C)kf-1DSRNP+1LOMaz0pY2|n|W2sY|F1pBpY$6Z8R@-`fVGbVyq z?DS|}u*C}1*tR9&ZA)M33N=y7)My5~&pZ9cI>tfo)4u#Ucy2GE*P?f_cZJP2!&`7$o-=1*7(x{dnX@6|JjaOai}n)oL*wSQBH8J9g4h~+ z9fXwKIoNn4-GcpPe65`0m2@gs4zI{Af(Jc{EBkoh7yC`oaM=*CcjZb8+jYo3%IxoJ z8z()lI1kab_C%U7d=QEo5sXE&Nr#5yl6a04@s!sadm6?gUJWndJUJa+z2VeisKrAk zCiZIb>H}OSf>+B+3-URF)7bRScDLdK8K_r3L~ga?{vDnpnGFywHgJ^8H|hl^AU_vh zij>sgR3nVr=+RSh<`dG#yySD-D3l)V0$CVH`W)nYJ2qi0Qe%JuyL4)vN7H`?S~)zK zeHt0+$T3x=^EOqn61zvnWsg1P?Szf;dCTD=4CfT)Egva1o|%A@wAmcr+BJCWFjZq0 zN2G`QUt*sI>lKDkWG;e`bd(;CF)}-oVO=udg3TJY$tOb z9JupX!LfAjXScy!<+3$Lc0Y)cm;LnoERMT3kim`!c;n^9%i-2_-{(Qrs4XoF zI`Dbh)?i#;N1UlS$q3JjtWA_JtH1$dOzsSMe&sx%?Ng^^qj27xgS&`pI{c8)3w8&aNgwj= zv3-KJ2j1Up;Efd`MwR8b*QUN>cf`@l%VA2>VPiLUni^DIf9zzZsWFh(cADCoS~C%p zfQoq2ZcQV7u|W=yO`|GIR?0yrRdta>D!l@smA8mO_Xn;={Ad@|rZ0tyotcJk@Y-WL z4cV`sx2wO=@b@O4^_9rU9JZ~1H#>7VuK4}C0++Vl@eIaPaUx(t<|SA(JIK?Y)| z)M3V@H>H3K!)^xrP2{`32;u&f>5q8S=Gw)8>~V|n=D5tJ3)@C(&DjU7N76k>lT>V0rSP@uit39uhF18K2)_l~4z)3ZF! z?U8T)!1Ih&CS(SL4crW>1+@-}q_NpaGMRl9&#IzzcqGmJ(~{X$0vn_ZM$*@^^hiO> zj<^;6Y$qP`V_-X~!a5aU@eet)hnj+IF;E#|cv_lYyk@RLC}@6Bj(kdsr_sP$i4!D)wpxu<+idm1j|0xAj99~-Ad>j5&HJeSwL3x_lUdx-gbA6NU5;oeqIT0>xw{Ey z4#7PHG{^UUG(|a~**liv{Nun^_4x{U8??cW&wDvBFP@YaPo|i|gvO+YnRyU5#V@|M zgksRwfDkz+C$4A+09&|2lb6qUx>zKT29kx z=KcmyW81d^HCN_AeRGkT%i^HM25|+xxt0cM%#tinbJql@uP;(_l_AtO6sS`?$UTX+ zfXfu2p)ngN3c)>n$TY%rze2b_p?(+dg|hGw--R@LoRUuOGy-(mM%pg3O*#i%KFrMh zh_7KxL$N-Uc>oT)4^P=?>*Zw7I^YRqkqion(~>;``KyPJw;Y1gx5ZZi9Z~8!^ETs3 zdtz1}*z+&g6N%;?WWctA_FQ!=eG#l<+lzavTWDZ^Oq(O=%fd#Zu+wPVin8pWcYuZu ztB?98KoB{ZhY%_@`Ht!)-)io7PSVxar+rVm!Q*>myYd!24DbFsggpwAco0|dL0pO= zk-H2G{X^q!$LSiF-kXePE{6tQt}O6UnaIuyyd>0%%b)bN^_|?i@L6S-XBOaEo_QO* zZOy>$;N%Lm`%%O`Jbyq%?-nPP!4Is{c`V;%cL4%y@30a1HH`c*`0njLtMPDhF{Ken zl4ojg4s(E$9`B5`l}iivYTRqP{N2XU7f$Xyz|2vi%inn%LTW=BQZ$>wtCP8G7&ezj zhoI)SQ;^?*-Hv8>@0M8GhM~A5lnD~bDN#nAkLVai6cjjmar@$|s0Jq!MY5e1J%`@L z@K5!6dj5uul2h}2AYV{cbFJ>d9`tA69KVs+UEegg`CBj(x%UamQtny26X=l5EypAD z=nV(dJO^Fw31kuvA)3#8NM8aTmtexC9syJJ+onBkH>Ow6D>eehg=LoUoP+DXS!U%) zvBRACo_P|1Wh}Q0yef9Q{iFPWpVYlKpZS*!U^mJ^wY`4mAhbLU<@_5%I*u#@q++ zoxyx>DCKEm>sXd~0g;S8?707|RVy_|dtbY+WJ^o71LhYbNWOb)Ym8MhMf>Zvv?Gzl zPoh*yS4H|#8c6%Nf$C?lFMD}W4n*3VNaL!q*0P4+rLPpTaJs^tYD8SBDL-ACg>{{mcfvxMl6_%jq!e(l7@9v?|G_b)z@}M#JA-9BNY5FR>AC21aAFeVMv3BdDzu$Tj4w2dm6;5k?k#cV+H67!(#rDzq zt-d1+L_?`I5-z`+CgLj;X^q|9*UNu z!B%;zK2we{U4l6Ir^ev%`lVW041@oqX45i@K~A~K;4$!^&b=PCevLfx&)XQ!^EMp!H&lD>s-n7*6=HfRN>AHd-^U+C zK3JQokIikDJqc|S`(6ylU-bEq*b;D6*YQRdk@&5`}RtPV|Xmi**-!k8lMW z`pv8us2MaFv=itM&}pD+K~I1_0Q~{t@~^R=Z9y20vd#eA0(u4X9jM;cjkCAK^&rp^ z5Jm_rv?we&wIP(?gnKa07V1PoI?(1s@p%OgPo9W6rC-H!^01;O+OfQpySE;ljxXsn zflgc$)+JPLeLDT6q|-z?jVtMdt$(8({YyGcq7z%_UE`WcC+(7pTSbYI%N`xbC-&32P{Sp5}k-M$+~Z0sCu?dZmFYdZGt#_=z3^v{;!3xEkx@a@LkQ$I*1vu`-xXZnoZ^Sof^W!ipQCvYqIm7l9*apb&<;F5N zqrIHo@UvwU*HD42t&QSZD(sNrIw~R|#r0G~Ly8-yh=mk4Qi1+|6X;D;#6yaksld8C z;{*E?MZKRwmflIl&mqNKRQwWBV6{Qi`!%Gvg$iudZ34ZOir+(u+o<>>q_~|5tPwP~ zU@=3~TOCrYpaN4;jE}3Rs0=ACrJ_O=mq2#!p`uz9%c-~@Oh+7QLfU)j4I?cKS-jmx zMQup&pt%pr7mc?Ej27FFM|0dA36=Ci(E2rd{uAdBD7!kzC(fhd^e}kJdyMxc;_{=2 zxitM4ncEjU^gZbCJR_XyRrvdXrGWDLG4Cw2`1sSY44!ZhTLnT`=3<>zw9=rpfnKUI za13C5G*K>{8TBz6=jE`=!v7K|Yq1k(GNgK^FBGLTq$cJkaKf%nA-%Xt6X}%8qmyV|4rQ^9x=oHd-E0xC5T=P9T6iMJb2LDG9<5ae5*Woe7 z!Q?R}?FL7`z1SY%*wGJ?FIWU?#sqLQLzgiD_UZ*wIEK0O?f03sv(J>c=Y6K7!jeAI z9)-o>;bZdgKZBO5M=Ybj>L7vT9ngn*0zKf$?nYkO!N@E79HlK~Tc@M4{}Fl7)GPNo zG5{x8U4#dd*&NMBCwpIB{4g(;-)%gM&Wk(d#e?(W@pc-($jEGcRtI z7x&DIM+ahE*{VJ>QIxgZv{z(Tz$Nzvl5#{{S-9bJFbcj`lf)^h1?u@!_Y!rs?Oy93 zuU6!US0~q~S1;F?hqbS`HMrg(JVBaDMwZR zRb?$J)vMlDkv#~0a_ALG9-(n$CZY&oq&N2#lgr+4JN-D#g06S^5lUydE#P z46b>rJjPX9J71!F4<>kP(9GIemzw;;@x8b#m+dJZ$pA#!l-IxyUj?1wG-Sj&VP$sc zeRze@mQJ=0^z~uq^!tpTcL!R&674Wt%*($efivH#B4?@s=K)=vsS2F=9v0nARp885 zv&fmMz?rXhkuz0+^T4joROL3uqe$a)A3WE5@9&|gWIAs|OHoh9asF;uq4?*o;#5f39GB-B#LY^Arwij0*p;K|o$P0!RM8ESRXM#z zdfLK`p?A@hXVu1XyP`(mnPwOqc?x1~E?8z~FsNMCvWq$7=dR(sbO$*bShk2T@=?0XF9dyKBc8NGrCKO&3wjeNOUQ!fxft;2KwSs8t98lXrM1H zoq@i%WCr@;QmJ~aU|bf(wpv)t@|mqX8I_eJ!*^zB6lWIEkaHqiT=s(4W+Q)7@{=N( z+~>@$@>G4Ybs$dJ^n+zttW7TCx$DW{wMk4)#>v)UN0h~vx|GHG*7fS@r7ZI3(zX#e zFSK@ z$%C~Xf4CZQUoiz$ID#|b+glU*F>%>As;$a>4No3_2y1IrIWHoJ{1{?=b!~Na5wb-_ z5o@bujBsT`eJ@*o-D-PDPn`K>D_a{aS!;S^@=1|u{M_R2(nz1XBBSE?jkB%SW19?e zeEoQ5{}oOH^&I=3uAVuEP}(R_X`e*;kBCP4jBPAv#YmG!Ka6Z?!{Z#}2!5&AD$cze z$NO_D%Q}Da9XV9(SG;L;)~Y@`pR!*&tBJ7)>#n+5f1k-}I zG&}G?qs?-W4t#tIlhUW4zR>vJU5GHy#lI#VQ+*5qHfo91I}nCJkP@Aqitsuy;!J;S z(E2l!2aoMjXH*TDWB-m8{*~6sdLCu3GaqZq{i%<&@y-*Gk#@iAOM#7{m!&>g$JjSuYUI0vXeyC>Vh~Lu zk}m<-^*zY|?RM=n|p)VHv(2 z&}l;X?Xq#THqT~5d)BemN9o0btBs8x1S#5yiUH+?=bbi{Pi7}{bRK4nmSK-JeK+g) zrGt0O$-WCK>dG?TA)%f3!DBpgI39IXJTniMZ2s9}jZ531c0Y_*^UaVnhM!ohE|&ci zK{@Hi5v)A5>~De}2F9({T!(POQt*DewG*g+&WrhhEXR@NL0`Z!LxbSpfU; zCtgdNzCl=jhhzEhEnveVU!yc%BLefbgdaNee7|tv>!k%C0mSFuwgUvdZCIw}t9->v zSRK=~Wb`X28SrYdj>V(lVZWRa9Blx+F*(wt*JE017#Ve?icWE;ADV#d?AS+43CnH) z*)N&dv-0|wR+Um@k;feG<4mBYNE!OXP%n(Kt^UybjnSSyqojWtHgc!+&che>~g6fE?p9O+~qLkP+2d*B0> zpa7OtCQ?qSF@w*?kJ6Qe$Jpk?C&%s16e;#C*n7bgSMEm&oNw{ zXwQ#TXgP)q?b+0#TW6VnJ_J-}7=_u`%opsec^dn)I%xzMuM6eJZ^gh0VLccW9l47}DQRWx@^=CQvATEeH*Yf>2;i zot6FqW_mXwU@?CDbtt;DvmoA^x-;nJE)Hp?AhoIt|K2TKT>W(1+MUB~T^!^zb?^2- zk2K(v-lTVjuW0p{6Ot@rWS}s{LBX6Twkq&vtO*px3MeGDZlgz!AuV}-30BhC-klIJ z!=_pC^-JVyrR`D|UrOi1QRLDeJx6bwJLWak7cr?~AFjQ0#zxC4T6Oha1Wou4qtoMK zE2G1(LFsl<8MVZt(`QN?I8D2@HWrG#qKka<=1Mg!#QxQMZ7-LIfo`}Ob4_2W) zi{DHp0+VyF_(Dp~T}Yo6`%ckL4;SRS;fT=s&Df4N6gXXNoLbkaqoWqq&>cpX_bM%J z!ogU{{Q%jd^jFB|3bkNhmsqaJ$I?3=NnR@f5+W>%0Y0b!qID4W?tvby1Mgm36Uc{{ zHJFt$@*%e54deo6ICOA(fV$YKK2)d`^Xp=aN-F?-60=;|E(>G&4?HICK1j%vMr2Cf zn@s7XbFzDkV#67pWR9IqnkHQMs6*T`DZGyGLOK zcH@Tv^~vucyJIEn{-eNd`u6Q!hjtV9-0uG_tibN1*u5%bw^PFI)dhCbw{Q12+D+VZ zyGw;7`Q4+i0=p~3ZVPidg5RBZ3A@YSp8wsUZ{O~9X*Y4t?JgCT*xjSB0=p~4ZaZXm zqJ-U%0=wzkx4VOO6ZhQiQelbRJqjzZyGrcF=H4d1%S+fDE3liseY-npH*wGHE)|y8 z-J`GqyRn}D-b*KBcd~@t@dCT)+qZi>?I!NI-KD}3yL%K?U^gb%!R|!J?urt2mlxPg z-@e`J(Qe|N+g&OwvAaiM1$OrmyOSZiD@)j2QD8TH`*u&D-NZe&yHr?WcaOpf?5-8N zD?@fym9V?2z;62X?OvaD6ZhQiQelbRJqjzZyH4!JhWqBdtS(`9O@ZC??b|((b`$s9 z?owfi-8~8`u)ALD?iI4Tri9&?1|F)v>D#w^6744Lx!tA061#g8R$zB;vAZs0cdrt5 zW4d|BZu<7^o=m%mdv15Bu*B{jg%#M{N9^t$vb(l~-F*t|rf=WwDYToo=XRG0OYH7Z zSb^Osu{#yAyRL-Y4Fz`7w{Q1U+D+VZyGw;7cK0YO^d}BObnI#!?qApRuLJxmHs=s` zbk@tY$-g%H*ERg>VE@|UUt9fan}2QR^<&!|fh#wa;#CIU8b=PWvo()m4!%pjwo9Kf zTfn0q^+^lI0`a=Ge;wjq*YU68{Od^nI*`}F=*krVHx3FEBJi1AfS#5Hd1ef(lU?Pu zi?cvEoJV*JUV8x`x_KA4ZEwj^7! zO_EUFwHUJ%%Ca+oWkd|COc=4O8PpJ3{0oetttS=O+U6D;_K7d@C*K$OE9#5@%=bBY6^9?;yE~tiDHlCDiCqr({o1&u@9xkN^uG7!RI{kcs zXrB5%dEg1#e;UFj|C5Kw|AU9@=*MJ_f#o!E2}VUTvd2K)$m~|?VMTWynt9+Rj6A2? zWb$NUc=&s_9(bfIJe=FD2cAa@56imsz{6$X0f#Mhlhr&w6do?<)&mbyhKCEg^}zEN z;o;(LJ@A-0c(|xr553X-2M?EZ>w$+o!vl_s>LwL&457or)!li>{#75=RrFBuX`ZMa zF6q|8L+auBZasXi9{Jb=`SD3a_Bs^Y{VEJPa0osd!j6JlseR zC0{C@Rtyj4b?YIekKv|nJ@6b_gm81W9{Okqw-k8LHGY3Zt&FwcwK<+(j}@KQ)Udu_ zGsC+MVxW*8g$bx!GqM)sdU3iIJnG$KL2!3VHq(+18ebyC37` zX}5?Qr&I)h-3SO$4f+cw8yqgc!sTRoYpC%f7D1RC>EWLVGuFL-+Ate_FUFW# zb*ybtb&P}f9ZkI`%+jGc4EPPIj>VVuLDM3ADysFA6L0D@tEra^-^p+veUEv&)e&1T zRcPT9M2X`*7#~keNBy@A(9!G%_PaM zs4K(9Xp%dDb2xW;;XzpWJkLKPTb@y|lRTq{IF*58bwJVpzo_8QafC_NlovHJ7B*BE z5Ys|cZ4}kc%U-!bSVsoAy1cDM!>KO!YM^NCrBL!sG(Kj|c?olSb;64SbS& zHr4ht8@uFOsvzI;S*&?jI)kJrNgknZAdDl(J`|WEBY&(DFy?0sVx1sm_P@%gnovghc1n?DeV{2QUHr7nyk0HPi9)(Z9Rx2Ou*E3(()WeAofmGF^meiBoaPe41C z+deHt<2dl9bVnE!bl#pMyNFsA3JRC(2vJ@gBH;j2Z9`$gzp`XgC z@}8!W??%kR3NOy9sLgFUM9RowY^%_vjGO|c;}$zf8NreCQKw-Ey83KyiFhMV<#s@D z%NqtKh$sJj(np#pP%bV`?T0e@^gZ5(zfRMf;+(# zPck@rJ@P@@#S^LQyJQD!^5l&d59F!b53m70i~^S7{l-?0NxfsT@zoIa)vye2N-1BB zVPB2Q@Y_}Bt5os&|9^gLhx+n=&W}>Qy5`4V{Fdj#>Lx#;7ADGBX_SwU2WgiU_1imh zBXefN=SJtuh^6;JNyGlN5jote&LRs(*6{+zKJ>2CTLcozx<<^>v0DpEw zJ1wN=f-F^p)BDjZdB$(T|5_~bH{mc^wEb`BRiX~L8Op9sQs!?FryIdhZy6c&7UhN| zm=$e%2pYGOr*e-V8Wd{*%VOT`d8cLgCb%OEW8R%%=y-R9Vcfer3=`fxfT1Vjx477s zl$Km!zC?>MqD#iiVaBj7z{*~$h57QN=F7eL(DQY{17bn3ljO^T;&dN)#CyodG4Ej` zM?K^P@`Zj<-lLQomSFO#?cFbW@>K3E%`XAWp~v!W%h1d7co;g~6JZ$lU^^o4?@f45 zg<-k(G+@^ZJ1Jaxy5!G+LH<00{Ap$Wyr=nt^NoYR^7-?;L|E)3`SXG}JqwP{Ldp$G zFtO40o)bNJD)+6XUBEJYTIQWla$XK0sacbU2;cbn@xA}?-ZHd}XF@N1NN8rO)Bb^2Z_@FaKE=;xKTvBW+VHZ2-ck2MU4dV?W%edxg+yT#XK5tpZyal_zsvG_SUZxQMbZyZD{!vhaCU+Rz5 z%TsL28o{)`vL;pz;=sq=zQ?uU(UmbncOBj{1iv$FgKJ|LsV{OF3KzMl<8fqU?o|Yo z#2QtPaXYrx!Hd7gFJt!uklfq=4-ZQKp>68Z;H+|9!@W7|oabZ)f;nPs^QeRINHZ6s zG!3tfxlBge?!J)07Bf!UHX)ma)dyQ47n{ihwBwAnB7G3jFgRnYXMY=AU)zahv4zd2 z*aPXS+}k5qZj*TtO`6I?rjM=L9BhbUC!eoJ&A5tX#N&$1^q~tub1#>*;&Ph9k)H2kKLYMhBm(_Kk4Wh zV@`JBQ{2{-eizHA$Cr5evQpp4TnOz0Ng`+rU9ULX+vI89uDwkb^bY9w38{jcT^yp0a=+*0jB6R->)x@~auu9NVMuARE;>Ahh_ z1p*iW+1SJ5Fi|UL4!I8XmhoEiId~tu1e~WS@pH`s0vZAUUPa z@@eD)#=&Z_B6Jj9LEGi*3Edwmw{;b3wcHF`yg4#(N$$s!&zS>CI!VqPXq+P6U-S3o ze>F8eKS=p#Jsh>TU-Q{6O=4BRYr_bfMo6J?Y@MCm9WRR~vp)LzhSRAZ_P)Z&r?T#h zRnx*rV5pz}KxU;EGTH0{J|C)enC7B>Y5z-A7; z6s1NFSim>Bqg$2y#XD3-^)1>%i7wJhQt zjcdr>U~qx+ATV{(>SS5+=VC~UKF!VGqV3V9##Xzjq4d0qXxqHp8JeDB^1n{K#w)(zxFnj~j>8KS1qm7}oqs&9smv{SyP*G^BBV zH-Sxuy5zI4trbYqdQ4N3rfD}C(zz4bbiu<`3IIS2M@~=Eq0P}@JO)}A9LnZRJz`y z;`9)B#CzPxQSS*OW3$IGc(}tVxGg$_xc3;`N?5ApWft;wecJk~_SH^7r>O5aZ|erq zQ(EjKwoVhLso*JZ!~DGk1(W6S9>jyO&)VEu(l*U~fQvU<8kXc;qTH*blSH{UopPTr zfIY<*c{l)>u&|$TYVh_ovcASr%=a-$?KyNikXxBb{8D)P=K~BUgugL!kd8@A$3V@m z&*Yc@sh;!s^*NM|TkIspe^Km|f3{!dgOXSynG5j9{ogih%41Dtyl>XZd)>+1jP=JX zAMbil;zPB_N#dO#PUFF&-b5qEy!DNYzJN&pexP9s*!PDGcjd33K8(gt7Y;>TI3zT^ zt6&P6{4PI&JEze0RSjbM%Sb3X72cMt5D@j=%7eJ{1AFh}HIDbH0XiM|4TGcJYex2G zXuW9^I)&qPgHztSM(&b(uNbG8_YcV7oT$c0(ef}@mN_YEsyqv=k1ott1^H)ju~Zwy zPVy`+5vPm5u?dWktK(X+Twyd_EL>rnqTZ!Oj(L|E8K;y=;l4btal9+@Am&|VK+3y1 zBwqtLoMM00Bh$+|Vgsi4GfnTcd9V5OUN2!4Imwz2?*?(Y4m{%Bn7=ptYDqbHAMxM} z+}hlrN+~D*sx~I&is7V{Ha-==QaMb`~sS;naVK+`TjwA*=DW|{75P{MFXiiR_&lX zoEfy0^cif(ycwl=^IbmVeBS&Z1{6C<-ux&|--AcIpYrz>J%cFQW7bB9NB0E}w&i!^ z#2cA~KAER5IrG*>#{j-ze#I|SCwruD(zeXAbUClmd$T_lU_irJk}hYg$>u8FKf-Fx zf%M)AYdB@idpoS*JV)=Hu!hqhy?4VJPSEsLhBcg(>Ae@$aNeNzeppip&D`8be$D?g ztmhOuHTHwBnzP5e55pSHB=kOl#x9TNo*9O2!ZJRsdYsjK3ZCo6$V1%+q;nCVpPkOU z3HVH@@ONa7yL+L+bq@rSD1AH!cwb-MAF?m*mlyXgx?`Wb)4qA}0EoGpXxZ1n??_V4 zK-xrX<8B?Dw}frGjkd}D#g%dQVZ5mI(G>R08CV;wjV-H6l)FzuCzi@y=e03xf`VS! zT5L5x=50IfJ_Kj?iNKGKA1}gB0sBsmi`(PsicKF zc(lzfDzo#@Ylt$6<9P1C-7bz0z%cu&I4< zT`+HLdG{0U*Z7fizXOx?Z=qI{@AN&KGN~B46MV%F^vm89D8Av%KY@wu-gnRj-!Ov^ z?-u!ZZD-ziB-ove^6c&j=E*uewqFz0Ur_gKnfL1-BjU_EGlplMaDQmPJwJlQ-LDaY zYwAil%BhoI7Pjx}C-_oZWGR!c{n=<`Rgqk_u=ZI`=0bl!)6eZRj1 zAyoN_-vb5qEe)?o#NY!0KxZ1msg35|x|ZS5E_*&$O*d zv0qyD*n>-B_ICB+&u7l38M~S~g?{^GUsS(oG;NdN3DEj15;BK$t9<_YKLlK-GdAnY z`v@hW0)@Q|4Q6)~n8&4)w#%JTFcjiDjDUkLj?9bn?rTTq#W8ttEJS%AxmTGJt57a& zmwU%xFbQJ`h$#0Q9e!hhW!wBtWct>$b>10RToUwZN$(|(@aQ}b?v6X0b2r^J!R1g6 z9Q|fGSK=8S&QY20I~=E&gRQdGGd$F)LGQ-tR(cdid0!1kH^|phtO_zQI~(`uuBg(} z81B?bIBpt7=+=lCyd_9O%-R4pqD&(V=P(VqyU~?^Bfn0O@4I#3-#Zmzpy+@?8+@nn zBhQYI!0>KGc-u&LIJE-dWi-5;gg21k&6Ds{F^GzTLy9IU4ht!op%9Zb z+QUOmYtZizA;n-Q(xdqkdq_w-1lpIpLqnROywQcCC;{AyZ8uxa*D9=ohI5BuzbJA6 z;Mf*t-eKtIsj{=zBEzLWx7=Nf5ZxtUl{nIsz0e&Wv+1Hu87>PP+u_VR0Jq^i#Hdn+ z-m_p@39t`4(Ed#VY1BY2$p^xvgJavBc{u6Kmcw1-Ik|im`9S%W2@wY@M4MgB%Vt%+^5WV{5>cs28F{aC2UN z`R>|w_W2-_?0%A_?0=x}ckk^|PCIUdnRYhyY|!5rbnG*S!lk|Ac&10Qmun`+rtIty z=C1w{Q$t1TUcQ&f^s=KfZ(pXrJY-aDxw{ukclQUY^ewal<-SlB|J(#_`@v0qZxn;_4XRU_-ou^ zdt!U!FHRcbZM&QH%s9W@v_agRh2QtYGK@m+0wH}f`XlQx*t{EnykO<-&JfGporLcS zjvvZT7;RPFR)&E_)Xn@2i{Sfp39kIJYhvzN+)bBVhXgGI>^3B5CE(r!1l-2klXd_= zJAwTC1B@V$CC~sP31ktp%&3$uB&g9}q6LvbjiDdzSwJwBKsGKIjAMVf`+)TC#H?#z z-wskwpUHaKaYv$3bX)o0AgUVMVtH*rT??#T9g&hNbsPdVk7Zp?ZCcJCN|XRyYd@637_ z`E;j(N&SWI2~kXfVy-VwhMdEbPgaFeB1z+WVA59Zd!GXD4T%hsB~wH6)Y5e%VYRV8 zP1$Hv?>GjcC~cY>-KQ;LVPiaNhCGw!^_l#R+-+YYI}O=^Q$hjq69U4&?Ams6tg*Ns z=PaSTJIvsg=sZkOK)b|o|G>RiCnlrXt3+N6p8J})U(ehR1`>no<><|xiB4+UU7sV0 z6Ub6L>eHPFahclyS>FAY|2KRh9X#8oHzt+c99tHHTq`+`1?SnGP^iF8-Oxy{mfHM|;=f0Aa?4AIRFc$He1U zG>?hym>Xfen_s?IU*27`od~$Ry}A~&dfwuoCq5@|T1jR-To_@w9?~2b#C*kXsAghy+DCud^--lyyH;+cR0ly}7rNiOl^Yr+moxo*h?mjveoeetPFf~No)35lbYv> zQ?mmeYTJ4RSsq?88iXlNT1{LZCi2kwionJcUxZNw1_rkkn8FOn)zRcunB1)wzn&=k zs>7M_!3{Je_buP56oLs^9`=x#2rFx&?KLbPZwKXrvyh~OV1aSqyTHW$d}cf2QFr4$ zfbP3=@7_rFS>3z$rTb2B51BozUJvgMsRG+1*Ciz}P02eZCHQX4OhOv5zxtRVe|9TY z>`m4}Rq4MH&M5a)-WzLajo=MhYF9wxW(=dc!WwUxE-=sK70QJLdL znL*Oi2oNKX{zU+XK)MzI;snyG2#_F<4n=@+0_jTxND@dlB0vR!^dJIM5=iGEKox=X z7y?uiNIxM!4S{qK0`ww~-a&kl<$DL&XA!k-N5Zh~9qBZ`a`L;UpPm1k>oPaVJu7P+ zW8P2reTid;=Vx9c-VeM)y&rM;KV7ZKG(;>ei`zxgz}@NE)-r85xJj45)@X#e+ki;} zAom?#!oK`z)B8D|w5!}-&HIO%`!{8q8$Ab|XmGmY!E(Rw)+W6baaUR=;NIQj-d?=- zNOLcGx~2bZcHDgrJxgdu#@&?=^aJmGNagN_!ao5Q!^+)%isA#|9|`|d_{YNkE&N~L zxhSin!LY+`5;F=kGtaXo_R=;<|ZpTwd(R zi)-h_bs**{X~{6=$Y8r6?ZhAqw;LkqIHkcj65Urd8dbkQ)z7E~1*$>5YPgLhZgOV} zq`b1(D4X-j$woQZSB|lp7a|i>KTbj32_JiTCxVa@KJm?6s5rt-XmRA7077@6+Q>Tr zgq(VXod7~k&0!~ikkjO_6F|smVb}>EW2H*3*C$1bXj)T$u4k;hMlnOoRmqF4TO;h zJ0%L7{DP-(1!Yg~Y7XDkTyWRqu+!uMr-fmsg}xJZXq$$&Q`_gd)^HELvzU1cb?yqC zuJJCq5o~uuX!2dB-byGPx7bOB*4_&_F&yvxd;p>GHAIfOK=zlL&MQh0>dMK;7yd<3 zqu~LSpKM*nYb27H!sZjK6aR&-efs#WDRsrBZ1kmvK5!4a%@_ywrV{~iMXjtxg`N9l zORx3d!xtw|4EEz<%I#bo>JqPmqGknCf(?6Cqt?lx3oMzzXc1ael1;wbD!MJF+X-}Q z{vNNnS~u4>9#ck{w9J!eE#v!_GCy_xU{&^VH1k5-a{7;LQH71z%3(zAF?jB+$y1(t z92&h@@{r>s{KHv2d3&Wz$eAFS3Iw7~kxV1y`Am6ah~8vP-YGp5`Fw!48^2k)xM6V) z+;*oMrgP#(Pckc-)&-CJEyR96)@-T!B{xi`Oy_?Ph2%B9h4STT5{ycX%Y^byry}Zh ze}(=s8^E;o`s|x%mE+@^jxr;VhsugiX8oVsJ`K0aHi5|n8$!gy*?joSob*P}rZ*8O6e!wqn1l;pyPJTI-P?BM(Yh1qVKdyp)f|#|cYULpgtO2l6EVoP(HgJ2 zIW)Gr0r=QK7{QtP|1kF^aB@^t`*2NlcU5=KlIiJ5_beeZ31nzyda}&0Bmp7ph!ELL zf)bVpCM*SA0g+0DfPkn;Bp`?p5CX^|3Id`cZtSlhvWcuC$RYwNqJj&A?|II>wRBHU z9AEYQfB9v)?pf}+=iYnnzJ&~}*pIa*AoQU58L+W$mJXd9Vk=+3;=~}dCcY=T1ES2g znW>9URRX)C4#*A02hVgc7I?LTs+bv{0fLWdAiDTe1qepZXYAaQH^(R%V;b2}pO78( znBM*hW>w-gA)5^^0kRHFD!WVLG*R)Zaf}p@%OXtL-w*+oe?n# zqa`wz$1%)j|7&r~9Ad5kCT4HBWKwqTs7kR6Lrud>IDcizy(3FtW0F1?XN;L3qe)?U zC{l~%GvXSseWr^7k`iy_PDz4jrlh2S22zp+8c6$$xdIXrLrus?^EINkw>O#AxVK`GoiCz(FK?wW zVSR^z_ZY=|$n^F_c+M%)knU)z2qc_O5(-GCRgt_n>C`IHr{bg)RV1I#y}BWriqgJo z@N@aja@N3I2@ap3n?mtfZX<<0Qzh-(D(JIS(B}xv)e%WLpRXdWt|qP_h+L3JCsWQ^ z!f(eDLAjkzgP@#AhpH%d%Aq34-I8=f547(tHOF_k{+`G$U%WpV4t?7%25AjG;TYjU zv}DVx38&QfAS^xl{h?R1#eh>WnoxM#0?&)#$2|=zsc3 zew=-Q;Cf8b*abQGag0m&GBVXqLYH1ex3;lcR z3u4a%S(yj(JY}4Nv^rYaeDRo%dql;(HS#`zXWR~ipuxsO=^%Wuy?;F>)t!UkE>3a} z!N;d(ORb!sYd|RNd<2BJxJI+I9mHXld8A#Ay0{C#0SN0R_{ADL`smD0Sc`EaUdPxS zASy3PE7Iz+{pXmaSrEbdHHb|(i-7IxuiT0rkb5ZHr?DTi9VD#7oU3NuqJ)LUY@#x| zgjE&TM%KZmM;^ivrALcEx}@bS2iA`MS9uA!r;?%%i;j|p zV!4A8O^;^I!pSeDRdJLr_q-6T;oIPwB&u5eurE>e(hckm#Ao8$d0g2IKDOkjL`SYhXr46oBzl zSIbEt0OfX;GJb+~mca?n?62(wzZmc3Dh^(A&JGlNW||8&TUaoMQcm6ZnQCXXBj_5ZXJjC^>Xq_=@W|@O}1yrj1)fD1iYll zw$i2F!)}G8G9T$6vYImmt7pk(rEU~xMLH}XvD*#earKGZ)n)Z8S42!Ga;dAQu{0ma z$u&06Rsf8|o)C(~Qdz<3CuzGofQbO0SJL6^XLh4dHDSjLhsIcx5rP(=w2zbW^ zN+YgVoW{*{aoR;Oe_upMlSQpUK7;qr3;EW8c07vSx(-jZXL8vEc>K8)8$?@kt+@%9 zCVeTFnWQ3xr`ZuM{ZA7AR_}Va3zv+xfuz_2(nNCRW92R78^R0ucDv+P9wm|ngjcL- zLH*O+;}PFgv}TyKp4f0VL)Q4W5T|Tu7{MM-yI#2mDElW12brYJbf}kAdCW! zoMk(-C)9M1?kWkQHE?#%$gk?Jvr5_`5gs#{OxTrjEhyf&}g?i zF5=xc(%e_M7DcqwZ?RQUjFz(;G_w%uc(~ZFYTx^fNqZR0Y@=2N3JkVKdP_*o$?%V1 znpO~_NTyXc);u1-x57006T-^|40FE&v<}l5l}QitBq`HC_EwgDhrCzs%FFg@QOp{b^kUP9)i;vp8`(Tv zzOVBAI&#%Z@nk{Ir(tU-W1M8nyuwH@UBrErkx*@V-k7zU@o9yJ`#y!|ScQFjHxt`hBPaPVO?(?W3 z{sk#MxQ!O95+vbKXd&V0^gb#`?}YOyrgu#^S!2eWARM@N2;!75@UWP%9C3=rL4~Bc zL*@vsFrhIfoYNq<(X?!5Q9L5>AM}fchJr9~PsBDs7^Ymgc{0;27~gp%ym}H1-MC(; z##Ct|lMBXFrqK!6FR?xep0i8%^ca8EW|TkHLtJ8r4? zL0mB)_loq)8+yemF34JNJXPc{n?;x3E(F4FxBgDz7cx1QkF=71>N*GiO?c6x92Ahi z`DZ$%L`ci!|3yd#BXl3J1D7}(BBvQS6Ol6+Ia86-ikx=jOh?WZI$e*J*DlT#bjr-L z>(f~zR^O0=hv31yl4wR(tHv0c?&-u%7UwEDH>a~_Ue7%D41&xHGgTu1+ESzV)hMO{J@V_E1>vULlgtgIe?&}* z&S$V{fjiYL1G~hGQ)tU#C1s3VB_>>nFrBrSZ7=q#@CPSz__hk_s>KaiDVeC2HK?EI zG5o=)$B_>c>{88jG3kmBbVh&nZkxKbz};8dR>ytm=02kRdOkRMKgqz z9zzrDPlqePYobC)D$U|Clbx>EX&17nTP;n8YY8fc;_NGt5bFAh!AX^#>d0a-C5$YZ zhz>mh#(rj^?b24#gckbKy8bbYyNo~H+EBpcQ3Kb~I2PtVZ49&3*SiiuCQ7@YG-I<$ z#Y33!fZ`T|nX&rL|MH`m+z4lJi`j3~f%% zbD@X9T&rvHv>6&Rzhjnyc3+IJ-4_dM_h~FTp0Mf2=yenl<+<*{sq6trE$O0$L$8nd4o zttE+NT^*5D^oY*xS zD#rkpN4``iDdFvlD9-sQ5;Wo9MkXsevU{I8&7w{beGmLRMHG`EM~7Zi_|DQfNHSnb zpA9=+&s_m&*4m|wc5&8T-D{w81Ba@G%BsgG%c_=TbyU_We5b9B$Kf0V{WDYZSe-R+l z_)*|JDJN{ndvC(bgNvru%C<0hG1g;GwdA6rYc)rv_azF6!n)qmvDdOFqnE_#&18PhJEjF=6ewqtGT ztw3hk&S#`;iTqwbzr9-8-e5^dUQ2~tNG>ZZbIQ2!Ev%m=8o55B=dTjqr137|yMi|5 zT?C(~yd?tb8gbLQUI=Qkd**3pb3)a@Uk0lsy+?KOvpa`-@8~g?ES(GOa>*_}d#}!Y zCc76%GS0x{E?fUL%lRyL1|PtD#3b%o;z>ZC0f-!3zdWQJ- zgsJYilJ=okIsX!lk)%H<6|cN#*k8E=WlYt?@)8V2ZYy}?va}A0t2NIpAd7wH#K~`> z0plYMry;q@ykAQMS@P?g$C;Fiu)F7c_~fj;SxzL_MOIvi7}s=gQHB~Evbk zZr81Xa{+{?A<1$yj|~D#5QF>ciiy)%mHVZJNTV|0AV$|5>5j^?3f~zQF&A~y25c8+ z9Tjh8c}-Xc(oo4LE^JJQ?X@+iFADZ5q`>0AMEgLt*XY%Aex-h?C#UsQra#WgmFB7> zw3o2nnN{!Vl=`G&U=6laR)MWLSn1BJ7z~46R(cvud7mFY(hPhsFn_ht9d#$hU$om8Q~E;ZLMYoOwPp;D8Mw!yt?v2=7Hg&9 z{jB9L;>-qS(4;)%)vj~SpP=p`D&zgJgJ!(mdkbGBKAc4n8iYR{?L^n1eiiz2`kZwG zX38&uR_2N=f>^TYh*y-WP}vQkH?R^`qy_NOKRHN?S1O}OQmk_pxaMv^CTdnm$-T85 zaelG#JThlPuCW+XMxMh2uA?&V7ed78P0X?;rB($#YL)u6Bupy+aKYpS2&K)od>l$fM@p)E4^EuT`w~+n)?P@Rj{+vG0PFmiimKu-EVFq3 zsikZGh7wZ2INKP!*_iewdIF|#Xv6T@V6XLe8-`z3?zgp>m64LkYP;-bo`_xQaM?vs z_K$JP*ANyeBhJ0!Z876?X+x#HH>AEVuh6-AG0o2XGJYG~J<%O(N?Se+#!mCO!z`>x z<-X#p!=alIC3f%;7k30=B`#J~;;EIdK$1^$G&53dV%(MFxhZ3n=oMAsJ7P@@opWW< z$=W)8%}-hJDKalQ!Hg|?gKR^RYUjH&h&W|B8*9vn7&NGr^Jjj(5i8ayVv#fqJ_+?pfqU~gKA_(P=xxB2GWiA zaOFmY2R*)FM=|oku=|>f5#66|ruIdi#>`$Wq!~O;4qfDd6 zn6_K6pTFGDK2O}?2rH9i6Ll~C}5humCsLI)aF&TwO zMs(WfDeYV?B8kt4+bS%ZwY!a81Aen^rLc6 z{j6rgU8VXd%*Q5siWvKZ z+-sg(m z=f?EDu8!WHt+-k%k{KNr*c`Z{`lzDjR$YrQ{6y$O$B z?|QOC?{Ucr^!}Xay*j4%*X!twr-WnmAi1^PdsA=13u^T zy}wYUH@UUmAEMrb$FFxiS)%v2WCeP!7QN4l>HUp5datX}o7`G&Yzyr636Edzda^|C zamnIa^JsJApMH;>jiPq4ZO~3ux7x`XOgmXAXeY~=cG7gUlh&Y}OknM#&SA&nd;%VS zWn~7d%Q(ij(Ru>?mG}$L5yJ$<@Z^{b&5GfvF&SDE!_#9j;CvHxcxFt7EPAD2cy3IF zjAD3pOok1Zj)R1eDu#ZXR=EHv!3)m$RrBQSKHb<|tWrs4_s&P>uPkdhuTX*qlh!2jP62@7;V$L+@p3RwZ%j@BUkrEZnFHZq-G)d-{r;=1$^Cm{>ey_0cx8R-+ zad-zv0KDz8MMPR(@HYn(%T+8!W00fnO1d2Sto?WONjl#|!HSf^g6go+#f~dxugC1> zjo^%_XKVFjxmC#-x_b;=zX4rwuSw3utUuH4AbEC1Y%xl^L*!|iT9TyQM?wF0%wzXf-mdK*Xp#B?o?qqRwu(@>}MEzw5B>jLP5J=Xu8KA6RiG=lL=u{_e^nMN0P^+Zh{V^gJ{bd3{waX!DMiRnIR4rQpNivgHKW$0DUQC5 z==~UICXT*7L}%mZ8$uyg9Q}uHVIREs@m z_r4DWu*cttSt{ZgMXf5*wQ)gMcmi39vV`8pAJ-Vqw1k9AT6(!B=t}?NyRm{vwiLqHvSgeomAgP0JP7OBGUSl za}Mozatsw*nZFrubutM$GM|2h?^mcRE}7&QWQT}5Y9MwLv9%=8btjUFYwn`19}qVF z7F=Am%8`Zu&=uWr#8yGLaDHciDen%Hzo`h{7;X({1%DTi23i8RC~yF!oU0kj-D1K5 zl1C)AVC{-ez1T9Ycm6+!YpcXH(6Tl@og26*7q#&r^mqFi(nJ}j2H&i z*$*&gLqWGg()^bHdmBnUT9xLihy)fTuaZ=i2)w;mt$#2*BKq_4h)ZcR7&x=MUmfvA zNq!BGqe+tF*OH{iJ%47pe+>w9-LWx>F56wN1`z^;^CQ=hgog!fJtOjHEO|rqL_f|a zT}J&HRDG0$Pt6?ZX90qNus+) z630Z(Qu|KhVZOW1(3Oe6(UK&DSN%TxY{SLq%Qy;WR+-BOOkkGev-eTVzyI)EDklEDl@`yXKkqsiTmL&RJNm6mmAF0z7!p7f%d#=(+0O)iT zkaaVkcFH>7D(bLQ>F||^Inv=$5nf9Y9WEnD*8#t$B9{Q6>HxZI7c&{mQUSs`;HxD4 zlR99C9jcy8=|SmDaUb|Z=z2ADEn-9KVA7g=IFH??EX_e%PT@5(#nTn?w4}-@3tKU( znHl#h!TUAH>j-&Wcd9f#9Z?THN`)>UZLgLjsnAVQan0{IbKNOy{4KbvAP$X>0P8V& z+AN|WVLYsv`ThspV)=s3q(r)Y4LlDJ?Ys zt5s?Suu?OCpk_NyGSsLU88*}PGU$0N^~6Q_)N^;__Na2V7m%Y#qUQ&NvI{p~9-1P)|Fq zbTmgu)&E&JQGNHHBOcc?9*?UuKPHNFWWmdTw7go9r1`Nz`UHLp{&93`U7uj$qHbWB zKE(3qvfWoy0t*n9>Er23F`yYeAqJr$JTVTYO5dWXJCqfx1g@x)Not<^5jCKqZMlf& z*BQ_2R2dkE%1ac_K`8^ZB#GyAA(io)^k;_df3e;5d56Li_`Wh$Ko2-EpMl48kLum5yr zsywOE`-E{KF2%)WT)8v=2WuE5eXxdSQNDn*{08FE-rSN@=e;WJ+Ev*Ho*is}u&`|j zeA)6x+!PKD@CEPVu{+gH`N#2-^iRMixL!4b8@@JLzd>%fI3tdYjSg<^uyEsU0$y<^ zha{=2DtcH|%ZiIj#9}rSi%A zR9b$C#~w}@rTwd;wYN5*{Uk`K(muG&eD8#}6~?rtHxHKzt82@-kMjc1-!d;;oceNt6)Ew{jkgD)X|9yBr#27J{Stq`ec!XyResyxABD0^`?P?n{+odwD&fMn`! zbE%Y1&2uT!XY%AyDmi!#th};44vx03!`w#60B}*J?;!4WdFq!rFWLs+E#CNd1QovD`r1vzid0a#o zmGIBPtOlK2I^Uja?^(PJe>2m!!tadfGl`kL*}(qzI@2fS+Iv|OZI8F!kw-E?IgBfa zxGQpS`s`hZO?povfZBStbOzMX<39uhSIrjRU*ovbo0f>Tu#vTa$t|!5Nd*@iTF(c>Mf!cQ5L82;W6#s3P&N|f;1li z5x341a=6=KW)Z)w+hdmic3}7PZvPwD-t7NL3N&;39{>V+hw0PsyU#qxGTQL^pGe5H zxVN(7vYeG9d`p~`XUF)Hiq=$*cIqZ*pQ=kMy10Qh>z`Ja=t_WIM4Me6zqXuf zy$e4--nH}|^bTX#v0yAp7b&agXWnk&M{XO`5uQ{X-+*&fJ?SE&mJ&(V6eV3H*?&vA zO7uF?f5ZsvR3~Lt)uSlg>rp02n#CyYZBc$s{x7AOvIxd%cDGq&zOiii4)h2!y%=UK z62FQf<`85UDe+A295Vt{GX7=hD%1a4(p9F{k*>3;j_&m+DrM?XI^&rxX%@?L94?Jl z8vn5zQJKzI4Qy3;2(46D>qVE#;2>YvIhc)ZrGeJDm@A@n?!s?o`Vf9+Y>(>(F~x!g zdh^-$lBb9^x+7OqZ8UZq0V8enyldgMrN`)f7nU(C-yuhk6bivVfl62IcE*Xx`~)1m z>Ci8vu){ziK5W)YFQI>tZjVrd$dg3Kk%f)L7mV-k* z7H~=Ld9eDJ`bg$lJ$`yov#nZOE>!kjkE_V*G;Tgqbw_pQ(okfcv}P))7| zW#N{2?JgjLNeaIDeuf-u&0{0(Z%2QG*lhc=0*Domj~8GSjTMH!Z2++?_J;$A#m?Ub z5REC;XT~LQwu={gE$3|f%=S?a+g>}Ez1yXzbm^i(lr}f#`=GF> zG&|=G7&SpLQ(D$igKS&l>3CD+$R*~KEl(L2eeWJC$MZ-W2NIMsgISZ$LeEc+SD$pQ`&0l z6eLr?k;|8!XH~_p!$L`V-12hnJG8rX_!&s!Rk+eG;mQ;jG-II7!5hvzZu?g3%;O>H zPA8p)!5F4-Mq}stMsf2zEXRsxqt3j!&RB6987tzA;~eS?uN^)oc%Q>&4_>Q43xb_x2QG3j+Fs{a}Dqohkmr=Ij!e>61mVg=m`FoCs8%RQ2D1iC_G*TPuuA!c$i-8I~%%mKIE z+HlgOWO+flA_IjQBI?pMnX%^y-_vG0!w`Ch2N9}b>o%(79>nluR%>_N}r682GQvo)L3tGGk;6mv= zXpvJjfyM>ZOAR>r$OSc+p4QQ*jw2Vy+!%!ig6hnXZH?Yhcdi?~@D}`LrWfg+o*S5i zFZ)W}s;`6^QD($a&!HZx?srd$_q%QBa_2MXL`(|%+o(5HFB=nHxM@Z@ws=oj^=UZ{ zOhZT2iOx!n>DiNK0M8JkGb4?raeL2)+rqHlr3-bIDlf>1dtr?iZR+OmmITht(_adJ(jMWc>X z&mqh-7-cA2#vdvtTNjr<5u+%RkO7o7iO5&!eMUzHP_>q%yBjjps`VgaEad?)#xlg> zIXA$_RHP>$(i1|x;*p*(W~3+Rd*hepCg}O=&2pQ`{PkvP{<;+rYSlB?GI%ZIa|6Q| z9_92T_LMe`s{nBl8}=Xr+?<-TZc}sCIdq_M_y;*d_l!}VIVBzHUcwzLS@f|}9kB`^ zA5BfyFkom1KM>9Kk3O)^}&2?^np_gE5yffL}HWZ-o8SPbFh z_$C=RRbHPVnm4acKSs^la~8cmgRCsnH>WPA-{v6`_MP0>e; zGA`&CRcYrsR1Z#O9#T0mqDI{3R_-3f8k>&LC9gaI*3QA88UqY86!M+uzGc&15>1_F zvrWc4L^MVp>B)ChR$-tP^h3I&ACgO|35XFx_ea=uK!4=B@96#r?ovkGCTom2d=n`4 zGJt}c|F*(k7KmZ|^}x-$>$s0#DcrZBpAsJpeU2-!ht#gh4YB8v_8KKz_cn;r7k?`p z@2qM8&B2w_sF36;IxM{^_MxXu+~Rf(`ltN}k87bt45z+br+4CU+UF_@mHqEZT*ox{kh_~i%oYRjwmHMKRx z;+Gkof%r9zj-Ns)8)(!FDz=PT`e;>=w_dsrb;=rV~iKTn#Y>B5BbD%417Rg(IRozY^mJpT}X zSkg68$kP^l`Hy()M>Y<|7dMht;W1qxZ!ImxH_p# zntx*r|3RSP5Qx!&@*D66TTKoNwwmmU?FZhSsPuyUCboem{*2q|l=lWztL%jdAyy}| zCxNd$pK+h({)jA0bUi!wF4VSsibZWIpOp7OPNXrA2z3Zi4^*K(Lezs*s0Bp*tO_+B zC~RlgUw!sdp99qA!}z#3wQl+MRry&6y#G)YYG0s^FWrnn?B82O*qgj}RiO?CO3k_d zq6+^}vOZFU`WR7YggpBBFj?g*ud|hpSMB5%pLVYB5kslgF#@A0q4BRj31r zy1xo_Fi}6PLLEdDRuAxK02$dHP~?5;6Dil zRNDhHG~Od3XMcf2?J;Nfv@Vhk^%;WI6=}{IdLUkZN-MzHUlq<=29LOBH(D=*8;!VQ zgBy+VxF%CiOPnBcE=nVJBbp)S^Z1FC?rHhP*zi}iAZc0FQO(HaG2Wae{1jp6*!Ukr zY*3XnhGS(N*54V{x%dg%R9xP>)6;wgUf%`wg1KXlde=QDhn1il?#6Ps1S#qr&2;8$ zy=s3`#+4|;-$8k7&!^m9v#enQ;G@_Kl-0X%a2xIN1j?pQ8B+Y3@FIOA@Z%8JoUTGK z3@MP+=#z+MIjKf3r$*c#%hhOyXxejng;W9YbXZE-tMzHek@nmAv|~wotv>B|(q6AmTSnR&pp7!v_9*jB#?1GKxcO=V&DW#d4o(?^s_JdBjKLt@ z)6Tb1y~6nI!1&V{*JOWhE$lw9^Hy`kYEzmVo)tL*>VH@It-L*`d}_7zTFdbU6ML)g z;>HheBYv8-`+d0c=$F2SF9xg^vKyQ#C5U1 zrgCvs*1?8@@gXrOe{(F2;lp9A>G9UF^2C;8YI>`>1Hmn@a9qm5aY#Zg;7p!!>{R3Z z)Au~op95w&mxdx^+>Y`h$1JgbeHwO?$3j)_4{QnKXcDF#vAj=G?3kscPFAX8mKwmB zi>*XLAASq#CnVJ620Tg`Z~*sp#6q3VFIN*-!qf@KT zu4~w?n!tG+6~^pp!sQ_N1J$@2$t+hN%&8`@B2!5_x0--`j{5q8?LmkcX>j;~a~5a8 ze!oxK*-f2&=!saPvlmlDa4kt}XDUg>H9z1{hhAahZ^7MP9di%>wzGLe!aJg2%?XYlB=@Iaj3iwgz2$nrIkU_D^_b3jMcpsQ;l+c#^ z5b2ljb^~tiuSG>J&t&mBE;`M4X?5xi_iVY{wsY;{N{<0Pwh{YbsK=rv3tFw($v#wq z&f+=C$3bsK$XqtclrRmJm0diwah`(-HY7xKv}Hfd|540UWQ)Uic~+v`0aqpcG;ix? zDy&|QRz{X+Fi*J$#~HMJb*P8uV%m{rKSG-E?FT6p($e5=e{0S!5Hoe}d*GUIz0 zzlVgLh=wP@g8Eg>b-Dgt!EYtxCK=qMA_yVE(+16arT$*UZ{&$&cp?>^ga}VpYv!-% z?=|{+Ex%Eu$Og~kf@d-@Qo;lw*O3|D>-G2R`g?=^enWr1$?v0KH0TXN=?g;Xi9+d# znLtk_Zod&v5PlQOXewA%X?3|g2VlqY|V`2|MyEyf}x= zBbJ#eVf%;Gzi8zh6tCVlw{XB~72yz#aaMMDgjQ!o7oZ~eG3toQ)~HrW&!Eh#`T;zx zmK znL38&1Wd2Qm^w6*V(!q)ox@E5^KZy(;V!y_@nNXLe=6|dJrd<^;=~bj5%3N- z5|-7WgrfR3yCXhww|$%jn`gMm@?g@z20_bdL}2>fdxc4OOS1^tX#*jC^|0;S`1kb^N5P8&nmYEC&m%%9SMP}6x0X*1BHcx6*pJ%&VO zZxO{9IiG>Ihv!xaP)UntcOSPo6GD4U$(hqTVXr}Yh&r*5Uq{GSQxTu3u7ZfkC3!i6 z$yyz2_{Ga{56=&R-Hs?Ql=shl3f!_Cs-uK1yezT6=_gCpnZml=+yxS){e!c6-61~SIYY(%uFH0|N>SPC2 z*1r-~bPymsmhm$xCI!#AkGo`k3b-FW=8xOQ|Ii0&8}W&606#$d0hr6sRpE40{iXdO zmbS}!bXiazxU7$S8kN51oB5=jjJoOGOVy}qP*(j138Z`ml2Us;IW1q#RZc*WL0_75 z^(<)Qxqn+zMYVJw)!>+p)3*?g@*@d>q1qpjmxG1MRS=Vqsz!R}?oRM=niZ=C^Xi2j zjcP&#=)MK7ctujG${Y~RpMc1x@Wy<~`7@kNcvpy-;9wIp`o_*wXgv7hNK-CVwgJkj zwcU&fT>YR=26MLZj?G7nDZbIfr};2RR~Lo??|JD`OP1!@6-;_p1}YN23QZ6X>YP$y+k$ z*EnsiSfb@*x21;eR(VEM?x<;ag;E|e&IIK{PmgCTXBaxEniChNXGD*LyO=pN4?mfN zGYg-A=?Tl-9uAD7qSBIa9*{I)LB_kf3HK;^+XFw)Nk2*iL*E&<>6^&6m+{9Z?Ei+p zV7-_4BJz*;0es_lt~s9$9Gi;(k3-ZFz7$l*ru{w!K4eai|7vn1uBXoG@)ApOpuDa6 z#u8V(CKyA<(>HiDFfP)05HasFJ=VPv^&=SdUGWoeiH$W#?w6^oq*(N1%|rwZ$ob|3MlhI!f=r zUbF6B@rz^TOw4IoqsqO~e;~?1{f<)GmMVQ5j>?m)2uiqjKC2#GSN@#8K?asP3T;;D z?<@qi)n=Cd0hjYGet>-spTQTf%fZ@MXp8T1(1m*hjkRT|LO;^kTrr=;dsuSlzqA_) zta=nxo%xqNNe3F6pQ5%Rn7Ail**QTvq>XdWGqQ-H{JZ25qZ1QWxECN{9Ed#tKSjLV zjZh_9XiSuLKr9B+6Z0+4%?2&eDe2K9>CrsUl}S7AgLAo!CL*82LaAdUjV$jbNjnX2 zrJY_VHuU63HeI&TTJtISRAoP?j{0jSNRR2xU><>uS1tn?uTV;AUJrK(ZIDjPLZc{` zx7?FZdF1UvK0VukAImWjV1B~vzrg<6CX^C{xSYH-GBsA+NKB~WvM5YYR zkB2ijZ?s>~SyN(nURLT`d|0u^qX;(#5VW)~qR8|V zkym4wtlgh$!M>s;s$NHlFoy7V0RF;42si6&w7bS(_?v=1mPyw4-^X7Xj=S*3I-dWC z$6af(pRgI_GQe{^lx+i&FX*30)em)`=J~nB)rDR17OMTUCDvH!)DU%E?5~el(dX)Y2g&qMP>+N*TXD=QoL!jv&gUcNuOsJ6k@J>8Vz^{Xh6gc^ z0SRBJVn8!4b0-`Rp;<*fKZ78Haa;zrSv!tnQbgl8a_e!$ejHa29{;$ao-7$xj7wH9 z9zsO|y`PKeovouc^DWYw+*s?Ql=shl3f!+^^-oJ|J-B?F&8d;<_xwYOX z^4&h+@#|ermgqe$S%Ka^7rkGI>D^REZ-e|tMeZu3{yPho3dt9;ty&n_3e;d=gwT|Ab z#Us7Rt@Xy9pl+Y=`1P(QOY|O>EVk2Uq5ggxdb^KJ;qtC`EuJpW%}2DBe!aYBP)m}v z^sfu)I{XHAyMHspB>WpgHRPBy-=xwd zp<|=+;6CvDl6ml8huG1K_E1`6M?*kbUM)$q8V*S^O7gcBcqV>JxS=`gZyUmi(s}5U z`P&eYbaE(RYYs?a26`3{xU{n0^60YN5h#M&R|Vjum2KcuUbiD%-CRlULqCf}Tbtt1 zW@TF>byYu9nIz)LG&us_CqtXVHNZXd@S4RgjhIT1u2mT6rZzLyYgIXm9{Pcian{M^ zeWGmE;T=;Gp540&n1NL9nfUw{LS-L)Z-|bSt9Z=jVop>>jBzB+)mkz}R{fe z8OmjygE!EF@>*F72IVE@j0@%rY-8J~bgD}0e?_A&MjA0M8PAwL;|aOSFmya`i=?6^ zdlFFPRs1Nk2{4RnU`P!6_f=_}C^uVCRWi_MMU_c%Y*K1$Qp+a1SrhEiRE*(O(oaZ7 zKud-a--N0{qaJSu0IsnfQ^yu-Y?@hl7b2?a3=BnM_Vpi+yIJY@RTv`Enseqcd#-E? za#cpkB#^em9Y~B9-8gX<5)-j<9VhNZV%1P}H&j^KNalm662Yu2gFDvPpwm7rI$*yHiM~H~otemsSIGV5!6fl*;iLRfA8ov=ptL3$C`)c<^7NI%w1Y$u;Z*-~dMmSaPX znKdnM5XI4(F2z-xGvGWyqi4b`r+hR#3$XiL6ddPN_JlFwf!u|dJA5vZ`(gCvFcM+k z&tor7{5Pd58&Oo$owvuUZe3x$$F7{vo7+%Zu&-B)AxmeY;#KGljb4p@SEE8rj-duq zMXYyXJ~n0IfCm;e-5*d%k4mO1z0d2A=X?vLusZOVKwKZU<9Q)NT#+`rGz)deU_*b- z=AkmVhAyWz3=N`?VHcEf0DP`T3gc?Jj_D1$8@qOC_l_S3MRv#HhLxI`N~BtX$V|#- z2j;=jBo%n@muaIflgZ>7WjY?$+%)Byf*YFIQOz~!Yi@$GvC2R14aSK#%yzrCFd-^T zh=4R{N8IqQlc8%9Dm8D0TOjAPP0%W}RH@XAWDR!JMR&bW!WVxUq-uA@q&jv$o^Pzg5* z*Qhkny^$(8R0(=CU@gutc5Rrlq(Ro%IQpFOPT*c@PWhav@$Z^bHcN<`dyW1AUn5c3 zd>k)}WZgVQO)#`?VH7Wir)HlCE}oxS-{dYqfV|@EJ0PaL@5=A@@T=|udlV)I;_X2A zk16+UbYpuH@!zKV7s~y8xYYr{Clun25b;YO?2IR#oOUP^9MsCCa5&P%ae2$T3EbYz z_~G^DgB_@+1am7ewtFR$W+{^frz(ew)x^t5JeovI_~+AVwV<8fXtjW7tQH6sToW}{ zp_+?ma0wP%Ma|Wrzn%PsyDEK>!A&YQhzJp$x-@gQ{!ZdI@jgs06k^JM+) z;WzR`GCYwAPeO#JUd=p3f2Z;rc_JB}NQEaM!qeuOc?O-slO$DBOzpi5OP5XnJ7e<&_0>QN?0NK72&=(e?WOCD-VPCB$A7= zDcoVyVp{6P&gno7Y?a~#NO4r)o2`;Li&Q1aSJN# zU!mLt`+l5hoU{;y5>6l8qLn8YkM2d;g!2{%z1iMAW8N)@i#f@s&OvZgHE`GJ72v5- zqJSqZBDwCC5Ly(e4mKv>u!4idxoqiA_~A_(So&nlGU;i>#}+j0d5P&!cnoB?F_1xo zpj<{`4c(Ej9o#OE?blIAwze9>lg;8N{VQ9eDRn2J$eyNI(;cQUk4GWRj#1n}tZHLh zKZcYfF_Z@l!Z@nqoja&lqD8|^jgMh-e-P1X4C5Nd1Qm-l^rHm&J@GhZdZGAD{|Ut@ zNhyxw3{mFf(}jFyU{|epCMOw`Plt+EVMOs51}n^nWf~6-Ea3hFYv{WP$QJ!8tC0sP z^;i4BBC8Bw)mcFq%RGdLJx}}fq}br_N8F|sVK^lC#Ns2cAw`_(v-pT68-=Ma$U5p3 zxNEaw%6%WT5d)kO(~QUq^QDk`Pym(Df%?yV2n~taf(v7{ft<;iPhGw zZ6>kPk!VTPR)t(Txzj$ph9*%}sah)MY?X6q$vHD4If5HsCFymVV@z)RTI?yRnHF^| z3X+t$)3tccmf%u$)UkLDI`0N1blpPJz>zA2iVN+9I%U!envpP+wJ5y+n|?A~i*({7 z*Ih!WxIm|ihC2W=b#fZ+1k8jXjNKSb$OK9ox=?0@Rd_>Z&7KC0Fe(^W$ur_h12uA~ zK#!coyLxcRkf=f^jeRgwMuexK3_)sBg`hfBh|UFK+d&>6S45pP!BHd?^iC%u6J}!q zoYq67vN5GHp;B2s{}C8b4p0+b2nkcDiAn(slPExhX%rwrrS!!)p;FpJVoITx$+=xl zQ{a6c)EiV^(UBM`f6E-@cP{GbU7+&4&}iAX$gZ()N%gm*2Ck+5tFTf=(s%KrTDHPX zJ}QD)25WhUi}UDsBzrj0?uh(`_!98FkD_?SqK_&;+xOMTxWK;4`?B#>5m%;}LB2?O z=q5M%h%G12@$V+^nmVTlNvL0e-2*-c$;^KSV2m+FEMw0?HE|P61tyz? z?vPF5xK6g%f0$X$uf#R6XuMW#k59Yv7$Vfy-)APAB4W|kf0!aWj{|Qy9l$wfVLrcq zZTm*+XTZ6S;Aa&@0PzqJ9|d_8g)!`5cG%Fr=NI*QC;UT!E`CyeH$EIUHX;va;>&-f zNkEp(kv_Au8M!?1;)xHB9-PVe8L`b$55CX#tFsvJS2Aq+UxqOT2<67g-RuQUf%`O5 zJoewNNe%tzG?Hly;b!U6j3M{or{tb1%0-Fur_xW+-<+R9cfs8P4n74&WFJ57mc*3A z$r$s1HL&9Br&FZ|I6?LUcwGJmDK*b-7k+qRnD zYDGO@Of_0&s#$lgK>mKc&9Ugj6+SdfkIwe_!A03KA2g zvr(<}nYP?*N}dRIcLCCRbPbu%#lwh>CXKq z>Sl3co)3#46e*m0!Pzv>*=CkL2p6w4*c)Fdbt8$s5d(w|0Wmm&eaKi7-7MVEto`o; zVwfNO4VY#yj1L+uA2AZB_|YZY$>{rda0Vc69KTBC5oUb$g~$FO)0@xWF!3*^N%!OT zAybN*PfFNEksWQ6;F7}c?@v_97eB9<9=3w8ftmM0)W8Tw6vA*$3a07NOX+f?Mt?z- zL)QDR(+-uC1|+plc@KXR^`0E+#GJFy(7rK|9oRzad?4tJR(YbmnoL5M0|t_8v3L#s zT-{@37+V`{d#H3dv#z>~Ttey<*0-G3V)=L@(yKalVag3QR+cc#fO+y7)!gW&=zDL?#EUt$+1Ser^7+9P?yzi&I=`*_!2B;tkoIWwDV~=9n95- zx7Ol@J=A{v=wp}$cG$_k%C$^et|zTJ1R+=63c-&M+~L;&bpgS1LU19$heL1?!LAnr z=0gcC3BivN{ALJ#jNo5G@GyeAycGCdOmKAw9!~Iy5Illl@5=%6kp!28;86r`4Z$S@ zH-;d#za=Ysy%P96n&9~%cnra3L+}#>`+gHJFC}p~~A$UB& zi$m}Pg1-(yhhX`)f!`Aeo)Us55&UroRtRQa3z%Jk2Zi8rf|rHh$pl{w!BYqhy&m}e zB*7IScq+krL-11sTi*znPb0V}1U-URh2RQ;zYjs5;OyT8epeDaGXzg3_+SXGB3Sr+ zz| zj^N)z@bd(B`(xmDHNmwZxQ5`9A-I;{)VBiWFAzK~1kWRQTL`WrX#6Q)KA+&;A$S47 zFNWY3366x|g#=4~4*Xt3uo8k_B6vp#UQE#XOThePg8PNwdV=di@GAsg3c*VVPJcV_ zdnv(FL+~B>f#7Q)cqPHD{~Gwcir~r+yqe(sA^0_d zZGQ`xuOax+5WJS)*Fx|*f^UZ4^#tesJ@ET=f@g)`4Fn$w!EX@k_(#C}O@c>;;Ee=t z2*H~Oz8!+!A~^5e!0*ijKNo_x5PUoYZzVYSy@2`K1V0giw-LNK1iwS@-4OgP!96wx ze!oZXyb!#d;L{=aeS%xOA28oR@PrWj0m1Kv;13C!MuTo9enfDe5d1O0i$d@x1fLJV zI|=qT1b*)#xI6^!Ciue;yoX@g44CgFct8l=NAQvmyr1AJA^1N8XC?x_KP7lt2tGjY z?ht&CU`sM!{u#jqA@~r%4I%h*f^UT2!vwcY1%4kPxGDr6CHT`2e2ieb6)-JMvr3%wVo1 zS$d5w-e2)L9nmc$&ykz>q`sSjE|-1Y zov~K|)5x-)?m>JLNK?5)0B+*(z_u|3xas)I!p(n7`}^_5MXGY=SWUtvXJd|lJC~TS zSh6A6mV|AR_%%zSrDMsMk7JmO%>#WEE7NeIVv_i$aWk-Csmm6wgD&cchBVGE;6|X8 z=OJUNHZ5mlb9CB+C+sOi#5ofRop_zX+{0CxC2^xdQYVF)hiNyi`M!$&w)(!biRiU2 zq#-_rG*2w>38Rm%9_rzKN8L@2Bgm>4=bHuhScK?L7EYVSySFK+;7^TEAzL}Zp;!p} z`8t4vKZ`^x^zf7Nhxx&h{MPs)BRT(zKDqG+8M|x?WN<$4aHMDL`M~W!kIu!ATc3-; zO-kK9;d*l+_3wG9Cri%7j7wIaH{O@QSa5bs?<4ByJ*P@0@RPqY-5#mxaPoR}w0LXo zyGHYtbuNaFI780BCew}9He)heq9klLCPQ9Hm^~)Le0BbL&X^2sO2XVR87@^iY(FN$ z1uBSbs~Aw}CX%TR*@}*{b3GvT&)4e&Jo40%QaD%#^6Nt67vB2FxoPlaEnGjyjpx|k zUf^dcE>qbBN7eA<#%+97?XBD7g%9oloC%eh(zdK!r4vpUTE7+x7j1k1_>n@hx*Via zg&e%9*l&6?o@x4q90jS}^p^8+*j98yj{8QNx`D@g1V_{?kMZ#zgA*?|DGVd(|00fI zT>Z!67$%qhC@?+kGJBOzO=u{chjtK8NELco2L>1c!uL{Dp%da6!^kW2Ybz-KJ& za?pb*=Uj?}VV{Nf9T~A4p}M2j_;C=4`o`7ed2r2lg0PWi8dZYcAc2uS&_0*IwaM$Td25@OYF*~e%6A3)=Cx1w`GyByg=necZ5RIkkq*4McIc?jk9ZP;x>dhM8Ff1k29r)(1qgA5oH4Y#%- z^u~lG6(H~8rhkrGy5XP9P>?J*=L{#ReAe=%5;3eJk_OJ}8)znjvr8#e+hUh7^h~s1 zkC8N-lGot2N=s2&$U`?);-rbFg8V@+TG#@u4mlN;`7?;nZH4>BBsnj?RZ$E$j!M#^^(nyB9f&jSZmx*Px9u#{vq4x)72$_>%M-C5XJ*3>gpx&%g^ z?ipIp#Kp2bKrg4$y}k2sKhCe!cLo-MuwF)zX^GY7tl;T0bxvAEr+Fk_xfMz)+rtoB z7N&6<9x_MPCqL1!_`U{d6N3F0!Iyo>PlE5S$p6&fzR8oZAEcqYyL(E8&3$q?LFZ%u zmiL`Tbf0d;Po=A=L7#}3WO^UOP1lOJ{06Lkc(;MW*_qZ=DTA-W^!DU6-LxT{5A-3W zNU_0Qlg6FU;cw8Py*V}a0=ShTbIyfx)4H4%>atjC@pWqPZD`SGx0kSIAY0zub`L{) z*_6%Dht#?jPj4 zhr3beJGy@ocw6^Z@}2I!B;P)FOWbpo9hh9X71@!H$uGHHRL4^)ly>Y}LmgroWvGCJ zLfUw2x}nZQhI!loQL(*D$t=FvI#s|eomdg1KF<;8lvdvkyZX_ZvpL@{_o7gQfbDTHHG z^eKd{-dEvY1_F3=fsK+N7Wj1PuDH5{QUM81Du`oItWlS6c$1I{Cn0_F=Y9jdGWya_ ziJPcfTp&UhouIT^HseEDcZMy!JYVU~+A-ve;J|qP?5pSyUV$#aUF{v-l;(CEkx62s%xrxxf-Z1*PcaaF`v}Cf%N*YPp z1t=X!kV~IMLxGM= zn67D$lh~^D?yo!nzuF&jKe_}t?ggDObvN;?M*ID0T!EWwjJDqf_m8HG-C$eTw1jzh zJnmvG$F;(dZFRyTy)OI&w$%mZ(6(q4b6=K(qhh@mqefP(bDzqkx%Y!uaVEfAYCF-g z9uwEpwbT%P1aZNOwUFmO4`;?x2=>AKUjY#-AUHx9&Pt>UGEJk5t$LoN#`N?}#LDK% zr7GLQ@m#d8@iq;Xx)mA=-0*67k{Xkd8ilk}=Td2C^dz7c#aPxZmHH#CYSJo#sx(G+ z@2k9yl&K;~)+^y_mkJOQ9}O_nt+UUqk)&t!tde`^^t76+3Q|Gcu3WbOhC5|BU67WR zN`>oe3oAhWvEnFC*QsNsOS9PO%N$oH4ZA9hQb8Iu%wsk6n9=^5z}DU|CRh#ntZi?@ z{wFo;zCz6HsfPC7sj-1!Of)C-Iye%*Y;Z<{4ZZS>2N-TtA2(eZXGey#v_Y zo9dyjfldjI{KYyYcBmW1BwSe=oD=m)&IBfbuuPAmeIV0_AMk>-7 zwwX~Hu+8EsWXtYB-HMC#rImbgu zyk&b5W@}D>v$-u%a`1INg9`3pYA&1ChWFQai3|&(^e`;%M2uywPUol{j=<9KafRMl3LcRK{O#D1p79%fxzn$rny z>E+weoZ|f>tk+Ih%sk0>Q;@XNKN+}+3x_9|8IM!Cs4ItQ%ewi)@yVe)a#j`UJtv^ zB&nKxV2_xPf)XN4MUE{*%)^+HlpKV?q(;x5pXxM@XAP2L)#CD!j5if*rCm5E%v84n zal_6?Cw-J%XWZRcb2O`(1BWl;btrD{*Nq^;QvHdH*}j=6b32AH&1@Nt>hEj7V@Gzk zn0?iD)DM>TThxc%Yxs#(gTY$}s???N7=hGi?HMsa>|J0*mk!m{TkGxeo;XthN_i(+ zHT<>~|2iw-|Bt#ifs?DK{zrRy@189^J<~mtZ6+a0Gc!p@hGiy50?59I$YKa<0EvLm za64hUxgjV!3Hu_$B1Dlz6hU!8Q4kdr!2kk+5>OCPQFc&}@V?)3>fT%3(-Y_C`!Db1 zlj*AZ)~Tvfr>agZx0X#PuT)izM(x&3er88z?CbYgr$<`Ws1C%Q?VS;qbv3d$0q;@` zixcp!gkkPRGrT~7Fg6Yd3g6ug)gH#&lcp0~A3$$V(-+$e#1k_0zrW&MYV=oo!PDPg z;6NeO?l1Tx{HN>L3LNVowfX*f5N6aK-SyUj>+dh97ngj09aCIB-x=Y1Z;S6r9lk$R z#W$%9-v^U#y2s9Uy|{$$F~#NcofW?KvG`tAhwpu>_$IaC`w;R?_t^Qa7nkrornr2* z@d^~`$$l2!%j@vHe-+=PHhkk4;{=cHvGZLoF5!Djaq&C-k5JF~&wP7l#WPlxrLj^x z#>y0f&+wn1!{x7jZf{1niFMZ{P-*t(_K=`O2@W5Xpj8Qu7?og>ek?z-iU7xEaMoUu zk*^mxzoPGAmJR{kfAGbdKUN;(qqV$>imxe$F*LuX2*6J&f^co&Ovnsx+vF;p)47&Z z>4D*W1ATnbfKr6{$`E)uD~7lz7^OL-nRogKC0XehsCT}uizV^p9Vj8 z^33R|{!f_Ua$4q=N%wR->+Y_?kFkC}w4M=KzYto_gtc-E@?YMILXfrlEs;ixq(QB~ z$IoQ`nl)*hg&^+P5`|dLVHC$Picd)th$9i%9dY2f8PiVsw>NP#F^;5rE`spRkm>2n zFdhYSFMvDco-e=WF}hP3-6H(x*<>7~c#^zjBFCBXh`Ma~{YRR34>Y{7Ox&?29SzCR(U2M)4T-s* zjl_KMQHT-QL2xtDgK36+8es$$6uyTTszZ%=m@$_a^KfGxVay|Gz8SE>;E0W(!3qPD z6$U0N49v$T893UK@+2@4{S4e>?I>d|r5Sdl^hTugMWo^h;+sgsGquUcRhYZ*U)1>- z287;n682ntXhX!~mxgH1w%6kQ_EW`rF4m;I)5Ln%Ut#59lrdy;U?PcxTWkdS|L}mKtZPagG}2s&Sqg=c{pn8mrZ~P>qY!xLA!#)VNfQ z%hb4BjVsi+QjM!CHV1!dV+q_XC-II4$^D|*V$pivvVlY zF1K*xopRP#_RB1Lh!?Qe`DVn!Ltr$^Cxc;pO!@_=(=s1%21~euZzUqsSkr|Cr^PX> zwjwVy5AFs?W5|?GK@{Bj{50ao)QuzMyk~Lq(>`4IX*kZcH=KaUcJQoYZR#m!rc&_1 zD4D;Gq}UD=etdS^C-vgdq47HFDdiICMSLga(5~?p4`1z85zrJe0bc)Pf1Zw!}d%Zw%5ILIF|KXG)4 z_A3QqzynuZ4%63bT-;`rl-e0NsPGSt>P&r3d)0dTEIVeVHbfGL$&Lhh6v7qi=(S2wc zTm7@na{%=oanl@MR4QlVRBtKODdcT2awp3uBLx{Ij|*}FWm7z0Hj2EX!*8=PezE)) z-t@soAElh`fS}qw9e7f1m&YZb2jsJDS$#H4w3gM1lM;h;En2mrxZ8j$Ef=%1;lTh| z_e@5z@v@0 zTc>H*SqR=rD-m*fbNOb-1)G>o2Be!*GUZzU70b8cw|pCZO4zF^-_(oq@cen_+(ze) zfY^`m$&oSsVFb|!BZ;;yjGC;oel;{8Zsy|Y?HdES|51uBB3MmEL$*fAXae^-4W5P0 z?0=NfM@m{nJYR!W-Qwy;#oJt^?>i1 ze-XY<19;E}hHmDvcfPBTA798%DC8#=@{@c{p8ub5GI=B?-MPtCoJ_Vj=|sZtzF|{y zOK*QmTRPV*m;Vl)hGkm#eaG_4_NhR$%jdd#Ffopl zn%H)_1`|p!I10h|!Iw4&SDzS#V8Y-7N^s;T1QQ3>D#0qBVCWJ8HXD-$R|0Bl%5~)? z<|gDO<;IsDK~FWf9`D4V+*;60OR)~!gdyF3Sx`MA3u;QPr>dZOtb#g%N%uIvZVn16 zH%0YLvldj3^C#bL=x7RYN~xJ5Z5cd}uA`3(&TX*3QM!c9vhYxkDWU#tsV!ru#EFK zet{+Dar6O8-s2DgmUfRlH!K|u_J@rib?B`P@;K-$4!t(U!|PaAZ|GN(zWutM=1UXzvyj{Hh>4NFPLiuq~l zC+9bDzJ*wGo5*(n>B9A^a{<1Q+%&wcI1w!g|1imld=~xp`S{~p4MqcI*|&m?UYw}7 z9VRC_G|MQEB<>#>j#fSoQF*rk3#Np(&=L0-E?PQ|3mTlG$0InzCjXpwz)#dA8EzeN z`nnqUc+t)GaQEXA0?qPK_^e&cO{|QEl=Xe0cBD||6wf6~ zd`jSzygf2zdC$MFINbDS>rPNN{jyJtMT<99r)Wtm{vfoz6vrYZzzuUQCd7v5k0U}3c7=xnc1Fg8I z{vO+0rB zqJNvja%>T5=-(o-jAr=)q}*S!9Lp9EUJbbCa)@T2$=L_;S7p;{G=c7?n-S^TTaQ3H zwvf3mSKZ~C(E$B58_Kx@a>kiHfKG_;NsYy~~h5TP*Ee4%22yGUfuzl&|8w zg3f!0I3~K?>@|Si{w8AJlIoqtyvvy1GUm69dABjYYs~K%^ZUlU$Cy7b<`0c|uQ7jQ z%pV)`K4acb^QfR#AUn~@8q^L?d~`kT8LWI2Shl6DAU)iZS9xj%j(bFT{n5*?nMqiS|lk&7N#mlqwEz^haIV(iai58Bx2k^8hLIj$cMF?_qqx zFaa|g4fs<~o0R|)Fdyfgg-kLR-)PXE2?=iB2BGpj??K+Gx~U1B7!kUHHQlWDbB0SG z9JZ91aCo1N((WJR9mIb4Uo`Ss5#V9OCIvT&cW!g~)f5HA12 zRmQkgSpxmmmprR2Bu`__9+W)mFYd7B#qqS}(iai#TJt2dmb@{ZD!+gtyAF?x2e!_@ z=KVy%AT7LuqS4O#j$v?LKTS3bq)9`bF8A0*c;hklRnwZwq`J4Y>vb-dlX|_@zwlfG z&s*1*j}|n8rIV8ri)2 zdQoH&dm)Ti`>>dteJDcDRc@0WEMC49X4Iu7#L2tM!M1)2U5XOC0OMDu3wfKk20dQ` zlw#DSDp-vrwT87xj8@scjSD+(*<_6i=Ni}$S7Z1N%JET`&C0m2qmS)n^_Ru3^ae%* zn&tt1nl~WL31OPQAhqoEVw%6COF2NA4~H(K`K!={G#{Z$InY$lc3IVW&vx3Ua^z2; z$|7sjr5wd7Lx1vij!gxCm}!`Y|l%|qWrZ@VGCavIJY&EFg|q3*s)2F+)>(~EK`l(J&q z7xtpD{|*z0PGkQX>|Msb*Uus+j5qeh-;SIx!Pq(Rm}u>A(4$gMEeW`GY((Q|dlay{>F844UUof0*b^DUx^rPDs4ae}^ zzHE-841D3trNfubQ;eW%J8OI)UOg9eB zk-BFX2PdT6GmYa+l9l{0m`8SRY8;$jcK3>7Lw*%2j;TMHws@%#^=0TF)T3N{$37?# z)HUAJDasCS#YE=f?_>De8Gk(Ah22__&*HCwzm@pIv53g!`1=z6Zo}W*_`45(599AC z{QUucuj21L{6(P@nyDD@w+a6G@Hc?Jt?~D9{OyjveelOk%tzqwSo~G+=i=`R_`3jq zm*MXk{CydJgI~cK^dyDqgYR&b*@;CqjkPm52tkxv3{D?&BcmA zMWphaShu4U8U#sDr&XW^U?u037sc8`>#1VpS(yrkl^{U%jZ~n}V3n`+my7jn2%&Pi zSpP!ndtzNr>rrBTg4RW1&>*DD^_fbh*T~S>m{^qC)TrR zT|sN#N=>Toq{`dkKEAS*m`7C>h63OXpbx2zm3 z=IqL!#hjrBbNeP&4iR^u@`9Kxm4t*(R@!MM`wvLQ%D7`EnQU7B$;OE?9MTgx!>G1A zkrS08IM;kXLRXg_8h~xQbI4Z&!tLB|V2lc=gyV}@osq7Ov|~*ujSgD(%ikMsd?>yL z*Sxq7YZCGgapa=q^JQLw2V$`=cp#OmT*1Ctb|zp0SbsY%qXjU#DO$b~X6Y*WR#u~7 z=sr#d@!+Tp;&~NVcV=Ko)L$C-B1kJ&Ci*Q*C{ehm zBY}XQ-g^AV8j8=9EM9ymWa`n;nPSZT9UIdkTP_ZH!b)&tB6;fHJ6gU0WR=$-t8BD< zBkWCmQ;^tN*cy{~fBMU?!1xM`(ovMiO$4H)ufmx1lwR{ZCpa8{B}$3QPqz@6y@T$( zrz{Rby13s1>Fysb-;4#Zsc#0Ny%jb|_cmB$mXE~027Bpt0w(dV!#?XVO&sqf znv)4Z;=1Nhhz#IrX(Wj;PBgM9%*jYQwrpPvHgS^VE%e?=`JEdr;)oL6iVj2zy&YD! z9)!nw1H$j8;h_!?p1&HNwy3zP!-vBItjWeA)M5N*rs;7n$z|{!w1UW*{W&_0sT*YK zj@P)+Rxz#r1|;C2*&|8*7K-INfT*L`X*oK_TaK>DmSemfW`Z4Nq8(^`ewWtn?#{ z_0b-=pO@;mhjq@S;P|LgqHh`xf)7K{b;OeHzfo@b@g|;t zqAp7ypX8i)3ZDE*4deWJTP$S-jHjB{FZQR!Iq0oy*D=g64_ohFef&_ z*g9hqFX=&DiY$&zx@6H~IQ~^A-9u@B0*<0_jHjbh9UAxXh#OyFd>iI;3BZN)BZy`Il6xLXBSdLRU zCxJ{^YR(kmYcs{9%y!mhIzb}RUz_Qo6@4e}ZE(H;`o4to6BuhV@fFzu9|H%sWZ4lvJ$Qje? zcxqUkl-&)wl#Bj7Uj7bKN%Za0mMDD})+T2c1U3hRux5jklvG)oJ1pd+U5pmuYjerY zwEGS{FgQa$o$N}x?^<+{6GZtvL^RFZ-B8P3;AUZZ0IW6+XgVfHmh}S_l)1-WQcsN835H&`-DwqXjE9mUA z&9S07aDo=n?Awwpb1I(5y67ZSpXn#^H@W2TGsNufTl6??4b^s;p7#u%-Yuld_kh(* zsvrsQhRy8srdi*|eWF(Hygr-hPiFL<%=NALq;m>{m`hfkLx*=7+f_q}b-WbWy`pz# zMkC`ROV9AH3vG_9S`%sI7=`D;rX_h|2b&qPMZE42>nc_-)5DFcl^=i+jta^@gr#sy zp?ojQ8PFJ5{%X%>+Vj~?-Ft(jqe6Gjb$A`NJA+@WAYFqoJOciRF+k@ySAsuzVZHQY zLMUiF$$KIOQLv_Fb>))bNAsaW5w@654St$&r008Rx3+(Ox`-F#u$oRZ*pJcQp37)8 zzK_fzc&AVp4zb=N9Oi|?yzCL;Tfi3{-L>E~?wZUs6^2VcMoXQMYbp*q*Mnc(9)N>j zkz7;faG|sOPn3mooA1-#1(-haBdhkE2MEntqCGf9YIa0mL8=Ew{Xbfg$2m>vg}-|mO5ME;c~Y4e;MPFnmXhiz_?!!^7T=&a8vy^x7|d?tr$ zxl9h{Gia}mWe2zR85M=PJqpG!Nk@U z2J6X>H4a|NX)PtXzDAU-5;RK09Q70G9??(rZ@C+=JRgm6E7~Ce0JnIB%d9U&koJ!I4nDlLu+Lpnag59S$j*W z7mow#9NwN{`(uY_)D{+DA@P$*91HN zp{7T0M=|MJ-&^xi~A&G{vN>=KVPdAldT~w(K98O=6ZO{kiW>59FLvz`uUeG&^D> z@?`m!hoDi5Jz-j>=B7>U=aBWC2 zQ-Iq-phO_%Ja<1fYRHxWE(LhgYtd7Q&H%c;E9=~Y;Ck}c`YMbikH(nOR>J;>AfD2% zAit)xzj@&-lxtd6C~z2JA$F$W9Pe8wzW&`aN|GJeF0o&Xex0R~7rIiOvM&mmb)sMJdT zs523{h?Raq32rXHmLaf(0K0_1mI5pefX{kc0dYPj0LxsyTCNxbSlS1rJtOLz7WjEX zfMd>w_dpm)5ysH>ASGy5S<=aFdmCJpM<7OghD@q#_yqFcnWVy8ONC+9e-3TSZs=GH z#TfXAwDXN^S$xrgUa-o>+XN}MWu4oB<{CA#Qx$sLf~En=rJ#r&1rJd?m;7s(-h86? z2+U`cbLlcmYT@zxOy;~TSrgH14Wg*?C9Iq|Xa*4IFDcM%h(?`z0mn*@5J61HK8PTu{o(_mv`ihYR<&P?s-~6O?Uz(l?NGBhh`|^DO_AhSB7zN|w%ZTG_M@H03E~}M7bW28c zOSUB05#5q;M7J17bW0LCjJm~tQyVJgH*n57D+(nTC>vj~NK_*f%fqahRf^?NA|n)w z(2YtRO2~EWkb3Va(O$qixb@p3HCyK*P~p6y50<{U#QD3_%jF$6Xg8qY3By97NO z=65TT?;s%zl0sY3ZF*fh)0($lcdz>_l}7Bg6aj1OU?UY@YM@G<3U;P8svSU<{b>Ovn&qG0fREAFSl`hkX zM)pTKeUgrr@6I@fO5G@px_`*Hq#0wEC|gr;V3TCQYR4VMC9Rjc1KHVC)rZ%S26h|f zD!)bWEOOMKqmw6rr~JXmLv%=?;Q;*LH{eQF4M?`VDui?-f`ua)4CokZ z9fyrgMvoloE%mVV6sy+=vj4sQ@RS}NHjM(0=@x$aKaBB37^QB~C(hFb;c!$o<|k2d z*ch1A!}vOM*$G3JWcgX3sBf{zE8yD7d(6-KBh0R!_xtDw^8Qu0YVwY8tPhPP?{!#} ztdEwp|B0;X<@poUd43Pv&SD#LIJPR!;jkQM0jVsrec1oTp;A^VLnCHn(xu#wAg~8D zZ|IvLAeE1m;$oFT*oCZwnCQ}uLu&)Bgkl8@s)CdoKCgoR<+S>K;>ro+GrB zfFZ+b0myiCB@Eol^AG2k`28)hlFYgeXfGXx{S7mZo9GmtFkoYXb^XZ${F$^hjAM8m zOOhM-laspP$(+6uy1mcS3g*^ag^mXwve6Yx!~&K?UCAUpmqb@E3fouuzNmbsnaw)7 z{4mUMc&|}3S^h0GR{=7JM)ox6>0S6LV=b1!n21&dtkCqBB&i9@YAC*0iDXs2LWPL= znAsCdV*y_EpasRsdJ4A4=DtQ>5PTs8d)? zV$RYiD-RDP8L~U1HU;Ot4Z298v%AUMP4bYBjz!`-!%EgVFO8 zRC&FS9UDKt601%C=` zU7@-K&?zUj;7`%5qtL7tLZ=ij{3*n`=~J%or#S1j5K0*Sly2Sd6gd1T=XKw%PM=PX zqK7}lzV3=@e>&w<8vI!b>nMMVe>&x`8vI!v>u#;~r&A89!Joym4#%_X@O0{FwV1=w zs>?qM5XFXi9+hv-QqNbgRIElDmD?OP6j&lR7_b4d@FutcfNlD`Dv!C1m~EP+-Ok8!O1a9WnF5aaB7^bbQb+O9K5;`UBg( zj@38jPg(q)g1|p$3~HsJM`4dird2^~%MbMWTt`$cMi3n{bhDs(M3BFw7tmOSut5m4 zQkCRaRn*FuG%#&u11H2>sY~*!YVF{d+|>}3-+{eiE=3%b-+}F7QYNZoO25HblK$B- zmx7GS??6vXM5zKDfI6h4qVnsj!v)CPGi;v))q>ko!98aI0YR~rzyJY3XDxvN0)nnu z0s}12>=zH!gBZQ%$NF1wq>+VQJWOhLuW@#7I8@z1oD*x~3;+p#d=Ea!eRRyB$KeVi z9F$>{vhCnd6YqQ*d)y*oFrO$$Y*KAv1_%fy*Aj$)N*UJyNoT_gy;RIT0>K-S))6EI z2}yDzNDMMn^Yb{nIh9lxsBJ_bgKR8NencRHgz>hIATbDTMAII&Lq`6%IEVv%)HIyH zl%W~N2xzSAUw23I;J>hcT?KU*bvb1a6=P|B?LV&-f5vEfvD*b;+yZdS5|13M(Mr6g zA7aE-Y|_t2Kf<)2M;UQlJuTeF9Hvv(U$XU8i)T?#(G?75RND&Ds9o2Jq<^R6 zAE2pf@045x|L{&pQk%O14~t+CknXYH6<9AWbb;ArV~We?8~Yx?_Zb%7f2_mz=d1W8 zwc&dS`KEj9eAkOh_#RVSKHmev_ZKX_U#!FTnN@s~+VFii`KEj9eAkOh_#RVSKHu2) z0(qZh@%>UAzR#}Wo79HyBgi-1W9PeGT*CL5;_~_4Lij$%;`>i^_&&FaZ&Dk+k0jr8 zkDc#&aS7jJip%GFOX2%Gi|?1~@O^$2-=sEte};V1J$An9#U*@?DK4LHoXSK!xxnK4 z&vp1-UBx%44c|wRZ@S0McfGiT?=i*Y^F1hhud(=kr4HX0R`E@0!}n71P50ROt{0c^ zJ*K#@sBsCB!`c>ZW{*Z9L*&20gFGG;tg%vO87tL*v9e_uD=Vw9viyyeA~jZWX{?uu z6<4HXz01Y=S6Z(SD=t9GdRNlw-}84d9WHf!AL2p72G*E}l1c5pDpA@fm>Du18J7xZEt z1E$P_UZhR6OTg5I-NsTu%;7Cc#i9-1X)W;d17$+bT)p=Pg zav{>%nrUr0o@X{H3t)Kfw{uTAe~nb+7Twv9lK1brUUTU6A-#%gE{tQD-~%D!Z=v#W zM7cKUieotDeH3~P$Gr`3S)w;L*y@`9FTmT!z+0@0XiUt!FrFCzZ0Vp7@~Z{%6+=0n1C#&a%(iPS@>4sk*RdlBRlQcw5f!QBE2E`I%^+xbK-7{RH==5NJ}R8+9V$3 z><5yTz>t)8Mdqa8W3xNM=x+#X?vv%$AwTR}-V}SL-=HW{TFPB&;sGg6g<=DE zYUgNJn%DP&@J$fTdQ^8-F9>#4*QU^$@z2jJifnnIo?-E;;9c?Z4N~d$M^Wnf2bI!| zz`XqcMcsYzYpMzI&O3N8;EQa_vUx-FQo>_cUoVkdua}eX&`oc$cDw~nshcJ+u^29I zmh|Spm68-%%xi+wP7?)X>YVo^BPSuf?T}ugKb?@xXSgupClI?femrpMT?L7>;l7P8 zikZ+IBsfFRJ?A>S!N-<*wfGdgVVF^uJ>&Ey^T-Gt$@1G^aDB>uTqG7R77J2wp&<4A z&wi1XBlyV~BMb0!9?b12gLfojQnE2AN_>7aMY)$LN|fEPNF$yYF2BnH+bV&RAVs{^ zfp>o2!Mbz{u02UMuirYYCEm&A!!nLzgF5aO-wfg?zlVT+f!|VF;7OLS&*y~5K__b& z-=h=Q{yZMUllbJfv<2ept%kND^b~-MnNVzN}JQpw(%i&_&D1} zX$GJ`zO3}I@~6=Z`Zrgvm}oK4M%g4@eq{l~<%<*F3zsRs2sByV7ombusXW~!FUkHe zY@MMl_z}RATk9pd;K%eTu350Tk@Z=v!MqFbAC#eoj#zR(LD(*2ezQNky-toMKg zfzO}7X(9J*lr&mQD+LUYM@E4WCPeTSmIs9Ch zto0H(JQ#QtyoYEnt~rA;`I+GSEmYoBnTP{2`9+1W95IM9^>TGE_e^_no z8~Cg{&?fM%5T2VF@vcyX;zAp&m5GdFD6WxSfw!**5Z2EFP(ODLW$}Nteo}_0pS6OL`bim%^a^CCUMfSseg=ZH>gP^j{iIm! z`boKl^^DGFQFt!t~h4_tm+lOI!(U#67Or`hVO|?3u9sEkqVQAQUxBI=fdZ)|#!`ttIU##td z*Qd-As~j)jLs%3egekZAZS<(fzV~R|e#FZUPgGHE6^bJi<$RG>t(S;$YYH)l zax+ZjaL7IC4M_<87AjxRshl{5WyI@k1CPP;k+Uj6BX49Zi~&=s{gW;OrtDb4DHY=} z1)>uw?Gz>{X8K6u!>&P!#h!277!*Y)3}yny^`qV(Vo$pKEmT%&Cd6Sf@iBM|a_V6+ zk&nw5F{v^Qqri19$OS{D?P$`&cpytAfs9DwFi4$T_&z}{c}>~PY@gbgVMaHN+sq_}uR z8LA~y`YdAh5&;zRl7SsF&Q$0~d+E>-_cEa)>19Jl%4-Z9aUGyG1%T-in*ofhJ{bJR zJ4!o9PN_$V&?9)GFefj_XZ7K_{t1b~ym5){j?EfZUWCzDVt8D%FXgBmF7`^GO_SfApKqf|l$@Ts^A>#?gXSZXUvhsJ$JTJ=&=e^TXxQ2EvuaD;_#h2m-| z21uJ{?kYb+Z-pxNZFE8-qWTVdrV(Bu`tOR@-T1{7et|vaeLt`#yn6z>5#J90SklVK zpbPp~?-w~b((XkHX{?~|U7@W|H$DNGwM8~`+=gn@7AbgGip8k4;9(sWW)HqrpYCBH z7T+)ZI)*3VOFN0&IgjQwHhW2X6dAFvl4qvETWzaxdF>u^-*NrHCBxx@u0Bxp2JYN- z?S?C2Wz*4$VVKl_jv@P*5NCakeB&_}ZlRU!Dib*&VFO3va`4uaOL3I&t=CV6w~hm*bZmH)!W5JZ{}8F0!r%p-<$jwFT0e$^`c^Eiiz9vJ0Do6%ZN|fq=Xg4W z``JX&Oh`z|a!ITuX!OY$c@OuKD6hEcsa#xVu+dmDQQDQI8kbEi{j=lCmY|w6MsceH z=iMop{-=~CW#DT-$Uy|6=NE|ZN8UI4T#BbMR{F#7?hn=O5xm#dXD=v_k|pzEJu*bavXfLigf~B>;;QTFAwr4SATyYF1yn{loVK9FnoR$Q%ufg1b z^MeT}?ER$fegrvjet=~fE}lM*>RQ^H)pJX1GYMUwXSjPI=lv0`vNMv#c;(1NOoO>rJa3U&!_ZhWw@13^u^Zz+m4e&Dyc5;V@r8GU+PNvuTWSSj zzv3OEp4`Of9jEpaXg@*i)W+W7YUiq>CcR7mO`6@1_c^8DP{ljS^2A5NxOcRAE~jTj z?c5vbIch(Z_T$ygjl^CV_M}Vkr82nAW)VK*iC7ojjeAe5DiDtCslT2>nf^CpgZ*c1 zd~6`svsbmRvOh538yE3#T;Mk*bg|1&oK_dxxdxS>0bOh&R>7Tt+11-&)eW7k?l}IB zy=us!)Z1j_&Hpm5&;5tI%1!fjUWd*=N~2^q9o<3-i;`7u4feUJS4~9$Li``?7QZaqk(b`UGxS zdJj3rElUk^@Kofpmf}ZUT|P=(Wmz?_vZAM}Q(4Q$j^1N9jYvlYE#>tfcv>`S9^_Gj zsyv_^L2h=_l4WyJHGTU#nJ)n zZa(EtVQf(P9K7EZIe>jmr_Pbjl!Xr|+py0$2Vl~z^^!j4+`tRMI8PjB;aAs`&JWy0 z?}EUd@NlvL@sTd!tqJTJ=EA^T@Gc7M7?EBaI11h+fxRUz8<4$AEkt_)=}#^j0ZZR> z`3PA0jVlB`8^4HF`kE_kM7po5Y(%=kFWQLoIak|=bacZOVs*FIjDV$!x^@ICnYnHR zESb4}1T2~Pk_F37ckhM}NqRSi4xOENYeyhowh`&bzhWcOZQ{Tb%F@V8I@Pb*NZ3o? zY{TKW;T9VX#~QZ+wma8Y`8rGyTW|m~8p9RWQbBjbbZ=sL7Am-or4D3OM_c7sisuk9 zXvtOH)RspoLAACPz-X28veIWBTLFa+L3a40M-X4{i zSgn`j?bqV<2!2g1UuOYQ$se--spF4ZfK>4(EI?}bZ$iMT;7`_~Qoo<7MWuQ_U5iTX z{%tKPmHU|x)w=y`03^KM1$I-je_sncX8}^L*IR&8>*p;%YV`{i5LW6xSZG+M|7f9M zm3|SZU8Y*46Z~F~jeHyR6~|d}-8s1$4;$4Ik6+u`P`ViNx=w_vXrXB6Z8X_NTu3?C~^ov6KzMW$r=lMIyT-_DB2vdUs#OMGP)zHk^=R#(ss z@-g653nj7gVnh<`lHV~BDL zKi#>s@F;`%;-bYHlRGX_+A*2x&Mnp;sp0`LgOYPgk6&92%0W(3ZVXafWC~B_4py3T zziu&XS2dwqF z-OvtB|Eb?A&Q@V5l`0aK6f+4<%v9tp+Z&t$1n|w79wBxGnH=(S1 zoxL{0I)Jm{weEMCXq7stTEu(JFcmvNkaBVUGe4r4kGXgZ$>X~T4uN@TTOlFnxXuY`BB*pI?5 zR-OVoK54;jeSORv6Bi;7--vlbP-`c^F}diCvERP^dQA*y=y-2lKHkb&Lk z)qh&R3Dm3qvH;Pm?^}TA)ekH{^yS3e3-)vMUxW!C^-ucE%O zZ`};$5v+Ij6=j|GM|qaxkMWyyX^(sN;n%J~I{ar?zGrYG!#=BFe-=`PHRnNzs@6+t z&O_q$bNnW}hXXsd1_pL)8iajh>fARQlYQl%LHbemQiywcquGOd85|u0DV#&44JV6f z6c?$>mE$b}m6On+{W<3j=%^~iWYNURDG)`49$R`-C44-|{@#4YjYgUy2Os0_1N$%e zxq>_@KWXJBHMf?ZkS1n6cQ8vE<%c@uF_h2U7{?c~$*3InFJ+LzBD&cALKl}8LKmB2 z=wdqzU6m>qFTZfv)+A1GvE76&wyn^`_D7ejl8A-PL@Zq07E4f(#lqA} z7Q@*)FS>FifYN04F;xzkZ{Lr6AH{ls`{KDb1ItR04F1O9k9(nb7KVS5@i!fR{l<+G zR)L>SgCV=K$|E$!^QIZU8dp9^!h8gI|fW$ysTfJLl`kkP^bi zBdZYhP}G5FIf~iaxJVQ)BlMJGV()8EAu3zsJLgV| zB2X5U2Xn!>{jq2vDc1+@9mlo(i^~53@!rK=B`yv$#iD!beo=t2_Pyind-Fbqc;xD2 zB!Wvg%s%%*W7O&YH7=3lbH=0 zdqX<`%s8I`_j1r+XcES3GSJB<)JV#X)qJW0_l#c+A&iLOOn{m2#`0MwXTqz6XH_ze z>&M-XTibCf{Xxj(jJ~}ya@KqWvI0%V-?{0t5KI_?XrQH9l{Mzb0%YP6~`PK{h4-=-qX ztI^((@94-ER-O;Jd5>~fR@bX-ze_j{`dJfPzV3; zf%H}gxKRZ>xLo`m#*Pz}CH-vQ$HV9~D)KSgaAyc0hoO8r`ZHV3Q49dghrF=erj zL{piFR3?@hQT2z=!Xj;Wh~C5L(fA##9IPUotc0yfIN75P z9c&On?raH@?pDH=QCE?4w`>O*{H@en?u-cudzA2ACG3&?LxXn+AveW@gj1A|n*b2w z6xmcXc(xGU5D>Crx0s53T*moMl}D@b*f--mROKVSSA*o+q&4h>ubG2qi8xw%eddqtJEXQW`}eSla@Int0nguALjTEsZN8r^ zvKeXR$M+R8&aVR;7ZkTmC~XFx8BBWKwS%BS!CvDxmVVZNO(X+D{J5Cgq;xD4P`+vK zB@x;)d7nX6$R^F{;6vgUDg^91RE5wn_;vB>#s^X@6nd?qt|$y%DqfRX{TNvcog$(c zeW%)b1hT8uBl*5hXPhm9SnE)<_id4JZVYl>Lgdp_{*Ae5rMsjV_q929Am?Cd2e|cK zG%1p~|AvAp;NoF+F8S%X>A5D4HweMfA<71pqTECTON+-b1T5_yhpVu3%4H?61AQR*=C0NGGtx3t;bkT5q^Yu(^ zer9fF!TCFKur@cdn88n{(=kt6U8M|GB!P^_%Of+bx4$HN*ZvDP3bMcDd93#^VEC+z zD|s8k(BI&Umwz!G>j>*7MB?LTw^=T{@%=FTJIs#PLX+h;eqdMQdI{k!Ji0qKFv9{0 zmn_BeRTfYzeTaI<{lLx?Fl~=Xd#z~kaM%`BC>;M9$XjkkTWmr>9$Om+79aS5qPcQd zr><+bxI)PvU56v~C_qg0YyD)%9#g*t7zHmLI!yZ5+#2^1Azbh>p~KL;K$^x7E_h9$ z!wmI>87@8Qri$i}K(`FFgh0Vdh7Refyi^F-@p1jxOT$kY!4|Dd!JL==||w!;SF zG8p~G8dh1{d`@`$?3P@rJ2Sh8-=5i1`es2q6u|^9i{HM<#)+$b#Elj$-rZBgZCr@_ z3Z|CErem(8d#wz6h@BKVeI}KWq%cmilA2hPRAWt2Q|+WwNQ~c_I^~e>U!oGr0>Jt% z?va*VvN*lV#g|;tY?JK`?#N|7lR)Ku4uAd~xojVJGcIy8+DFXgmd9nUpw(bpIJ~UF zjf%CCLY0-IG}>&oFZqh{IhnaiY|bCG184m!!Dl6Koq)@e)l=B!J*#%jdtAv_Wp&p7SvCcv2wWY8#pHi+0(5L}srwTbeiCa}>xG}woy2&rINWmCfsdc$e=l^V}3mYDtt=+p_8U$c{hZ?krAj>6Oi{!r-tR|pL`ENT!b(R_&uz= zVOpYXN{i4X+H`HS>GB?ow%Ll77g1+4TDi0qaS>v)dItFdw4Y;<$N2I|kWAKUMup*< zxc{jU4+}P7$k_z58D?{0K3{f84!y|VnpVIC>aYO}Jpi%UP2e03Ezq`f_jdmYm^d7Q zipu6cVmB5aL_rD-TJ3c!7V5smU~%{+%%~ey^CxHl$&9oBQ)9!8&(a{$1?REqnzkD4 z{kijz4x4UO^+`$fdG2`lAx~jD;$`S|b2%BOiUZYSSTg=W3y}7b*7owBsmsC?^htzI zx>qr!#|NH!27bs(O{$YGh z@+a&UZJ4O-_3(y)D}4K%4HJIl+h1wujA(m}L=K8}oT&B*_-^8&UVpB-UqFTC9;qyj z+_r+_MwsJRvE#Gm`8`3Q-Qx3N_5}qz=WX=_D#`VcUeghI2SnqO-(m| z3U6tBRJ{=!ymBd1{qc@_A*q|Y@D|a?+GDDJi*^7h?Evame=ru-V@?HAL({Z+2ikw= z1@K#^Mk5PCQ(dLoQ9?nLaqes<;v^*^|D1UFacIeGa@k4P9fPY#+;3tu<=%xKWBnGal{-*f%RTtPodv1LpRmkwJoUOC z_FRTdxz8}@3-~E4C}Mdbx;`aQM z`#X>$3x9%PWdS#BMGAO+atchP$;C$yZD1>q2mOCFzrj^`1UJs=#M?^d9r)-Z+ydVw$TfPVU9URj60(O8L;Qm{{>JAR4qKEn)TwnJ ze)Lg$9$yAHGBYtehd6bi`(q<-t&eX?T@z zkC8v;kgwUjCjI9@jI*M=TyxG*6Lnm~cZ8h87F2&TncHdd zdOZyv)NBb*jJ?`8h)8RUZE5!^Is7=?A!2KmIf`gBd#z~et4>^r4k*FALSN&b%1D)4<58>uO$q~ z9$2#2mYy!D;gcQ{^+RFURzSEYQc^1Si}3ZY-m$v6e_#-`a1$=LW7N+vs3o?AFJS2r z$EBO}L!aJ4iW{cPq2bDP=)BBP(lD!)04Uf_RrH!#RB`ev{RqJeo+vJH6Fkj z^ki=V`%2oWL}C8|>}mIG`8`X1&yn9V@f+$B5MBsC)ClZrXs7nb$gTg{pU9ndn`fdK z*|a1JSCWXcY)eeG!GWtLeHIdMOjq=#4VG7n2z2Kd$0c&2nCs+z6G%y@y( zVA6Y)jEy$Ozz3)GgR#-_OSLU@VY|YGM;8`w+M06d!l+^r3~N+zbKsY6EMVcCmn!5M zb4|lds=Cq=KnF-uoR-0c6BLnQ`iOl;>Su;dX}1SyRSl3j0k{+J#kDyJ z0^K3dW+b5Y5Z4U4WMIPh`stDp30(t0U>VL3noa_05ed8rT{0M>-%Pk*^s2F`8hvV% zV1(L40?z}a!x9FbOBXeY5vgAJfCW#EKD6P3YAUGOQmPIHt5Bm4Fda(z3Zee80Gly) zXZW#YR3mIvg&LKB@3_8B7-iy*=HU;Fv>Gj3&t|S|{Pt+m_x!ob`_aZk%&eKEBB!G7 zaqPBrk+!V{N*%P_e4|8O}@9JMG3m6!bH#aQOX93+<+# zDUitSXA<-@{Y(cvgSrAOpQESgXHvAAex{jr)6bAM8Ki^09d@f>rrjhxO`j8|-SjzW z*wb#K{AT61Nq#f<4QmNv%meWIoHp8}&(X~4Gdt1%?FO#br}sBSGnFq<54TVco44L` zXy*&Ritz&VFxM`3fmuO0MBVdHCHfZz^T69!9+*R(h(uinKgL=Kt;=AQ+*WR9I+O4t zXV1AOWtqgehH+vI>uEk}UX3c0E{EWF@cv4gF^{3}h!g|i z5h;d=;@pgcL7X=-?EK)xDRBZ`TMdg7@Rte0{0hzegHVK#grM-f$xwaOm^T~q7GvH@ z^R6H?$q|~=V35RQki^J^C&Y;KHn^Ge*Nk~P&G4x#dLt70A`XIzHzO|1dr~q^Ib14 z;d@MR`Fx)&d_QCHJ*f`g&sOnGYQy(2{cXu7W*H`gPYQy*E$T!_%=eu59!uOcs^7+R7 zCg{_ixA^Xzi9D2wGQ7eRq;(~!*`i{(>->+>%}E}k0~ynZ%_FClg0NY zb@+a{if>XIzVX3ff=Bn*`K}k2@I9uue7;u--+#9Fo>qtNSE~3Xwc#6I>nC`0kDc#& zaS7jJip%Hwbm99i7T?qB@cq{+zDaHPcE~r~W9PeGT*CL5;_~@kC4B$Q;(JCNzF)24 zo79Hy3i+mc?0naYOZXmBTt44t2;YCV_?}sZ?|)SBO=`n8KD$lu=pH-Y_2Lq~#}t>( z_veN0*DStEb@+b0if>XIzL%44y2s9Uy|{$$F~!BRyBJf+Kl45b2WrO3v5&EGIAN^p zp^cTDp0TnYF;=Q(W2Lq;Rw@u!HJzl=&SQ3+ljm7qNmV-kNImEbOo;muJAzNZ9ljY@zE7n#J{qZ0Hh!8=t1 zn9%dw1>Xn%0@_aHrktFO%H@KB4t64Wd4Nf`)=M@^wu@IAeq&xo7*@_6`j;rMjV?qw zXEGf}&QTTDbYi{0`?{Qh;%}jH8a!|#gE(*_!#CtmR8W}yZBJb9{R84U3vqQHnbqsm zk_Te77mJO32TSzLnPeD!-=-OfGo3tGlL(x{{?%?wO4f6^G?iRD?@_C!>qTS1n$^7P zHN{kN@!Z2qVgYi%f0wF;ual~-xo8=kP1)gu8Sg0@kEa_9i(wf}065Z1%4lNX74s&A zVQb1L8o@w6at_mhc40cZwA4vwH-IC(B%R#@uei5|*muQmO!v3$39BX7usmZCZhe~B zfOK(V1JfPEqWXyZZ4Gdwm!$i#z)RMjy=}xjgkPt1Ykd8@n4gIj1fUWvq`SCge^$f! z;>X`Yl7wtXja)qP+IJ1^pS%vn}m|WI{rh&EeJD?q9g}rZ3me-q8 z8TXsOGVY!DmGxXXT$ge0^4+rEpp54Nvi3Uiy!)c5N(Zj>D*pgIk@P?D$gSYvJn&%B zj=Egj8oCl_a@lrC*;-T@&#z6DO);Kp!Y0%M+u|EKR-wyl!xA(7GQ(~^4DTLRmU=HQBYwIj%EdjAmK*lJepMclHFRb#{#yp~%Hg=7e%k^YFPIR2XN+&)2e-{g6afIqV6MUU5OD2eygBXS13bzr zmiA`A5=)k6Ax`fvlgQi>GRIXoJS-!QT7GT!>qrfkH6$w=nD_5#ks;6V$N|U?_V=RR zFs@lRqbc3AY>K@YH%{~~sQhcD-X6mgP0_~7PhhuMV>-DEmjy>X<|5^`ry$)8$@f8C zc?#$L%1`sStH?GUnU9Y(t0f(-2o24KGx*%F0&z69MK^T(6qTe6h1HFY&7F!L?|tMo zKsF)rj*Uzs@~(|c2clnL-m~Eu0sOWN&kW#y0yYV6N)Wten=`XoaOCt`X!G8`;NQ1( zrgMPE&jMuAOqU=}21qerSK^T`N(>ypy@=lXz(z^|7ykx~{7(kpPQg#Q5@#E`Uki-o zwHESRBXZ=5pfs*Pj;H%_{F#wsKjWE$9}j1Tg#$r01EMl&u;IBR++Y|J!g&GVM>aeV zz#l5VeE{6q_(@k9$nTFrejftA7lPmTvaj$vP}2P>KKh`Z&qhtgKyUB@__xJ2bev8l z5L0h_w%mh68DQgV^_hr84C?U`K|H zK7$LF;_EoRTHOSqR0Y?3C(A!&u2=^D2G18s8E}X|u4ZSrVhUPNFK1NJ(8Da~FNiIWd8(><9lGV^-h{TfB5ZgK+{vKrjk1c_? z3rR`|P;XKMMsF(j3wNUkQtsv?9mG$%N)Cz08OYVeA_uNI_MZ|60gr%28>Q=MO1XPs zuvpdSq%-cPfMwi$@N4%u`}*$D`yBTZpmF!cPrA~{LU}OIWtj-x;f`Fwy5{d^ZP89= zO&2(5E#$`y-Uo_YYi=CBD_;t0FZT2;o%8g$K2wE|(^U#=)9)uRs~$9OB>ro|98oLCzeuCDeu6 z!FU9*4NokRw7aK-rI>6KT^;*kJP-sBTgdQR!IetM@;cO(!Mjn46Lf!MTdu9(d>?GA z&9xP+a)Yzec}(#xpAEAQvTeMx#WoVc-w+uV>|#V6b-5-y#4QYd$nK$m194JVcr+PE z8;(r|@U`E{fN>07lFvqSDcuTRm6_Sh%p=UqE2yH*$H9+=x$tP=QaCKFglMYd%gI^P z05H(~XIfW1T78r5akL;DbZ40{-g)Mc*)ms4>hz}-!`=3Gk^lQYTWFTrHrPR=jK z#$n$?XP*Ur3-WhD1>(((!)R(;Zd|Sv8yU910beuj#7CCMrJ{$pI*iwU0tIj>wXv^= z4uc9)MYM?yexZnt0G4r&#IGo#@|hSeSB-O@gaSMi-tOV}NmsJW(-VQt!9IKx^JS7Y zS9pi|;S5s0$?uQPVCRO2E@DKN;>Y_Dhy&zGAgaoLV#C*w@E106ML>AJ4PPC=KeOS> z8U8*SxrE5QHgXM-2W@0Hi0tP!d=&{Fu#sztJY*x65&5x=d@+dZr+^^?m#L>K%@pHP z6eIgneB6s%E;8h5bN>;60B70#$S^khJ4lYuq{hAp5_8`KiMhW+h!N?(;AYbA(+ra)jKG4z_X9)q z?`kT-pb`{R9~!C+)l`H*B`ByqGE@-^=d2V7gGx|PHP9Dkw3>=As04*?%uvOvsR)Bg zP*5cdRkE6jFsK9tRf@jhmK<>cPMg4)>cE5%SWr-94OOEtn~d3P%oby|(tJGF+rnUo zg`rSJ48$^GAeIpWMO%`d1VSR?;HFG+#%wcY-k9yi>@a45=9@uc435MY8i_G56JuZ| z#=uOBfup#mS^^`nBHT>0)0kbx9B<4C#+*nq%o&3rF@{2748+73h>0-}6O%w($9@(K z{z|m}V&ygTlz0*aU%j)9lf~7PcJ4q=6m=&dROxVdlyAa5{Iv69K_?T%<`o~E_I2!9 zcDspUD~^voDYQLAZ%1Gg!&`z*A=-jjra@B+nc7sMU&lo`2F(k)2~jJxO$41rbS}m_ zLYqpL@$oyGbQZ!hC6KPm#3JjE&#REnnE1&-IXQTTL-2CIPR^@izn|n-yvsb%?J?^> znPWxqH7x5f>p+=fMX~gh^_X>_%(0?8$LlfcK$+t(hQ~eT9Wb*jaOrmB*kj&-GRq;c z$Gih&mKAM+%sl2D6{LjihFSC>iO6BdV-Ekjv@Da(t_Toyr-M#Q?+8#Podbb7u6WI0 z#O_S|%8;pq)hqJ^l#*T`R3%0rg(s-=SEweDFN!=FopQx9irHlMe7PwJuOCVJ>Ls!y zBhh3bC6_3b=AqO)VIYY!9daR63D@alJ+gzqOj`qs7|BGCTit)QDFzx>g9npeQ+GT4 zy8AU@ep51kBseRR`Ly$WL3^vvntDS*jjUNCljGXj6#5uYngXeCr1D{jufGb$*xOXZ z=i!@?lr_S9V!W`&1u>~UQFj)DN`sLYlTv@8?rg$=&_S(@V-8_y9EMt3$7Y13bqI`s zzhU4lFn|+WMA;N%-(CW88?Mt9td@Yyst)C+1%RCbS&xDQO8HqR1sQXgO#!7%S@G0q zQIsGmGv%i7NZp_SV-C5k8&6X-UEA6yH=s4GjbZ~@)2t{ppf$~kLbIxr$mVj$=o-kz z=)6s89&XlJCsiY}EswX%1Ep1vai=Ko0O7F2;?5+2HzypFSjyBG zS%2{pop)K%nF->QDL(3Jo;1By%8ovvtWaQbet6B57^`_?8rLQqo=kyD zccgR{TOc}pIgS-H<$N5eMcpl{(8|A|6q?d0Q=#_(Nm>M=aW!X5C$$wr1uZk%UB%+M6b<*^2Lsa$n_#$CS=LCwx3`IR4`O~9&>_P%?wy5b5h&mG^MTf(HvFw zHH@?b<^w3%w_;*G0uh5p&KU|=ANUe@HTq8t$acBpdV=CPBBZLTe=c zAV^f=;?XR>G7A~xtq(d@5QX-8p0_ZgCCJG)Yw}iX%^Meq_$%< zsEP+`^wsf9uxZ={%)n7rGIOfD7t-72V(TjJZRs6U9Wc3TmG^e=KIz!1@Jp%)wy#Q^ zXGS;-F?|Qlk~x(s@{d<@lXA|f^4@{on9m!L#c{Zj(fLzy6%1zoU%)Yjq;n0zY7dii z?u0$4&8#Dd$U2nJ4N{+3j8dWMk9$~Yw7yA0XYE0KW~H%E)*hg&G#1L*6B90&(N8yY!9u)6Q8)1f%Qw%JsI@J0%2{c zMp$<&r1BvsJyu1Dfwe|`rPZ?92+rzah4NTo#Df(@J*086rU=d&qPUF3SVaV9#jp}! z%>a&zP6Aw5_gDwSgJmB^q=(R115Et~(OQ4Eh6-@uuXudL*RsAzeUODPZ$w!~-5n8u z>9n%aT=|*d+fW-i`hd>-af*X=(%~z>PB6mykJ~cAQ{cHXJ%f%a<2-G9?m|zjU1(j+ zIB(dVyH_+0C*4OlhnxBOWuoz!if=J}@kjCvBPS80*N@`YN zZZm2G+kg)Ja|u}+!#M@WWv#RU1`%Ov8!&ZLE_ce;R@lbAq>9e(S+8NmB`1*OcOlDU zI;^M7m7Q2k*|UgfwM3=LP`HFCRE4F1QLKb1PK9}Ihev@DrXVetqSRb!e>>2JF>BaL z5?ss^HKJiyC$%b3tfnY&|CN5;5os;l2ErUsjbscoi0=R+$JO0){DE}`q!@K~N6cZp zNITO7-Git#+}=XaJ!{Y%1^q-#40{Q>7ty7Dl}bBD2>MB)fr?H$uAqApy^7OH_TXvf z1sPR*swUp^gmxdIK?O@Y*9p3B4ehrC-H&L{our+61>K*hOg1&OJERSLnyAIulR~?w zCSGkd2M`UKOWOIH&@Qf_jeVT*J+KDt5cD9TR%+7)J(#G)?^c2yLexraKS2+zp*^R8 zn&7Y+bg9rTAsV#(v~!lAhu5Ij2zo>fsv71pmk4@NO$=p0Pp(1F67&?JR!jbp zpr=-$!NmD)cZ{Vz|RZ3qAG2`?+NVH!p%ET0xJmzc?I

    ?n%(os)F+Snwdv@9p1q-oAZdHp+mnc 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
    >)&XGzF#x-Z#5VFJI$sa(5mSNwd(pI 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

    Bz#t*)n;5pGFq?QqG_nA*DUkJ7G3qh*iuZC7z? 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

    ;tL*^nHH_I1C&CjsnLi=l4(GJY~+) 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 literal 1716224 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�yA!@x-kpj&sq=*X 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 z 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]-Vz_uT)sooEB+m9dm*?x?tqwNQeMcWTLfk(Fe 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≀?^z&l%#GxFb*g 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 diff --git a/bin/OpenMetaverseTypes.dll b/bin/OpenMetaverseTypes.dll index 1329aa79ccb756d0a65661e9fc38c1a40f609da7..01dc3d813cd9a4dfe4ae8dbcd0975368eecdb784 100644 GIT binary patch literal 106496 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

      &ZzZAJmfpq5Y5&y`w1u20j? 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

      eE1gXYBc;iwUDZGZMP=y#^HKOL< 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 literal 114688 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 )na{Se-w*porE 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 From 904d6b787a7fc399544145ae023162d6fa43fb63 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 8 Sep 2010 09:53:57 -0700 Subject: [PATCH 09/35] First version of the Hypergrid HELO service that will enable different backends to interoperate. --- .../Handlers/Hypergrid/HeloServerConnector.cs | 85 +++++++++++++++++++ .../Hypergrid/HeloServiceConnector.cs | 75 ++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs create mode 100644 OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs diff --git a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs new file mode 100644 index 0000000000..3b25a529f2 --- /dev/null +++ b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs @@ -0,0 +1,85 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Reflection; +using Nini.Config; +using log4net; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Server.Handlers.Base; + +namespace OpenSim.Server.Handlers.Hypergrid +{ + public class HeloServiceConnector : ServiceConnector + { + private string m_ConfigName = "HeloService"; + + public HeloServiceConnector(IConfigSource config, IHttpServer server, string configName) : + base(config, server, configName) + { + IConfig serverConfig = config.Configs[m_ConfigName]; + if (serverConfig == null) + throw new Exception(String.Format("No section {0} in config file", m_ConfigName)); + + string handlers = serverConfig.GetString("Handlers", "opensim-robust"); + server.AddStreamHandler(new HeloServerGetHandler(handlers)); + } + } + + public class HeloServerGetHandler : BaseStreamHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private string m_HandlersType; + + public HeloServerGetHandler(string handlersType) : + base("GET", "/helo") + { + m_HandlersType = handlersType; + } + + public override byte[] Handle(string path, Stream requestData, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + return OKResponse(httpResponse); + } + + private byte[] OKResponse(OSHttpResponse httpResponse) + { + httpResponse.AddHeader("X-Handlers-Provided", m_HandlersType); + httpResponse.StatusCode = (int)HttpStatusCode.OK; + httpResponse.StatusDescription = "OK"; + return new byte[0]; + } + + } +} diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs new file mode 100644 index 0000000000..7b166c14e3 --- /dev/null +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs @@ -0,0 +1,75 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using log4net; +using System; +using System.Net; +using System.Reflection; +using Nini.Config; + +namespace OpenSim.Services.Connectors +{ + public class HeloServicesConnector + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private string m_ServerURI = String.Empty; + + public HeloServicesConnector() + { + } + + public HeloServicesConnector(string serverURI) + { + m_ServerURI = serverURI.TrimEnd('/'); + } + + + public virtual string Helo() + { + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo"); + + try + { + WebResponse response = req.GetResponse(); + if (response.Headers.Get("X-Handlers-Provided") == null) // just in case this ever returns a null + return string.Empty; + return response.Headers.Get("X-Handlers-Provided"); + } + catch (Exception e) + { + m_log.DebugFormat("[HELO SERVICE]: Unable to perform HELO request to {0}: {1}", m_ServerURI, e.Message); + } + + // fail + return string.Empty; + } + + } +} From 3fb4a17f1044f5bd995f703233f656f72ebe5269 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 8 Sep 2010 11:30:38 -0700 Subject: [PATCH 10/35] No need for a config var for the HELO message on the server-side. It's robust. --- OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs index 3b25a529f2..6c83affce2 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs @@ -41,17 +41,10 @@ namespace OpenSim.Server.Handlers.Hypergrid { public class HeloServiceConnector : ServiceConnector { - private string m_ConfigName = "HeloService"; - public HeloServiceConnector(IConfigSource config, IHttpServer server, string configName) : base(config, server, configName) { - IConfig serverConfig = config.Configs[m_ConfigName]; - if (serverConfig == null) - throw new Exception(String.Format("No section {0} in config file", m_ConfigName)); - - string handlers = serverConfig.GetString("Handlers", "opensim-robust"); - server.AddStreamHandler(new HeloServerGetHandler(handlers)); + server.AddStreamHandler(new HeloServerGetHandler("opensim-robust")); } } From 8cc3d60e59b631951618d6b89c8ba54a72061bc4 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 8 Sep 2010 14:09:43 -0700 Subject: [PATCH 11/35] Added constructor that takes an URL to asset and inventory simian connectors. --- .../Connectors/SimianGrid/SimianAssetServiceConnector.cs | 5 +++++ .../Connectors/SimianGrid/SimianInventoryServiceConnector.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 8f601e8c48..30d3147aa4 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs @@ -84,6 +84,11 @@ namespace OpenSim.Services.Connectors.SimianGrid CommonInit(source); } + public SimianAssetServiceConnector(string url) + { + m_serverUrl = url; + } + public void Initialise(IConfigSource source) { IConfig moduleConfig = source.Configs["Modules"]; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index 470eccd716..3953369e5f 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs @@ -91,6 +91,11 @@ namespace OpenSim.Services.Connectors.SimianGrid CommonInit(source); } + public SimianInventoryServiceConnector(string url) + { + m_serverUrl = url; + } + public void Initialise(IConfigSource source) { IConfig moduleConfig = source.Configs["Modules"]; From d301f3fd6ad65e3eb39cfaff65cd3fbb896fa5c1 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 8 Sep 2010 14:12:01 -0700 Subject: [PATCH 12/35] Renamed the Helo server connector to a consistent name. Added this in connector to both Robust.HG.ini.example and HypergridServiceInConnectorModule. --- .../Hypergrid/HypergridServiceInConnectorModule.cs | 1 + OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs | 5 +++-- bin/Robust.HG.ini.example | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs index 235914a0b0..2f96bcb1ab 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs @@ -115,6 +115,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Hypergrid m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService); new UserAgentServerConnector(m_Config, MainServer.Instance); + new HeloServiceInConnector(m_Config, MainServer.Instance, "HeloService"); } scene.RegisterModuleInterface(m_HypergridHandler.GateKeeper); } diff --git a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs index 6c83affce2..39baa324cb 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs @@ -39,9 +39,9 @@ using OpenSim.Server.Handlers.Base; namespace OpenSim.Server.Handlers.Hypergrid { - public class HeloServiceConnector : ServiceConnector + public class HeloServiceInConnector : ServiceConnector { - public HeloServiceConnector(IConfigSource config, IHttpServer server, string configName) : + public HeloServiceInConnector(IConfigSource config, IHttpServer server, string configName) : base(config, server, configName) { server.AddStreamHandler(new HeloServerGetHandler("opensim-robust")); @@ -68,6 +68,7 @@ namespace OpenSim.Server.Handlers.Hypergrid private byte[] OKResponse(OSHttpResponse httpResponse) { + m_log.Debug("[HELO]: hi, I was called"); httpResponse.AddHeader("X-Handlers-Provided", m_HandlersType); httpResponse.StatusCode = (int)HttpStatusCode.OK; httpResponse.StatusDescription = "OK"; diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index dae7a19e21..deceb86cdd 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -21,7 +21,7 @@ ; * [[@]/][:] ; * [Startup] -ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:AssetServiceConnector" +ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,8002/OpenSim.Server.Handlers.dll:AssetServiceConnector,8002/OpenSim.Server.Handlers.dll:HeloServiceInConnector" ; * This is common for all services, it's the network setup for the entire ; * server instance, if none if specified above From ae6682036df0268b47a27756915c72367663efec Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 8 Sep 2010 14:13:01 -0700 Subject: [PATCH 13/35] Made the HG asset and inventory brokers use the Helo service in order to instantiate the right network connectors. Tested on Robust only. --- .../Inventory/HGInventoryBroker.cs | 15 +++++++----- .../Asset/HGAssetServiceConnector.cs | 23 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 5b4fecb802..39410b561b 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -37,6 +37,7 @@ using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; using OpenSim.Services.Connectors; +using OpenSim.Services.Connectors.SimianGrid; using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory @@ -538,12 +539,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } else { - // We're instantiating this class explicitly, but this won't - // work in general, because the remote grid may be running - // an inventory server that has a different protocol. - // Eventually we will want a piece of protocol asking - // the remote server about its kind. Definitely cool thing to do! - connector = new RemoteXInventoryServicesConnector(url); + // Still not as flexible as I would like this to be, + // but good enough for now + string connectorType = new HeloServicesConnector(url).Helo(); + m_log.DebugFormat("[HG INVENTORY SERVICE]: HELO returned {0}", connectorType); + if (connectorType == "opensim-simian") + connector = new SimianInventoryServiceConnector(url); + else + connector = new RemoteXInventoryServicesConnector(url); m_connectors.Add(url, connector); } } diff --git a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs index 34df54a90b..5c31639ac2 100644 --- a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs @@ -32,6 +32,8 @@ using System.Collections.Generic; using System.Reflection; using OpenSim.Framework; using OpenSim.Services.Interfaces; +using OpenSim.Services.Connectors.Hypergrid; +using OpenSim.Services.Connectors.SimianGrid; namespace OpenSim.Services.Connectors { @@ -41,7 +43,7 @@ namespace OpenSim.Services.Connectors LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - private Dictionary m_connectors = new Dictionary(); + private Dictionary m_connectors = new Dictionary(); public HGAssetServiceConnector(IConfigSource source) { @@ -81,7 +83,7 @@ namespace OpenSim.Services.Connectors private IAssetService GetConnector(string url) { - AssetServicesConnector connector = null; + IAssetService connector = null; lock (m_connectors) { if (m_connectors.ContainsKey(url)) @@ -90,12 +92,17 @@ namespace OpenSim.Services.Connectors } else { - // We're instantiating this class explicitly, but this won't - // work in general, because the remote grid may be running - // an asset server that has a different protocol. - // Eventually we will want a piece of protocol asking - // the remote server about its kind. Definitely cool thing to do! - connector = new AssetServicesConnector(url); + // Still not as flexible as I would like this to be, + // but good enough for now + string connectorType = new HeloServicesConnector(url).Helo(); + m_log.DebugFormat("[HG ASSET SERVICE]: HELO returned {0}", connectorType); + if (connectorType == "opensim-simian") + { + connector = new SimianAssetServiceConnector(url); + } + else + connector = new AssetServicesConnector(url); + m_connectors.Add(url, connector); } } From 5dc9ea2f2487804d788b4b80d40d91bd792de4c2 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Wed, 8 Sep 2010 15:08:49 -0700 Subject: [PATCH 14/35] * Changed 11 calls for session info to the more optimized API method --- .../Avatar/Friends/FriendsModule.cs | 100 ++++++------------ .../InstantMessage/MessageTransferModule.cs | 4 +- .../Shared/Api/Implementation/LSL_Api.cs | 10 +- .../Connectors/SimianGrid/SimianProfiles.cs | 4 +- 4 files changed, 37 insertions(+), 81 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 6f044cb8f1..1c1ba2db3a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -348,10 +348,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(client.Scene.RegionInfo.ScopeID, new UUID(im.fromAgentID)); im.fromAgentName = account.FirstName + " " + account.LastName; - PresenceInfo presence = null; - PresenceInfo[] presences = PresenceService.GetAgents(new string[] { fid }); - if (presences != null && presences.Length > 0) - presence = presences[0]; + PresenceInfo presence = PresenceService.GetAgent(new UUID(im.fromAgentID)); if (presence != null) im.offline = 0; @@ -470,26 +467,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends return; // The friend is not here [as root]. Let's forward. - PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); - if (friendSessions != null && friendSessions.Length > 0) + PresenceInfo friendSession = PresenceService.GetAgent(friendID); + if (friendSession != null && friendSession.RegionID != UUID.Zero) // let's guard against sessions-gone-bad with the RegionID check { - PresenceInfo friendSession = null; - foreach (PresenceInfo pinfo in friendSessions) - if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad - { - friendSession = pinfo; - break; - } - - if (friendSession != null) - { - GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); - //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); - m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); - } + GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); + //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); + m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); } - - // Friend is not online. Ignore. } else m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friend.Friend); @@ -528,15 +512,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends return; // The prospective friend is not here [as root]. Let's forward. - PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); - if (friendSessions != null && friendSessions.Length > 0) + PresenceInfo friendSession = PresenceService.GetAgent(friendID); + if (friendSession != null) { - PresenceInfo friendSession = friendSessions[0]; - if (friendSession != null) - { - GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); - m_FriendsSimConnector.FriendshipOffered(region, agentID, friendID, im.message); - } + GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); + m_FriendsSimConnector.FriendshipOffered(region, agentID, friendID, im.message); } // If the prospective friend is not online, he'll get the message upon login. } @@ -563,16 +543,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends } // The friend is not here - PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); - if (friendSessions != null && friendSessions.Length > 0) + PresenceInfo friendSession = PresenceService.GetAgent(friendID); + if (friendSession != null) { - PresenceInfo friendSession = friendSessions[0]; - if (friendSession != null) - { - GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); - m_FriendsSimConnector.FriendshipApproved(region, agentID, client.Name, friendID); - client.SendAgentOnline(new UUID[] { friendID }); - } + GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); + m_FriendsSimConnector.FriendshipApproved(region, agentID, client.Name, friendID); + client.SendAgentOnline(new UUID[] { friendID }); } } @@ -591,18 +567,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (LocalFriendshipDenied(agentID, client.Name, friendID)) return; - PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); - if (friendSessions != null && friendSessions.Length > 0) + PresenceInfo friendSession = PresenceService.GetAgent(friendID); + if (friendSession != null) { - PresenceInfo friendSession = friendSessions[0]; - if (friendSession != null) - { - GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); - if (region != null) - m_FriendsSimConnector.FriendshipDenied(region, agentID, client.Name, friendID); - else - m_log.WarnFormat("[FRIENDS]: Could not find region {0} in locating {1}", friendSession.RegionID, friendID); - } + GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); + if (region != null) + m_FriendsSimConnector.FriendshipDenied(region, agentID, client.Name, friendID); + else + m_log.WarnFormat("[FRIENDS]: Could not find region {0} in locating {1}", friendSession.RegionID, friendID); } } @@ -624,15 +596,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (LocalFriendshipTerminated(exfriendID)) return; - PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { exfriendID.ToString() }); - if (friendSessions != null && friendSessions.Length > 0) + PresenceInfo friendSession = PresenceService.GetAgent(exfriendID); + if (friendSession != null) { - PresenceInfo friendSession = friendSessions[0]; - if (friendSession != null) - { - GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); - m_FriendsSimConnector.FriendshipTerminated(region, agentID, exfriendID); - } + GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); + m_FriendsSimConnector.FriendshipTerminated(region, agentID, exfriendID); } } @@ -669,17 +637,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (LocalGrantRights(requester, target, myFlags, rights)) return; - PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { target.ToString() }); - if (friendSessions != null && friendSessions.Length > 0) + PresenceInfo friendSession = PresenceService.GetAgent(target); + if (friendSession != null) { - PresenceInfo friendSession = friendSessions[0]; - if (friendSession != null) - { - GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); - // TODO: You might want to send the delta to save the lookup - // on the other end!! - m_FriendsSimConnector.GrantRights(region, requester, target, myFlags, rights); - } + GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); + // TODO: You might want to send the delta to save the lookup + // on the other end!! + m_FriendsSimConnector.GrantRights(region, requester, target, myFlags, rights); } } } diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index 730cc77896..13bae2eac3 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs @@ -498,9 +498,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage if (lookupAgent) { // Non-cached user agent lookup. - PresenceInfo[] presences = PresenceService.GetAgents(new string[] { toAgentID.ToString() }); - if (presences != null && presences.Length > 0) - upd = presences[0]; + upd = PresenceService.GetAgent(toAgentID); if (upd != null) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b51b410f86..a9c5d10e52 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3971,9 +3971,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } - PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); - if (pinfos != null && pinfos.Length > 0) - pinfo = pinfos[0]; + pinfo = World.PresenceService.GetAgent(uuid); ce = new UserInfoCacheEntry(); ce.time = Util.EnvironmentTickCount(); @@ -3991,11 +3989,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (Util.EnvironmentTickCount() < ce.time || (Util.EnvironmentTickCount() - ce.time) >= 20000) { - PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); - if (pinfos != null && pinfos.Length > 0) - pinfo = pinfos[0]; - else - pinfo = null; + pinfo = World.PresenceService.GetAgent(uuid); ce.time = Util.EnvironmentTickCount(); ce.pinfo = pinfo; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs index 0ef4974f79..b7e8538824 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs @@ -291,8 +291,8 @@ namespace OpenSim.Services.Connectors.SimianGrid // Check if the user is online if (client.Scene is Scene) { - OpenSim.Services.Interfaces.PresenceInfo[] presences = ((Scene)client.Scene).PresenceService.GetAgents(new string[] { avatarID.ToString() }); - if (presences != null && presences.Length > 0) + OpenSim.Services.Interfaces.PresenceInfo presence = ((Scene)client.Scene).PresenceService.GetAgent(avatarID); + if (presence != null) flags |= ProfileFlags.Online; } From 8415b988063234ab7686b873520708891bca50a6 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Thu, 9 Sep 2010 14:45:10 -0700 Subject: [PATCH 15/35] Over a dozen thread safety fixes in FriendsModule --- .../Avatar/Friends/FriendsModule.cs | 330 +++++++++--------- 1 file changed, 163 insertions(+), 167 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 1c1ba2db3a..4e4eee9386 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -54,7 +54,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends public UUID PrincipalID; public FriendInfo[] Friends; public int Refcount; - public UUID RegionID; public bool IsFriend(string friend) { @@ -67,7 +66,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends return false; } } - + + private static readonly FriendInfo[] EMPTY_FRIENDS = new FriendInfo[0]; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected List m_Scenes = new List(); @@ -79,7 +79,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected Dictionary m_Friends = new Dictionary(); - protected List m_NeedsListOfFriends = new List(); + protected HashSet m_NeedsListOfFriends = new HashSet(); protected IPresenceService PresenceService { @@ -146,7 +146,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends // Instantiate the request handler IHttpServer server = MainServer.GetHttpServer((uint)mPort); server.AddStreamHandler(new FriendsRequestHandler(this)); - } if (m_FriendsService == null) @@ -173,7 +172,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends scene.EventManager.OnNewClient += OnNewClient; scene.EventManager.OnClientClosed += OnClientClosed; scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; - scene.EventManager.OnMakeChildAgent += OnMakeChildAgent; scene.EventManager.OnClientLogin += OnClientLogin; } @@ -198,16 +196,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends public uint GetFriendPerms(UUID principalID, UUID friendID) { - if (!m_Friends.ContainsKey(principalID)) - return 0; - - UserFriendData data = m_Friends[principalID]; - - foreach (FriendInfo fi in data.Friends) + FriendInfo[] friends = GetFriends(principalID); + foreach (FriendInfo fi in friends) { if (fi.Friend == friendID.ToString()) return (uint)fi.TheirFlags; } + return 0; } @@ -217,73 +212,59 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends client.OnApproveFriendRequest += OnApproveFriendRequest; client.OnDenyFriendRequest += OnDenyFriendRequest; client.OnTerminateFriendship += OnTerminateFriendship; - client.OnGrantUserRights += OnGrantUserRights; - lock (m_Friends) - { - if (m_Friends.ContainsKey(client.AgentId)) + // Asynchronously fetch the friends list or increment the refcount for the existing + // friends list + Util.FireAndForget( + delegate(object o) { - m_Friends[client.AgentId].Refcount++; - return; + lock (m_Friends) + { + UserFriendData friendsData; + if (m_Friends.TryGetValue(client.AgentId, out friendsData)) + { + friendsData.Refcount++; + } + else + { + friendsData = new UserFriendData(); + friendsData.PrincipalID = client.AgentId; + friendsData.Friends = FriendsService.GetFriends(client.AgentId); + friendsData.Refcount = 1; + + m_Friends[client.AgentId] = friendsData; + } + } } - - UserFriendData newFriends = new UserFriendData(); - - newFriends.PrincipalID = client.AgentId; - newFriends.Friends = m_FriendsService.GetFriends(client.AgentId); - newFriends.Refcount = 1; - newFriends.RegionID = UUID.Zero; - - m_Friends.Add(client.AgentId, newFriends); - } - + ); } private void OnClientClosed(UUID agentID, Scene scene) { ScenePresence sp = scene.GetScenePresence(agentID); if (sp != null && !sp.IsChildAgent) + { // do this for root agents closing out StatusChange(agentID, false); + } lock (m_Friends) - if (m_Friends.ContainsKey(agentID)) + { + UserFriendData friendsData; + if (m_Friends.TryGetValue(agentID, out friendsData)) { - if (m_Friends[agentID].Refcount == 1) + friendsData.Refcount--; + if (friendsData.Refcount <= 0) m_Friends.Remove(agentID); - else - m_Friends[agentID].Refcount--; } + } } private void OnMakeRootAgent(ScenePresence sp) { UUID agentID = sp.ControllingClient.AgentId; - - if (m_Friends.ContainsKey(agentID)) - { - // This is probably an overkill, but just - // to make sure we have the latest and greatest - // friends list -- always pull OnMakeRoot - m_Friends[agentID].Friends = - m_FriendsService.GetFriends(agentID); - - m_Friends[agentID].RegionID = - sp.ControllingClient.Scene.RegionInfo.RegionID; - } - } - - - private void OnMakeChildAgent(ScenePresence sp) - { - UUID agentID = sp.ControllingClient.AgentId; - - if (m_Friends.ContainsKey(agentID)) - { - if (m_Friends[agentID].RegionID == sp.ControllingClient.Scene.RegionInfo.RegionID) - m_Friends[agentID].RegionID = UUID.Zero; - } + UpdateFriendsCache(agentID); } private void OnClientLogin(IClientAPI client) @@ -295,72 +276,56 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends // Register that we need to send the list of online friends to this user lock (m_NeedsListOfFriends) - if (!m_NeedsListOfFriends.Contains(agentID)) - { - m_NeedsListOfFriends.Add(agentID); - } + m_NeedsListOfFriends.Add(agentID); } public void SendFriendsOnlineIfNeeded(IClientAPI client) { UUID agentID = client.AgentId; - if (m_NeedsListOfFriends.Contains(agentID)) + + // Check if the online friends list is needed + lock (m_NeedsListOfFriends) { - if (!m_Friends.ContainsKey(agentID)) - { - m_log.DebugFormat("[FRIENDS MODULE]: agent {0} not found in local cache", agentID); + if (!m_NeedsListOfFriends.Remove(agentID)) return; - } + } - // - // Send the friends online - // - List online = GetOnlineFriends(agentID); - if (online.Count > 0) - { - m_log.DebugFormat("[FRIENDS MODULE]: User {0} in region {1} has {2} friends online", client.AgentId, client.Scene.RegionInfo.RegionName, online.Count); - client.SendAgentOnline(online.ToArray()); - } + // Send the friends online + List online = GetOnlineFriends(agentID); + if (online.Count > 0) + { + m_log.DebugFormat("[FRIENDS MODULE]: User {0} in region {1} has {2} friends online", client.AgentId, client.Scene.RegionInfo.RegionName, online.Count); + client.SendAgentOnline(online.ToArray()); + } - // - // Send outstanding friendship offers - // - if (m_Friends.ContainsKey(agentID)) - { - List outstanding = new List(); + // Send outstanding friendship offers + List outstanding = new List(); + FriendInfo[] friends = GetFriends(agentID); + foreach (FriendInfo fi in friends) + { + if (fi.TheirFlags == -1) + outstanding.Add(fi.Friend); + } - foreach (FriendInfo fi in m_Friends[agentID].Friends) - if (fi.TheirFlags == -1) - outstanding.Add(fi.Friend); + GridInstantMessage im = new GridInstantMessage(client.Scene, UUID.Zero, String.Empty, agentID, (byte)InstantMessageDialog.FriendshipOffered, + "Will you be my friend?", true, Vector3.Zero); - GridInstantMessage im = new GridInstantMessage(client.Scene, UUID.Zero, "", agentID, (byte)InstantMessageDialog.FriendshipOffered, "Will you be my friend?", true, Vector3.Zero); - foreach (string fid in outstanding) - { - try - { - im.fromAgentID = new Guid(fid); - } - catch - { - continue; - } + foreach (string fid in outstanding) + { + UUID fromAgentID; + if (!UUID.TryParse(fid, out fromAgentID)) + continue; - UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(client.Scene.RegionInfo.ScopeID, new UUID(im.fromAgentID)); - im.fromAgentName = account.FirstName + " " + account.LastName; + UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(client.Scene.RegionInfo.ScopeID, fromAgentID); + PresenceInfo presence = PresenceService.GetAgent(fromAgentID); - PresenceInfo presence = PresenceService.GetAgent(new UUID(im.fromAgentID)); - if (presence != null) - im.offline = 0; + im.fromAgentID = fromAgentID.Guid; + im.fromAgentName = account.FirstName + " " + account.LastName; + im.offline = (byte)((presence == null) ? 1 : 0); + im.imSessionID = im.fromAgentID; - im.imSessionID = im.fromAgentID; - - // Finally - LocalFriendshipOffered(agentID, im); - } - } - - lock (m_NeedsListOfFriends) - m_NeedsListOfFriends.Remove(agentID); + // Finally + LocalFriendshipOffered(agentID, im); } } @@ -369,44 +334,46 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends List friendList = new List(); List online = new List(); - foreach (FriendInfo fi in m_Friends[userID].Friends) + FriendInfo[] friends = GetFriends(userID); + foreach (FriendInfo fi in friends) { if (((fi.TheirFlags & 1) != 0) && (fi.TheirFlags != -1)) friendList.Add(fi.Friend); } - if (friendList.Count == 0) - // no friends whatsoever - return online; - - PresenceInfo[] presence = PresenceService.GetAgents(friendList.ToArray()); - - foreach (PresenceInfo pi in presence) - online.Add(new UUID(pi.UserID)); - //m_log.DebugFormat("[XXX] {0} friend online {1}", userID, pi.UserID); + if (friendList.Count > 0) + { + PresenceInfo[] presence = PresenceService.GetAgents(friendList.ToArray()); + foreach (PresenceInfo pi in presence) + { + UUID presenceID; + if (UUID.TryParse(pi.UserID, out presenceID)) + online.Add(presenceID); + } + } return online; } - // - // Find the client for a ID - // + ///

      + /// Find the client for a ID + /// public IClientAPI LocateClientObject(UUID agentID) { Scene scene = GetClientScene(agentID); - if (scene == null) - return null; + if (scene != null) + { + ScenePresence presence = scene.GetScenePresence(agentID); + if (presence != null) + return presence.ControllingClient; + } - ScenePresence presence = scene.GetScenePresence(agentID); - if (presence == null) - return null; - - return presence.ControllingClient; + return null; } - // - // Find the scene for an agent - // + /// + /// Find the scene for an agent + /// private Scene GetClientScene(UUID agentId) { lock (m_Scenes) @@ -414,13 +381,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends foreach (Scene scene in m_Scenes) { ScenePresence presence = scene.GetScenePresence(agentId); - if (presence != null) - { - if (!presence.IsChildAgent) - return scene; - } + if (presence != null && !presence.IsChildAgent) + return scene; } } + return null; } @@ -431,35 +396,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends /// private void StatusChange(UUID agentID, bool online) { - //m_log.DebugFormat("[FRIENDS]: StatusChange {0}", online); - if (m_Friends.ContainsKey(agentID)) + FriendInfo[] friends = GetFriends(agentID); + if (friends.Length > 0) { - //m_log.DebugFormat("[FRIENDS]: # of friends: {0}", m_Friends[agentID].Friends.Length); List friendList = new List(); - foreach (FriendInfo fi in m_Friends[agentID].Friends) + foreach (FriendInfo fi in friends) { if (((fi.MyFlags & 1) != 0) && (fi.TheirFlags != -1)) friendList.Add(fi); } - Util.FireAndForget(delegate - { - foreach (FriendInfo fi in friendList) + Util.FireAndForget( + delegate { - //m_log.DebugFormat("[FRIENDS]: Notifying {0}", fi.PrincipalID); - // Notify about this user status - StatusNotify(fi, agentID, online); + foreach (FriendInfo fi in friendList) + { + //m_log.DebugFormat("[FRIENDS]: Notifying {0}", fi.PrincipalID); + // Notify about this user status + StatusNotify(fi, agentID, online); + } } - }); + ); } - else - m_log.WarnFormat("[FRIENDS]: {0} not found in cache", agentID); } private void StatusNotify(FriendInfo friend, UUID userID, bool online) { - UUID friendID = UUID.Zero; - + UUID friendID; if (UUID.TryParse(friend.Friend, out friendID)) { // Try local @@ -476,12 +439,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends } } else + { m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friend.Friend); + } } private void OnInstantMessage(IClientAPI client, GridInstantMessage im) { - if (im.dialog == (byte)OpenMetaverse.InstantMessageDialog.FriendshipOffered) + if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) { // we got a friendship offer UUID principalID = new UUID(im.fromAgentID); @@ -527,9 +492,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends FriendsService.StoreFriend(agentID, friendID.ToString(), 1); FriendsService.StoreFriend(friendID, agentID.ToString(), 1); - // update the local cache - m_Friends[agentID].Friends = FriendsService.GetFriends(agentID); + // Update the local cache + UpdateFriendsCache(agentID); // // Notify the friend @@ -584,7 +549,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends FriendsService.Delete(exfriendID, agentID.ToString()); // Update local cache - m_Friends[agentID].Friends = FriendsService.GetFriends(agentID); + UpdateFriendsCache(agentID); client.SendTerminateFriend(exfriendID); @@ -606,16 +571,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends private void OnGrantUserRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) { - if (!m_Friends.ContainsKey(remoteClient.AgentId)) + FriendInfo[] friends = GetFriends(remoteClient.AgentId); + if (friends.Length == 0) return; m_log.DebugFormat("[FRIENDS MODULE]: User {0} changing rights to {1} for friend {2}", requester, rights, target); // Let's find the friend in this user's friend list - UserFriendData fd = m_Friends[remoteClient.AgentId]; FriendInfo friend = null; - foreach (FriendInfo fi in fd.Friends) + foreach (FriendInfo fi in friends) + { if (fi.Friend == target.ToString()) friend = fi; + } if (friend != null) // Found it { @@ -672,8 +639,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends GridInstantMessage im = new GridInstantMessage(Scene, userID, userName, friendID, (byte)OpenMetaverse.InstantMessageDialog.FriendshipAccepted, userID.ToString(), false, Vector3.Zero); friendClient.SendInstantMessage(im); - // update the local cache - m_Friends[friendID].Friends = FriendsService.GetFriends(friendID); + + // Update the local cache + UpdateFriendsCache(friendID); + // we're done return true; } @@ -687,7 +656,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (friendClient != null) { // the prospective friend in this sim as root agent - GridInstantMessage im = new GridInstantMessage(Scene, userID, userName, friendID, (byte)OpenMetaverse.InstantMessageDialog.FriendshipDeclined, userID.ToString(), false, Vector3.Zero); friendClient.SendInstantMessage(im); @@ -706,7 +674,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends // the friend in this sim as root agent friendClient.SendTerminateFriend(exfriendID); // update local cache - m_Friends[exfriendID].Friends = FriendsService.GetFriends(exfriendID); + UpdateFriendsCache(exfriendID); // we're done return true; } @@ -735,11 +703,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends } - // update local cache - //m_Friends[friendID].Friends = m_FriendsService.GetFriends(friendID); - foreach (FriendInfo finfo in m_Friends[friendID].Friends) - if (finfo.Friend == userID.ToString()) - finfo.TheirFlags = rights; + // Update local cache + lock (m_Friends) + { + FriendInfo[] friends = GetFriends(friendID); + foreach (FriendInfo finfo in friends) + { + if (finfo.Friend == userID.ToString()) + finfo.TheirFlags = rights; + } + } return true; } @@ -765,7 +738,30 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends return false; } + #endregion + private FriendInfo[] GetFriends(UUID agentID) + { + UserFriendData friendsData; + + lock (m_Friends) + { + if (m_Friends.TryGetValue(agentID, out friendsData)) + return friendsData.Friends; + } + + return EMPTY_FRIENDS; + } + + private void UpdateFriendsCache(UUID agentID) + { + lock (m_Friends) + { + UserFriendData friendsData; + if (m_Friends.TryGetValue(agentID, out friendsData)) + friendsData.Friends = FriendsService.GetFriends(agentID); + } + } } } From 9609faa8eb330dc85dfb2efec1e7e5652f01d6f2 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Thu, 9 Sep 2010 15:05:22 -0700 Subject: [PATCH 16/35] * Run SimianGrid session updates asynchronously instead of from the main heartbeat thread * Minor dead code cleanup --- .../SimianGrid/SimianActivityDetector.cs | 8 ++- .../SimianAvatarServiceConnector.cs | 3 - .../SimianFriendsServiceConnector.cs | 3 - .../SimianInventoryServiceConnector.cs | 1 - .../SimianPresenceServiceConnector.cs | 55 ------------------- .../SimianUserAccountServiceConnector.cs | 1 - 6 files changed, 5 insertions(+), 66 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs index a871d07f16..67b73f39de 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs @@ -26,11 +26,9 @@ */ using System; -using System.Collections.Generic; using System.Reflection; using OpenSim.Framework; using OpenSim.Region.Framework.Scenes; -using OpenSim.Services.Interfaces; using OpenMetaverse; using log4net; @@ -107,7 +105,11 @@ namespace OpenSim.Services.Connectors.SimianGrid void OnEnteringNewParcel(ScenePresence sp, int localLandID, UUID regionID) { - m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + // Asynchronously update the position stored in the session table for this agent + Util.FireAndForget(delegate(object o) + { + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + }); } } } diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs index 3505c640a0..4d0d53ec0b 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs @@ -28,8 +28,6 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using System.IO; -using System.Net; using System.Reflection; using log4net; using Mono.Addins; @@ -37,7 +35,6 @@ using Nini.Config; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; -using OpenSim.Server.Base; using OpenSim.Services.Interfaces; using OpenMetaverse; using OpenMetaverse.StructuredData; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs index 5b18aeff3c..6f2d73559b 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs @@ -30,13 +30,10 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using log4net; -using Mono.Addins; using Nini.Config; using OpenMetaverse; using OpenMetaverse.StructuredData; using OpenSim.Framework; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; using FriendInfo = OpenSim.Services.Interfaces.FriendInfo; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index 3953369e5f..21ad4abd9a 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs @@ -37,7 +37,6 @@ using OpenMetaverse.StructuredData; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; -using OpenSim.Server.Base; using OpenSim.Services.Interfaces; namespace OpenSim.Services.Connectors.SimianGrid diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs index 077be3c31a..a344594a1d 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs @@ -28,17 +28,14 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using System.Net; using System.Reflection; using log4net; using Mono.Addins; using Nini.Config; using OpenSim.Framework; -using OpenSim.Framework.Servers.HttpServer; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; -using OpenSim.Server.Base; using OpenMetaverse; using OpenMetaverse.StructuredData; @@ -358,25 +355,6 @@ namespace OpenSim.Services.Connectors.SimianGrid return null; } -// private OSDMap GetSessionData(UUID sessionID) -// { -// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for session " + sessionID); -// -// NameValueCollection requestArgs = new NameValueCollection -// { -// { "RequestMethod", "GetSession" }, -// { "SessionID", sessionID.ToString() } -// }; -// -// OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); -// if (response["Success"].AsBoolean()) -// return response; -// else -// m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session data for session " + sessionID); -// -// return null; -// } - private List GetSessions(UUID userID) { List presences = new List(1); @@ -429,39 +407,6 @@ namespace OpenSim.Services.Connectors.SimianGrid return success; } - ///// - ///// Fetch the last known avatar location with GetSession and persist it - ///// as user data with AddUserData - ///// - //private bool SetLastLocation(UUID sessionID) - //{ - // NameValueCollection requestArgs = new NameValueCollection - // { - // { "RequestMethod", "GetSession" }, - // { "SessionID", sessionID.ToString() } - // }; - - // OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); - // bool success = response["Success"].AsBoolean(); - - // if (success) - // { - // UUID userID = response["UserID"].AsUUID(); - // UUID sceneID = response["SceneID"].AsUUID(); - // Vector3 position = response["ScenePosition"].AsVector3(); - // Vector3 lookAt = response["SceneLookAt"].AsVector3(); - - // return SetLastLocation(userID, sceneID, position, lookAt); - // } - // else - // { - // m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve presence information for session " + sessionID + - // " while saving last location: " + response["Message"].AsString()); - // } - - // return success; - //} - private PresenceInfo ResponseToPresenceInfo(OSDMap sessionResponse, OSDMap userResponse) { if (sessionResponse == null) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 1ac9882c24..ddd232286f 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -28,7 +28,6 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using System.IO; using System.Reflection; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; From dd277a0d02f1aa79f4fcb5d108cbc696e90500c2 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 10 Sep 2010 12:04:12 -0700 Subject: [PATCH 17/35] First pass at cleaning up thread safety in EntityManager and SceneGraph --- OpenSim/Data/IAssetData.cs | 11 - OpenSim/Data/IInventoryData.cs | 11 - .../Avatar/Attachments/AttachmentsModule.cs | 2 +- .../ArchiveWriteRequestPreparation.cs | 2 +- .../World/Land/LandManagementModule.cs | 3 +- .../World/Serialiser/SerialiseObjects.cs | 2 +- .../World/Serialiser/SerialiserModule.cs | 4 +- .../World/WorldMap/MapImageModule.cs | 2 +- OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | 3 +- .../Interfaces/IRegionSerialiserModule.cs | 4 +- .../Region/Framework/Scenes/EntityManager.cs | 208 ++++---------- .../Framework/Scenes/Scene.Inventory.cs | 3 +- .../Framework/Scenes/Scene.PacketHandlers.cs | 16 +- OpenSim/Region/Framework/Scenes/Scene.cs | 45 ++- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 271 +++++++++--------- .../Region/Framework/Scenes/SceneViewer.cs | 3 +- .../Scenes/Serialization/SceneXmlLoader.cs | 23 +- .../Server/IRCClientView.cs | 10 +- .../CMEntityCollection.cs | 2 +- .../ContentManagementEntity.cs | 2 +- .../Scripting/Minimodule/ObjectAccessor.cs | 4 +- .../Scripting/Minimodule/World.cs | 6 +- .../TreePopulator/TreePopulatorModule.cs | 3 +- .../Implementation/Plugins/SensorRepeat.cs | 2 +- .../SimianGrid/SimianActivityDetector.cs | 5 +- 25 files changed, 252 insertions(+), 395 deletions(-) diff --git a/OpenSim/Data/IAssetData.cs b/OpenSim/Data/IAssetData.cs index 90d5eeb489..f31b215c0f 100644 --- a/OpenSim/Data/IAssetData.cs +++ b/OpenSim/Data/IAssetData.cs @@ -40,15 +40,4 @@ namespace OpenSim.Data void Initialise(string connect); bool Delete(string id); } - - public class AssetDataInitialiser : PluginInitialiserBase - { - private string connect; - public AssetDataInitialiser (string s) { connect = s; } - public override void Initialise (IPlugin plugin) - { - IAssetDataPlugin p = plugin as IAssetDataPlugin; - p.Initialise (connect); - } - } } diff --git a/OpenSim/Data/IInventoryData.cs b/OpenSim/Data/IInventoryData.cs index 90f74b713b..74d5d37bf9 100644 --- a/OpenSim/Data/IInventoryData.cs +++ b/OpenSim/Data/IInventoryData.cs @@ -155,15 +155,4 @@ namespace OpenSim.Data /// List fetchActiveGestures(UUID avatarID); } - - public class InventoryDataInitialiser : PluginInitialiserBase - { - private string connect; - public InventoryDataInitialiser (string s) { connect = s; } - public override void Initialise (IPlugin plugin) - { - IInventoryDataPlugin p = plugin as IInventoryDataPlugin; - p.Initialise (connect); - } - } } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index dd7d831ed8..7270304a2d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -436,7 +436,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // We can NOT use the dictionries here, as we are looking // for an entity by the fromAssetID, which is NOT the prim UUID - List detachEntities = m_scene.GetEntities(); + EntityBase[] detachEntities = m_scene.GetEntities(); SceneObjectGroup group; foreach (EntityBase entity in detachEntities) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index b25636ffcb..283b33be04 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -102,7 +102,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver { Dictionary assetUuids = new Dictionary(); - List entities = m_scene.GetEntities(); + EntityBase[] entities = m_scene.GetEntities(); List sceneObjects = new List(); /* diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index da7a284ed9..ea71fd9f59 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -794,7 +794,8 @@ namespace OpenSim.Region.CoreModules.World.Land public void EventManagerOnParcelPrimCountUpdate() { ResetAllLandPrimCounts(); - foreach (EntityBase obj in m_scene.Entities) + EntityBase[] entities = m_scene.Entities.GetEntities(); + foreach (EntityBase obj in entities) { if (obj != null) { diff --git a/OpenSim/Region/CoreModules/World/Serialiser/SerialiseObjects.cs b/OpenSim/Region/CoreModules/World/Serialiser/SerialiseObjects.cs index bef7fe4627..5067ebd12b 100644 --- a/OpenSim/Region/CoreModules/World/Serialiser/SerialiseObjects.cs +++ b/OpenSim/Region/CoreModules/World/Serialiser/SerialiseObjects.cs @@ -80,7 +80,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser { string xmlstream = ""; - List EntityList = scene.GetEntities(); + EntityBase[] EntityList = scene.GetEntities(); List EntityXml = new List(); foreach (EntityBase ent in EntityList) diff --git a/OpenSim/Region/CoreModules/World/Serialiser/SerialiserModule.cs b/OpenSim/Region/CoreModules/World/Serialiser/SerialiserModule.cs index 58e42619c7..98fe4935bc 100644 --- a/OpenSim/Region/CoreModules/World/Serialiser/SerialiserModule.cs +++ b/OpenSim/Region/CoreModules/World/Serialiser/SerialiserModule.cs @@ -165,12 +165,12 @@ namespace OpenSim.Region.CoreModules.World.Serialiser return SceneXmlLoader.SaveGroupToXml2(grp); } - public void SavePrimListToXml2(List entityList, string fileName) + public void SavePrimListToXml2(EntityBase[] entityList, string fileName) { SceneXmlLoader.SavePrimListToXml2(entityList, fileName); } - public void SavePrimListToXml2(List entityList, TextWriter stream, Vector3 min, Vector3 max) + public void SavePrimListToXml2(EntityBase[] entityList, TextWriter stream, Vector3 min, Vector3 max) { SceneXmlLoader.SavePrimListToXml2(entityList, stream, min, max); } diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs index 57eff8a0b3..1d9c2bdc07 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs @@ -212,7 +212,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap double[,] hm = whichScene.Heightmap.GetDoubles(); tc = Environment.TickCount; m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); - List objs = whichScene.GetEntities(); + EntityBase[] objs = whichScene.GetEntities(); Dictionary z_sort = new Dictionary(); //SortedList z_sort = new SortedList(); List z_sortheights = new List(); diff --git a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs index 3c39f9e9cf..5e75cae838 100644 --- a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs @@ -101,7 +101,8 @@ namespace OpenSim.Region.DataSnapshot.Providers XmlNode parent = nodeFactory.CreateNode(XmlNodeType.Element, "objectdata", ""); XmlNode node; - foreach (EntityBase entity in m_scene.Entities) + EntityBase[] entities = m_scene.Entities.GetEntities(); + foreach (EntityBase entity in entities) { // only objects, not avatars if (entity is SceneObjectGroup) diff --git a/OpenSim/Region/Framework/Interfaces/IRegionSerialiserModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionSerialiserModule.cs index e7562a55c9..18758c8832 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionSerialiserModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionSerialiserModule.cs @@ -90,7 +90,7 @@ namespace OpenSim.Region.Framework.Interfaces ///

    cVi@f8IYU+@Cgpd-O;&wKyo7b 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

    QJzdj^y63OU!so8q)mMAQD!Xq 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

    QJzdj^y63OU!so8q)mMAQD!Xq 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

cVi@f8IYU+@Cgpd-O;&wKyo7b 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

/// /// - void SavePrimListToXml2(List entityList, string fileName); + void SavePrimListToXml2(EntityBase[] entityList, string fileName); /// /// Save a set of prims in the xml2 format, optionally specifying a bounding box for which @@ -101,7 +101,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// - void SavePrimListToXml2(List entityList, TextWriter stream, Vector3 min, Vector3 max); + void SavePrimListToXml2(EntityBase[] entityList, TextWriter stream, Vector3 min, Vector3 max); void SaveNamedPrimsToXml2(Scene scene, string primName, string fileName); diff --git a/OpenSim/Region/Framework/Scenes/EntityManager.cs b/OpenSim/Region/Framework/Scenes/EntityManager.cs index 099fcce559..85d0a4f9ec 100644 --- a/OpenSim/Region/Framework/Scenes/EntityManager.cs +++ b/OpenSim/Region/Framework/Scenes/EntityManager.cs @@ -34,187 +34,89 @@ using OpenMetaverse; namespace OpenSim.Region.Framework.Scenes { - public class EntityManager : IEnumerable + public class EntityManager //: IEnumerable { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private readonly Dictionary m_eb_uuid = new Dictionary(); - private readonly Dictionary m_eb_localID = new Dictionary(); - //private readonly Dictionary m_pres_uuid = new Dictionary(); - private readonly Object m_lock = new Object(); + private readonly DoubleDictionary m_entities = new DoubleDictionary(); - [Obsolete("Use Add() instead.")] - public void Add(UUID id, EntityBase eb) + public int Count { - Add(eb); + get { return m_entities.Count; } } public void Add(EntityBase entity) { - lock (m_lock) - { - try - { - m_eb_uuid.Add(entity.UUID, entity); - m_eb_localID.Add(entity.LocalId, entity); - } - catch(Exception e) - { - m_log.ErrorFormat("Add Entity failed: {0}", e.Message); - } - } - } - - public void InsertOrReplace(EntityBase entity) - { - lock (m_lock) - { - try - { - m_eb_uuid[entity.UUID] = entity; - m_eb_localID[entity.LocalId] = entity; - } - catch(Exception e) - { - m_log.ErrorFormat("Insert or Replace Entity failed: {0}", e.Message); - } - } + m_entities.Add(entity.UUID, entity.LocalId, entity); } public void Clear() { - lock (m_lock) - { - m_eb_uuid.Clear(); - m_eb_localID.Clear(); - } - } - - public int Count - { - get - { - return m_eb_uuid.Count; - } + m_entities.Clear(); } public bool ContainsKey(UUID id) { - try - { - return m_eb_uuid.ContainsKey(id); - } - catch - { - return false; - } + return m_entities.ContainsKey(id); } public bool ContainsKey(uint localID) { - try - { - return m_eb_localID.ContainsKey(localID); - } - catch - { - return false; - } + return m_entities.ContainsKey(localID); } public bool Remove(uint localID) { - lock (m_lock) - { - try - { - bool a = false; - EntityBase entity; - if (m_eb_localID.TryGetValue(localID, out entity)) - a = m_eb_uuid.Remove(entity.UUID); - - bool b = m_eb_localID.Remove(localID); - return a && b; - } - catch (Exception e) - { - m_log.ErrorFormat("Remove Entity failed for {0}", localID, e); - return false; - } - } + return m_entities.Remove(localID); } public bool Remove(UUID id) { - lock (m_lock) - { - try - { - bool a = false; - EntityBase entity; - if (m_eb_uuid.TryGetValue(id, out entity)) - a = m_eb_localID.Remove(entity.LocalId); - - bool b = m_eb_uuid.Remove(id); - return a && b; - } - catch (Exception e) - { - m_log.ErrorFormat("Remove Entity failed for {0}", id, e); - return false; - } - } + return m_entities.Remove(id); } - public List GetAllByType() + public EntityBase[] GetAllByType() { List tmp = new List(); - lock (m_lock) - { - try + m_entities.ForEach( + delegate(EntityBase entity) { - foreach (KeyValuePair pair in m_eb_uuid) - { - if (pair.Value is T) - { - tmp.Add(pair.Value); - } - } + if (entity is T) + tmp.Add(entity); } - catch (Exception e) - { - m_log.ErrorFormat("GetAllByType failed for {0}", e); - tmp = null; - } - } + ); - return tmp; + return tmp.ToArray(); } - public List GetEntities() + public EntityBase[] GetEntities() { - lock (m_lock) - { - return new List(m_eb_uuid.Values); - } + List tmp = new List(m_entities.Count); + m_entities.ForEach(delegate(EntityBase entity) { tmp.Add(entity); }); + return tmp.ToArray(); + } + + public void ForEach(Action action) + { + m_entities.ForEach(action); + } + + public EntityBase Find(Predicate predicate) + { + return m_entities.FindValue(predicate); } public EntityBase this[UUID id] { get { - lock (m_lock) - { - EntityBase entity; - if (m_eb_uuid.TryGetValue(id, out entity)) - return entity; - else - return null; - } + EntityBase entity; + m_entities.TryGetValue(id, out entity); + return entity; } set { - InsertOrReplace(value); + Add(value); } } @@ -222,50 +124,38 @@ namespace OpenSim.Region.Framework.Scenes { get { - lock (m_lock) - { - EntityBase entity; - if (m_eb_localID.TryGetValue(localID, out entity)) - return entity; - else - return null; - } + EntityBase entity; + m_entities.TryGetValue(localID, out entity); + return entity; } set { - InsertOrReplace(value); + Add(value); } } public bool TryGetValue(UUID key, out EntityBase obj) { - lock (m_lock) - { - return m_eb_uuid.TryGetValue(key, out obj); - } + return m_entities.TryGetValue(key, out obj); } public bool TryGetValue(uint key, out EntityBase obj) { - lock (m_lock) - { - return m_eb_localID.TryGetValue(key, out obj); - } + return m_entities.TryGetValue(key, out obj); } /// /// This could be optimised to work on the list 'live' rather than making a safe copy and iterating that. /// /// - public IEnumerator GetEnumerator() - { - return GetEntities().GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } + //public IEnumerator GetEnumerator() + //{ + // return GetEntities().GetEnumerator(); + //} + //IEnumerator IEnumerable.GetEnumerator() + //{ + // return GetEnumerator(); + //} } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index c49386a85b..a439eb9f1f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -58,7 +58,8 @@ namespace OpenSim.Region.Framework.Scenes { m_log.Info("[PRIM INVENTORY]: Starting scripts in scene"); - foreach (EntityBase group in Entities) + EntityBase[] entities = Entities.GetEntities(); + foreach (EntityBase group in entities) { if (group is SceneObjectGroup) { diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index c511774d69..2f69476664 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -116,9 +116,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void RequestPrim(uint primLocalID, IClientAPI remoteClient) { - List EntityList = GetEntities(); - - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { @@ -138,9 +137,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void SelectPrim(uint primLocalID, IClientAPI remoteClient) { - List EntityList = GetEntities(); - - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { @@ -259,7 +257,7 @@ namespace OpenSim.Region.Framework.Scenes public virtual void ProcessObjectGrab(uint localID, Vector3 offsetPos, IClientAPI remoteClient, List surfaceArgs) { - List EntityList = GetEntities(); + EntityBase[] EntityList = GetEntities(); SurfaceTouchEventArgs surfaceArg = null; if (surfaceArgs != null && surfaceArgs.Count > 0) @@ -303,7 +301,7 @@ namespace OpenSim.Region.Framework.Scenes public virtual void ProcessObjectGrabUpdate(UUID objectID, Vector3 offset, Vector3 pos, IClientAPI remoteClient, List surfaceArgs) { - List EntityList = GetEntities(); + EntityBase[] EntityList = GetEntities(); SurfaceTouchEventArgs surfaceArg = null; if (surfaceArgs != null && surfaceArgs.Count > 0) @@ -343,7 +341,7 @@ namespace OpenSim.Region.Framework.Scenes public virtual void ProcessObjectDeGrab(uint localID, IClientAPI remoteClient, List surfaceArgs) { - List EntityList = GetEntities(); + EntityBase[] EntityList = GetEntities(); SurfaceTouchEventArgs surfaceArg = null; if (surfaceArgs != null && surfaceArgs.Count > 0) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 82e7d763df..7ce95a7299 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1029,29 +1029,30 @@ namespace OpenSim.Region.Framework.Scenes if (ScriptEngine) { m_log.Info("Stopping all Scripts in Scene"); - foreach (EntityBase ent in Entities) + + EntityBase[] entities = Entities.GetEntities(); + foreach (EntityBase ent in entities) { if (ent is SceneObjectGroup) - { - ((SceneObjectGroup) ent).RemoveScriptInstances(false); - } + ((SceneObjectGroup)ent).RemoveScriptInstances(false); } } else { m_log.Info("Starting all Scripts in Scene"); - lock (Entities) + + EntityBase[] entities = Entities.GetEntities(); + foreach (EntityBase ent in entities) { - foreach (EntityBase ent in Entities) + if (ent is SceneObjectGroup) { - if (ent is SceneObjectGroup) - { - ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0); - ((SceneObjectGroup)ent).ResumeScripts(); - } + SceneObjectGroup sog = (SceneObjectGroup)ent; + sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0); + sog.ResumeScripts(); } } } + m_scripts_enabled = !ScriptEngine; m_log.Info("[TOTEDD]: Here is the method to trigger disabling of the scripting engine"); } @@ -1098,7 +1099,7 @@ namespace OpenSim.Region.Framework.Scenes shuttingdown = true; m_log.Debug("[SCENE]: Persisting changed objects"); - List entities = GetEntities(); + EntityBase[] entities = GetEntities(); foreach (EntityBase entity in entities) { if (!entity.IsDeleted && entity is SceneObjectGroup && ((SceneObjectGroup)entity).HasGroupChanged) @@ -2037,8 +2038,7 @@ namespace OpenSim.Region.Framework.Scenes { lock (Entities) { - ICollection entities = new List(Entities); - + EntityBase[] entities = Entities.GetEntities(); foreach (EntityBase e in entities) { if (e is SceneObjectGroup) @@ -3977,9 +3977,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void ForceClientUpdate() { - List EntityList = GetEntities(); - - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { @@ -3997,9 +3996,8 @@ namespace OpenSim.Region.Framework.Scenes { m_log.Debug("Searching for Primitive: '" + cmdparams[2] + "'"); - List EntityList = GetEntities(); - - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { @@ -4368,7 +4366,7 @@ namespace OpenSim.Region.Framework.Scenes /// will not affect the original list of objects in the scene. ///
/// - public List GetEntities() + public EntityBase[] GetEntities() { return m_sceneGraph.GetEntities(); } @@ -4402,9 +4400,8 @@ namespace OpenSim.Region.Framework.Scenes public void CleanTempObjects() { - List objs = GetEntities(); - - foreach (EntityBase obj in objs) + EntityBase[] entities = GetEntities(); + foreach (EntityBase obj in entities) { if (obj is SceneObjectGroup) { diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index dfb26b9c15..3d3e822eee 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -348,68 +348,57 @@ namespace OpenSim.Region.Framework.Scenes if (sceneObject == null || sceneObject.RootPart == null || sceneObject.RootPart.UUID == UUID.Zero) return false; - lock (sceneObject) - { - if (Entities.ContainsKey(sceneObject.UUID)) + if (Entities.ContainsKey(sceneObject.UUID)) + return false; + + // Clamp child prim sizes and add child prims to the m_numPrim count + lock (sceneObject.Children) + { + if (m_parentScene.m_clampPrimSize) { -// m_log.WarnFormat( -// "[SCENE GRAPH]: Scene object {0} {1} was already in region {2} on add request", -// sceneObject.Name, sceneObject.UUID, m_parentScene.RegionInfo.RegionName); - return false; - } - -// m_log.DebugFormat( -// "[SCENE GRAPH]: Adding object {0} {1} to region {2}", -// sceneObject.Name, sceneObject.UUID, m_parentScene.RegionInfo.RegionName); - - lock (sceneObject.Children) - { - if (m_parentScene.m_clampPrimSize) + foreach (SceneObjectPart part in sceneObject.Children.Values) { - foreach (SceneObjectPart part in sceneObject.Children.Values) - { - Vector3 scale = part.Shape.Scale; - - if (scale.X > m_parentScene.m_maxNonphys) - scale.X = m_parentScene.m_maxNonphys; - if (scale.Y > m_parentScene.m_maxNonphys) - scale.Y = m_parentScene.m_maxNonphys; - if (scale.Z > m_parentScene.m_maxNonphys) - scale.Z = m_parentScene.m_maxNonphys; - - part.Shape.Scale = scale; - } + Vector3 scale = part.Shape.Scale; + + if (scale.X > m_parentScene.m_maxNonphys) + scale.X = m_parentScene.m_maxNonphys; + if (scale.Y > m_parentScene.m_maxNonphys) + scale.Y = m_parentScene.m_maxNonphys; + if (scale.Z > m_parentScene.m_maxNonphys) + scale.Z = m_parentScene.m_maxNonphys; + + part.Shape.Scale = scale; } - - m_numPrim += sceneObject.Children.Count; } - - sceneObject.AttachToScene(m_parentScene); - if (sendClientUpdates) - sceneObject.ScheduleGroupForFullUpdate(); - - Entities.Add(sceneObject); + m_numPrim += sceneObject.Children.Count; + } - if (attachToBackup) - sceneObject.AttachToBackup(); + sceneObject.AttachToScene(m_parentScene); - if (OnObjectCreate != null) - OnObjectCreate(sceneObject); - - lock (SceneObjectGroupsByFullID) - { - SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject; - foreach (SceneObjectPart part in sceneObject.Children.Values) - SceneObjectGroupsByFullID[part.UUID] = sceneObject; - } - - lock (SceneObjectGroupsByLocalID) - { - SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject; - foreach (SceneObjectPart part in sceneObject.Children.Values) - SceneObjectGroupsByLocalID[part.LocalId] = sceneObject; - } + if (sendClientUpdates) + sceneObject.ScheduleGroupForFullUpdate(); + + Entities.Add(sceneObject); + + if (attachToBackup) + sceneObject.AttachToBackup(); + + if (OnObjectCreate != null) + OnObjectCreate(sceneObject); + + lock (SceneObjectGroupsByFullID) + { + SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject; + foreach (SceneObjectPart part in sceneObject.Children.Values) + SceneObjectGroupsByFullID[part.UUID] = sceneObject; + } + + lock (SceneObjectGroupsByLocalID) + { + SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject; + foreach (SceneObjectPart part in sceneObject.Children.Values) + SceneObjectGroupsByLocalID[part.LocalId] = sceneObject; } return true; @@ -421,42 +410,38 @@ namespace OpenSim.Region.Framework.Scenes /// true if the object was deleted, false if there was no object to delete public bool DeleteSceneObject(UUID uuid, bool resultOfObjectLinked) { - if (Entities.ContainsKey(uuid)) + EntityBase entity; + if (!Entities.TryGetValue(uuid, out entity) && entity is SceneObjectGroup) + return false; + + SceneObjectGroup grp = (SceneObjectGroup)entity; + + if (!resultOfObjectLinked) { - SceneObjectGroup grp = (SceneObjectGroup)Entities[uuid]; + m_numPrim -= grp.PrimCount; - if (!resultOfObjectLinked) - { - m_numPrim -= grp.PrimCount; - - if ((grp.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics) - RemovePhysicalPrim(grp.PrimCount); - } - - if (OnObjectRemove != null) - OnObjectRemove(Entities[uuid]); - - lock (SceneObjectGroupsByFullID) - { - foreach (SceneObjectPart part in grp.Children.Values) - SceneObjectGroupsByFullID.Remove(part.UUID); - SceneObjectGroupsByFullID.Remove(grp.RootPart.UUID); - } - lock (SceneObjectGroupsByLocalID) - { - foreach (SceneObjectPart part in grp.Children.Values) - SceneObjectGroupsByLocalID.Remove(part.LocalId); - SceneObjectGroupsByLocalID.Remove(grp.RootPart.LocalId); - } - - Entities.Remove(uuid); - //SceneObjectGroup part; - //((part.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics) - - return true; + if ((grp.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics) + RemovePhysicalPrim(grp.PrimCount); } - return false; + if (OnObjectRemove != null) + OnObjectRemove(Entities[uuid]); + + lock (SceneObjectGroupsByFullID) + { + foreach (SceneObjectPart part in grp.Children.Values) + SceneObjectGroupsByFullID.Remove(part.UUID); + SceneObjectGroupsByFullID.Remove(grp.RootPart.UUID); + } + + lock (SceneObjectGroupsByLocalID) + { + foreach (SceneObjectPart part in grp.Children.Values) + SceneObjectGroupsByLocalID.Remove(part.LocalId); + SceneObjectGroupsByLocalID.Remove(grp.RootPart.LocalId); + } + + return Entities.Remove(uuid); } /// @@ -468,9 +453,7 @@ namespace OpenSim.Region.Framework.Scenes protected internal void AddToUpdateList(SceneObjectGroup obj) { lock (m_updateList) - { m_updateList[obj.UUID] = obj; - } } /// @@ -480,34 +463,39 @@ namespace OpenSim.Region.Framework.Scenes { if (!Monitor.TryEnter(m_updateLock)) return; - - List updates; - - // Some updates add more updates to the updateList. - // Get the current list of updates and clear the list before iterating - lock (m_updateList) + try { - updates = new List(m_updateList.Values); - m_updateList.Clear(); - } + List updates; - // Go through all updates - for (int i = 0; i < updates.Count; i++) - { - SceneObjectGroup sog = updates[i]; - - // Don't abort the whole update if one entity happens to give us an exception. - try + // Some updates add more updates to the updateList. + // Get the current list of updates and clear the list before iterating + lock (m_updateList) { - sog.Update(); + updates = new List(m_updateList.Values); + m_updateList.Clear(); } - catch (Exception e) + + // Go through all updates + for (int i = 0; i < updates.Count; i++) { - m_log.ErrorFormat( - "[INNER SCENE]: Failed to update {0}, {1} - {2}", sog.Name, sog.UUID, e); + SceneObjectGroup sog = updates[i]; + + // Don't abort the whole update if one entity happens to give us an exception. + try + { + sog.Update(); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[INNER SCENE]: Failed to update {0}, {1} - {2}", sog.Name, sog.UUID, e); + } } } - Monitor.Exit(m_updateLock); + finally + { + Monitor.Exit(m_updateLock); + } } protected internal void AddPhysicalPrim(int number) @@ -864,8 +852,9 @@ namespace OpenSim.Region.Framework.Scenes /// null if no scene object group containing that prim is found public SceneObjectGroup GetGroupByPrim(uint localID) { - if (Entities.ContainsKey(localID)) - return Entities[localID] as SceneObjectGroup; + EntityBase entity; + if (Entities.TryGetValue(localID, out entity)) + return entity as SceneObjectGroup; //m_log.DebugFormat("Entered GetGroupByPrim with localID {0}", localID); SceneObjectGroup sog; @@ -879,23 +868,22 @@ namespace OpenSim.Region.Framework.Scenes } } - List EntityList = GetEntities(); - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { //m_log.DebugFormat("Looking at entity {0}", ent.UUID); if (ent is SceneObjectGroup) { - if (((SceneObjectGroup)ent).HasChildPrim(localID)) + sog = (SceneObjectGroup)ent; + if (sog.HasChildPrim(localID)) { - sog = (SceneObjectGroup)ent; lock (SceneObjectGroupsByLocalID) - { SceneObjectGroupsByLocalID[localID] = sog; - } return sog; } } } + return null; } @@ -921,23 +909,21 @@ namespace OpenSim.Region.Framework.Scenes } } - List EntityList = GetEntities(); - - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { - if (((SceneObjectGroup)ent).HasChildPrim(fullID)) + sog = (SceneObjectGroup)ent; + if (sog.HasChildPrim(fullID)) { - sog = (SceneObjectGroup)ent; lock (SceneObjectGroupsByFullID) - { SceneObjectGroupsByFullID[fullID] = sog; - } return sog; } } } + return null; } @@ -946,7 +932,7 @@ namespace OpenSim.Region.Framework.Scenes // Primitive Ray Tracing float closestDistance = 280f; EntityIntersection result = new EntityIntersection(); - List EntityList = GetEntities(); + EntityBase[] EntityList = GetEntities(); foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) @@ -984,23 +970,28 @@ namespace OpenSim.Region.Framework.Scenes /// null if the part was not found protected internal SceneObjectPart GetSceneObjectPart(string name) { - List EntityList = GetEntities(); + SceneObjectPart sop = null; - // FIXME: use a dictionary here - foreach (EntityBase ent in EntityList) - { - if (ent is SceneObjectGroup) + Entities.Find( + delegate(EntityBase entity) { - foreach (SceneObjectPart p in ((SceneObjectGroup) ent).GetParts()) + if (entity is SceneObjectGroup) { - if (p.Name == name) + foreach (SceneObjectPart p in ((SceneObjectGroup)entity).GetParts()) { - return p; + if (p.Name == name) + { + sop = p; + return true; + } } } + + return false; } - } - return null; + ); + + return sop; } /// @@ -1021,7 +1012,7 @@ namespace OpenSim.Region.Framework.Scenes /// it /// /// - protected internal List GetEntities() + protected internal EntityBase[] GetEntities() { return Entities.GetEntities(); } @@ -1030,7 +1021,7 @@ namespace OpenSim.Region.Framework.Scenes { Dictionary topScripts = new Dictionary(); - List EntityList = GetEntities(); + EntityBase[] EntityList = GetEntities(); int limit = 0; foreach (EntityBase ent in EntityList) { @@ -1726,8 +1717,8 @@ namespace OpenSim.Region.Framework.Scenes UUID objid = UUID.Zero; SceneObjectPart obj = null; - List EntityList = GetEntities(); - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs index f478a4a770..7aa5a93e8b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs +++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs @@ -75,7 +75,8 @@ namespace OpenSim.Region.Framework.Scenes lock(m_pendingObjects) { - foreach (EntityBase e in m_presence.Scene.Entities) + EntityBase[] entities = m_presence.Scene.Entities.GetEntities(); + foreach (EntityBase e in entities) { if (e != null && e is SceneObjectGroup) m_pendingObjects.Enqueue((SceneObjectGroup)e); diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs index b6677f092e..5494549a3e 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs @@ -84,9 +84,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization int primCount = 0; stream.WriteLine("\n"); - List EntityList = scene.GetEntities(); - - foreach (EntityBase ent in EntityList) + EntityBase[] entityList = scene.GetEntities(); + foreach (EntityBase ent in entityList) { if (ent is SceneObjectGroup) { @@ -204,16 +203,14 @@ namespace OpenSim.Region.Framework.Scenes.Serialization public static void SavePrimsToXml2(Scene scene, string fileName) { - List EntityList = scene.GetEntities(); - - SavePrimListToXml2(EntityList, fileName); + EntityBase[] entityList = scene.GetEntities(); + SavePrimListToXml2(entityList, fileName); } public static void SavePrimsToXml2(Scene scene, TextWriter stream, Vector3 min, Vector3 max) { - List EntityList = scene.GetEntities(); - - SavePrimListToXml2(EntityList, stream, min, max); + EntityBase[] entityList = scene.GetEntities(); + SavePrimListToXml2(entityList, stream, min, max); } public static void SaveNamedPrimsToXml2(Scene scene, string primName, string fileName) @@ -222,7 +219,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization "[SERIALISER]: Saving prims with name {0} in xml2 format for region {1} to {2}", primName, scene.RegionInfo.RegionName, fileName); - List entityList = scene.GetEntities(); + EntityBase[] entityList = scene.GetEntities(); List primList = new List(); foreach (EntityBase ent in entityList) @@ -236,10 +233,10 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } } - SavePrimListToXml2(primList, fileName); + SavePrimListToXml2(primList.ToArray(), fileName); } - public static void SavePrimListToXml2(List entityList, string fileName) + public static void SavePrimListToXml2(EntityBase[] entityList, string fileName) { FileStream file = new FileStream(fileName, FileMode.Create); try @@ -260,7 +257,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization } } - public static void SavePrimListToXml2(List entityList, TextWriter stream, Vector3 min, Vector3 max) + public static void SavePrimListToXml2(EntityBase[] entityList, TextWriter stream, Vector3 min, Vector3 max) { int primCount = 0; stream.WriteLine("\n"); diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 6793ef63f3..159af79ace 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -375,8 +375,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server private void IRC_SendNamesReply() { - List users = m_scene.Entities.GetAllByType(); - + EntityBase[] users = m_scene.Entities.GetAllByType(); foreach (EntityBase user in users) { SendServerCommand("353 " + m_nick + " = " + IrcRegionName + " :" + user.Name.Replace(" ", "")); @@ -386,8 +385,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server private void IRC_SendWhoReply() { - List users = m_scene.Entities.GetAllByType(); - + EntityBase[] users = m_scene.Entities.GetAllByType(); foreach (EntityBase user in users) { /*SendServerCommand(String.Format("352 {0} {1} {2} {3} {4} {5} :0 {6}", IrcRegionName, @@ -415,11 +413,11 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server private void IRC_SendReplyUsers() { - List users = m_scene.Entities.GetAllByType(); + EntityBase[] users = m_scene.Entities.GetAllByType(); SendServerCommand("392 :UserID Terminal Host"); - if (users.Count == 0) + if (users.Length == 0) { SendServerCommand("395 :Nobody logged in"); return; diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs index de1e01c89d..d21b6527f6 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMEntityCollection.cs @@ -111,7 +111,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement } // Check if there are SceneObjectGroups in the list that do not have corresponding ContentManagementGroups in the CMEntityHash - public System.Collections.ArrayList CheckForMissingEntities(System.Collections.Generic.List currList) + public System.Collections.ArrayList CheckForMissingEntities(EntityBase[] currList) { System.Collections.ArrayList missingList = new System.Collections.ArrayList(); SceneObjectGroup temp = null; diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs index 2730eee2e5..49d20e10f8 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs @@ -127,7 +127,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement /// public void FindDifferences() { - System.Collections.Generic.List sceneEntityList = m_Entity.Scene.GetEntities(); + List sceneEntityList = new List(m_Entity.Scene.GetEntities()); DiffersFromSceneGroup = false; // if group is not contained in scene's list if (!ContainsKey(sceneEntityList, m_UnchangedEntity.UUID)) diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs index 6ba5ccfdc9..140264b5e7 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/ObjectAccessor.cs @@ -41,12 +41,14 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule private readonly Scene m_scene; private readonly IEnumerator m_sogEnum; private readonly ISecurityCredential m_security; + private readonly List m_entities; public IObjEnum(Scene scene, ISecurityCredential security) { m_scene = scene; m_security = security; - m_sogEnum = m_scene.Entities.GetAllByType().GetEnumerator(); + m_entities = new List(m_scene.Entities.GetEntities()); + m_sogEnum = m_entities.GetEnumerator(); } public void Dispose() diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs index 45bb005903..f2324d29a8 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs @@ -205,10 +205,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { get { - List ents = m_internalScene.Entities.GetAllByType(); - IAvatar[] rets = new IAvatar[ents.Count]; + EntityBase[] ents = m_internalScene.Entities.GetAllByType(); + IAvatar[] rets = new IAvatar[ents.Length]; - for (int i = 0; i < ents.Count; i++) + for (int i = 0; i < ents.Length; i++) { EntityBase ent = ents[i]; rets[i] = new SPAvatar(m_internalScene, ent.UUID, m_security); diff --git a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs index 3ed338baea..421da3664a 100644 --- a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs +++ b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs @@ -568,8 +568,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator { m_copse = new List(); - List objs = m_scene.GetEntities(); - + EntityBase[] objs = m_scene.GetEntities(); foreach (EntityBase obj in objs) { if (obj is SceneObjectGroup) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 5c2abd5e9d..2b67e841b2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -286,7 +286,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins } else { - Entities = m_CmdManager.m_ScriptEngine.World.GetEntities(); + Entities = new List(m_CmdManager.m_ScriptEngine.World.GetEntities()); } SceneObjectPart SensePoint = ts.host; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs index 67b73f39de..67a06f3f83 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianActivityDetector.cs @@ -69,7 +69,10 @@ namespace OpenSim.Services.Connectors.SimianGrid public void OnMakeRootAgent(ScenePresence sp) { m_log.DebugFormat("[SIMIAN ACTIVITY DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); - m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + Util.FireAndForget(delegate(object o) + { + m_GridUserService.SetLastPosition(sp.UUID.ToString(), sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); + }); } public void OnNewClient(IClientAPI client) From b597a295c489cef217b9dca6bd22df1340ca39ce Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Fri, 10 Sep 2010 12:41:36 -0700 Subject: [PATCH 18/35] Second pass at cleaning up thread safety in EntityManager and SceneGraph --- .../Region/Framework/Scenes/EntityManager.cs | 16 +---- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 66 +++++++++---------- .../Framework/Scenes/SceneObjectGroup.cs | 11 +--- 3 files changed, 35 insertions(+), 58 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/EntityManager.cs b/OpenSim/Region/Framework/Scenes/EntityManager.cs index 85d0a4f9ec..0defa93c6a 100644 --- a/OpenSim/Region/Framework/Scenes/EntityManager.cs +++ b/OpenSim/Region/Framework/Scenes/EntityManager.cs @@ -34,7 +34,7 @@ using OpenMetaverse; namespace OpenSim.Region.Framework.Scenes { - public class EntityManager //: IEnumerable + public class EntityManager { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private readonly DoubleDictionary m_entities = new DoubleDictionary(); @@ -143,19 +143,5 @@ namespace OpenSim.Region.Framework.Scenes { return m_entities.TryGetValue(key, out obj); } - - /// - /// This could be optimised to work on the list 'live' rather than making a safe copy and iterating that. - /// - /// - //public IEnumerator GetEnumerator() - //{ - // return GetEntities().GetEnumerator(); - //} - - //IEnumerator IEnumerable.GetEnumerator() - //{ - // return GetEnumerator(); - //} } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 3d3e822eee..f779a6dbaa 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -72,10 +72,7 @@ namespace OpenSim.Region.Framework.Scenes protected Dictionary m_scenePresenceMap = new Dictionary(); protected List m_scenePresenceArray = new List(); - // SceneObjects is not currently populated or used. - //public Dictionary SceneObjects; protected internal EntityManager Entities = new EntityManager(); -// protected internal Dictionary Entities = new Dictionary(); protected internal Dictionary RestorePresences = new Dictionary(); protected RegionInfo m_regInfo; @@ -351,28 +348,28 @@ namespace OpenSim.Region.Framework.Scenes if (Entities.ContainsKey(sceneObject.UUID)) return false; - // Clamp child prim sizes and add child prims to the m_numPrim count + List children; lock (sceneObject.Children) + children = new List(sceneObject.Children.Values); + + // Clamp child prim sizes and add child prims to the m_numPrim count + if (m_parentScene.m_clampPrimSize) { - if (m_parentScene.m_clampPrimSize) + foreach (SceneObjectPart part in children) { - foreach (SceneObjectPart part in sceneObject.Children.Values) - { - Vector3 scale = part.Shape.Scale; + Vector3 scale = part.Shape.Scale; - if (scale.X > m_parentScene.m_maxNonphys) - scale.X = m_parentScene.m_maxNonphys; - if (scale.Y > m_parentScene.m_maxNonphys) - scale.Y = m_parentScene.m_maxNonphys; - if (scale.Z > m_parentScene.m_maxNonphys) - scale.Z = m_parentScene.m_maxNonphys; + if (scale.X > m_parentScene.m_maxNonphys) + scale.X = m_parentScene.m_maxNonphys; + if (scale.Y > m_parentScene.m_maxNonphys) + scale.Y = m_parentScene.m_maxNonphys; + if (scale.Z > m_parentScene.m_maxNonphys) + scale.Z = m_parentScene.m_maxNonphys; - part.Shape.Scale = scale; - } + part.Shape.Scale = scale; } - - m_numPrim += sceneObject.Children.Count; } + m_numPrim += children.Count; sceneObject.AttachToScene(m_parentScene); @@ -390,14 +387,14 @@ namespace OpenSim.Region.Framework.Scenes lock (SceneObjectGroupsByFullID) { SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject; - foreach (SceneObjectPart part in sceneObject.Children.Values) + foreach (SceneObjectPart part in children) SceneObjectGroupsByFullID[part.UUID] = sceneObject; } lock (SceneObjectGroupsByLocalID) { SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject; - foreach (SceneObjectPart part in sceneObject.Children.Values) + foreach (SceneObjectPart part in children) SceneObjectGroupsByLocalID[part.LocalId] = sceneObject; } @@ -859,13 +856,13 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat("Entered GetGroupByPrim with localID {0}", localID); SceneObjectGroup sog; lock (SceneObjectGroupsByLocalID) + SceneObjectGroupsByLocalID.TryGetValue(localID, out sog); + + if (sog != null) { - if (SceneObjectGroupsByLocalID.TryGetValue(localID, out sog)) - { - if (sog.HasChildPrim(localID)) - return sog; - SceneObjectGroupsByLocalID.Remove(localID); - } + if (sog.HasChildPrim(localID)) + return sog; + SceneObjectGroupsByLocalID.Remove(localID); } EntityBase[] entityList = GetEntities(); @@ -896,17 +893,18 @@ namespace OpenSim.Region.Framework.Scenes { SceneObjectGroup sog; lock (SceneObjectGroupsByFullID) + SceneObjectGroupsByFullID.TryGetValue(fullID, out sog); + + if (sog != null) { - if (SceneObjectGroupsByFullID.TryGetValue(fullID, out sog)) + lock (sog.Children) { - lock (sog.Children) - { - if (sog.Children.ContainsKey(fullID)) - return sog; - } - - SceneObjectGroupsByFullID.Remove(fullID); + if (sog.Children.ContainsKey(fullID)) + return sog; } + + lock (SceneObjectGroupsByFullID) + SceneObjectGroupsByFullID.Remove(fullID); } EntityBase[] entityList = GetEntities(); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 09e3e0eb10..ba5e33cd37 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2091,16 +2091,9 @@ namespace OpenSim.Region.Framework.Scenes /// null if a child part with the primID was not found public SceneObjectPart GetChildPart(UUID primID) { - SceneObjectPart childPart = null; - + SceneObjectPart childPart; lock (m_parts) - { - if (m_parts.ContainsKey(primID)) - { - childPart = m_parts[primID]; - } - } - + m_parts.TryGetValue(primID, out childPart); return childPart; } From a7f4e10f425cef4b85810486ba31c59b3ba206fc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 10 Sep 2010 21:50:40 +0100 Subject: [PATCH 19/35] Remove parenthesis around the release flavour to get the version string back under 27 chars Can't quite remember why this has to be <=27 chars, maybe something to do with the space available for the version string in a typical client --- OpenSim/Framework/Servers/VersionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index 100bf1fd52..c88e0d18ed 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs @@ -49,7 +49,7 @@ namespace OpenSim public static string GetVersionString(string versionNumber, Flavour flavour) { - string versionString = "OpenSim " + versionNumber + " (" + flavour + ")"; + string versionString = "OpenSim " + versionNumber + " " + flavour; return versionString.PadRight(VERSIONINFO_VERSION_LENGTH); } From 30306a775af74e1fe080590998a71a4c7e64ad12 Mon Sep 17 00:00:00 2001 From: randomhuman Date: Sun, 5 Sep 2010 21:44:46 +0100 Subject: [PATCH 20/35] Made it impossible to create a user with names containing spaces and prevented passwords from being echoed after enter is pressed. --- OpenSim/Framework/Console/ConsoleBase.cs | 51 +++++++++++++++++++ OpenSim/Framework/Console/LocalConsole.cs | 5 +- OpenSim/Region/Framework/Scenes/Scene.cs | 5 +- .../UserAccountService/UserAccountService.cs | 6 ++- 4 files changed, 61 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/Console/ConsoleBase.cs b/OpenSim/Framework/Console/ConsoleBase.cs index aab920b09a..22ce88060c 100755 --- a/OpenSim/Framework/Console/ConsoleBase.cs +++ b/OpenSim/Framework/Console/ConsoleBase.cs @@ -89,6 +89,57 @@ namespace OpenSim.Framework.Console return ret; } + + public string CmdPrompt(string p, List excludedCharacters) + { + bool itisdone = false; + string ret = String.Empty; + while (!itisdone) + { + itisdone = true; + ret = CmdPrompt(p); + + foreach (char c in excludedCharacters) + { + if (ret.Contains(c.ToString())) + { + System.Console.WriteLine("The character \"" + c.ToString() + "\" is not permitted."); + itisdone = false; + } + } + } + + return ret; + } + + public string CmdPrompt(string p, string def, List excludedCharacters) + { + bool itisdone = false; + string ret = String.Empty; + while (!itisdone) + { + itisdone = true; + ret = CmdPrompt(p, def); + + if (ret == String.Empty) + { + ret = def; + } + else + { + foreach (char c in excludedCharacters) + { + if (ret.Contains(c.ToString())) + { + System.Console.WriteLine("The character \"" + c.ToString() + "\" is not permitted."); + itisdone = false; + } + } + } + } + + return ret; + } // Displays a command prompt and returns a default value, user may only enter 1 of 2 options public string CmdPrompt(string prompt, string defaultresponse, List options) diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index a3036d0df6..c968031c11 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs @@ -461,7 +461,8 @@ namespace OpenSim.Framework.Console SetCursorLeft(0); y = SetCursorTop(y); - System.Console.WriteLine("{0}{1}", prompt, cmdline); + System.Console.WriteLine(); + //Show(); lock (cmdline) { @@ -486,7 +487,7 @@ namespace OpenSim.Framework.Console } } - AddToHistory(cmdline.ToString()); + //AddToHistory(cmdline.ToString()); return cmdline.ToString(); default: break; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 7ce95a7299..6fa78e0cfd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1159,8 +1159,9 @@ namespace OpenSim.Region.Framework.Scenes while (m_regInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null) { MainConsole.Instance.Output("The current estate has no owner set."); - string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test"); - string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User"); + List excluded = new List(new char[1]{' '}); + string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); + string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); UserAccount account = UserAccountService.GetUserAccount(m_regInfo.ScopeID, first, last); diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 326e502017..65c247f334 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -296,13 +296,15 @@ namespace OpenSim.Services.UserAccountService string lastName; string password; string email; + + List excluded = new List(new char[]{' '}); if (cmdparams.Length < 3) - firstName = MainConsole.Instance.CmdPrompt("First name", "Default"); + firstName = MainConsole.Instance.CmdPrompt("First name", "Default", excluded); else firstName = cmdparams[2]; if (cmdparams.Length < 4) - lastName = MainConsole.Instance.CmdPrompt("Last name", "User"); + lastName = MainConsole.Instance.CmdPrompt("Last name", "User", excluded); else lastName = cmdparams[3]; if (cmdparams.Length < 5) From 220f82a0f0e05ab7d01c9028675c5c779cb6f5fc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 11 Sep 2010 00:27:52 +0100 Subject: [PATCH 21/35] Make it clear that the "create region" command will reference ini files in the regions directory (usually Regions/) Also convert some tabs into spaces. --- OpenSim/Region/Application/OpenSim.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 3c2575df55..4f2d223bbc 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -316,7 +316,7 @@ namespace OpenSim m_console.Commands.AddCommand("region", false, "create region", "create region [\"region name\"] ", "Create a new region.", - "The settings for \"region name\" are read from ." + "The settings for \"region name\" are read from in your Regions directory." + " If \"region name\" does not exist in , it will be added." + Environment.NewLine + "Without \"region name\", the first region found in will be created." + Environment.NewLine + "If does not exist, it will be created.", @@ -552,17 +552,18 @@ namespace OpenSim regionFile = Path.Combine(regionsDir, regionFile); } - RegionInfo regInfo; + RegionInfo regInfo; if (isXml) { - regInfo = new RegionInfo(regionName, regionFile, false, ConfigSource.Source); + regInfo = new RegionInfo(regionName, regionFile, false, ConfigSource.Source); } else { - regInfo = new RegionInfo(regionName, regionFile, false, ConfigSource.Source, regionName); + regInfo = new RegionInfo(regionName, regionFile, false, ConfigSource.Source, regionName); } + IScene scene; - PopulateRegionEstateInfo(regInfo); + PopulateRegionEstateInfo(regInfo); CreateRegion(regInfo, true, out scene); regInfo.EstateSettings.Save(); } From 7e65590a55ba575d0086bdfc25addaf1051d799b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 11 Sep 2010 01:13:08 +0100 Subject: [PATCH 22/35] Update Prebuild.exe with Prebuild r323 + an existing OpenSim specific nant hack to correctly clean up chosen OpenSim exes and dlls in bin/ on a "nant clean" Source code is included for reference. This can go away again once Prebuild is updated with a more general mechanism for cleaning up files. The Prebuild source code here can be built with nant, or regnerated for other tools using the prebuild at {root}/bin/Prebuild.exe --- Prebuild/AUTHORS | 10 + Prebuild/COPYING | 65 + Prebuild/ChangeLog | 461 +++++++ Prebuild/INSTALL | 236 ++++ Prebuild/NEWS | 200 +++ Prebuild/README | 274 +++++ Prebuild/THANKS | 18 + Prebuild/TODO | 43 + Prebuild/clean.bat | 1 + Prebuild/clean.sh | 1 + Prebuild/doc/.svn/all-wcprops | 35 + Prebuild/doc/.svn/dir-prop-base | 5 + Prebuild/doc/.svn/entries | 198 +++ .../prop-base/prebuild-example1.xml.svn-base | 9 + .../prop-base/prebuild-example2.xml.svn-base | 9 + .../prop-base/prebuild-example3.xml.svn-base | 9 + .../prop-base/prebuild-example4.xml.svn-base | 9 + .../text-base/prebuild-example1.xml.svn-base | 300 +++++ .../text-base/prebuild-example2.xml.svn-base | 72 ++ .../text-base/prebuild-example3.xml.svn-base | 113 ++ .../text-base/prebuild-example4.xml.svn-base | 715 +++++++++++ .../text-base/prebuild-example5.xml.svn-base | 187 +++ Prebuild/doc/prebuild-example1.xml | 300 +++++ Prebuild/doc/prebuild-example2.xml | 72 ++ Prebuild/doc/prebuild-example3.xml | 113 ++ Prebuild/doc/prebuild-example4.xml | 715 +++++++++++ Prebuild/doc/prebuild-example5.xml | 187 +++ Prebuild/prebuild | 2 + Prebuild/prebuild.xml | 73 ++ Prebuild/scripts/.svn/all-wcprops | 125 ++ Prebuild/scripts/.svn/dir-prop-base | 6 + Prebuild/scripts/.svn/entries | 708 +++++++++++ .../scripts/.svn/prop-base/Clean.bat.svn-base | 13 + .../scripts/.svn/prop-base/Clean.sh.svn-base | 9 + .../scripts/.svn/prop-base/Help.bat.svn-base | 13 + .../.svn/prop-base/MonoDevelop.sh.svn-base | 13 + .../.svn/prop-base/Prebuild.nsi.svn-base | 9 + .../.svn/prop-base/SharpDevelop.bat.svn-base | 13 + .../.svn/prop-base/SharpDevelop2.bat.svn-base | 5 + .../.svn/prop-base/VS2002.bat.svn-base | 13 + .../.svn/prop-base/VS2003.bat.svn-base | 13 + .../.svn/prop-base/VS2005.bat.svn-base | 13 + .../.svn/prop-base/VS2008.bat.svn-base | 5 + .../.svn/prop-base/autotools.bat.svn-base | 5 + .../.svn/prop-base/autotools.sh.svn-base | 5 + .../.svn/prop-base/makefile.bat.svn-base | 9 + .../.svn/prop-base/makefile.sh.svn-base | 9 + .../scripts/.svn/prop-base/nant.bat.svn-base | 13 + .../scripts/.svn/prop-base/nant.sh.svn-base | 13 + .../scripts/.svn/prop-base/xcode.bat.svn-base | 9 + .../scripts/.svn/prop-base/xcode.sh.svn-base | 9 + .../scripts/.svn/text-base/Clean.bat.svn-base | 2 + .../scripts/.svn/text-base/Clean.sh.svn-base | 4 + .../scripts/.svn/text-base/Help.bat.svn-base | 2 + .../.svn/text-base/MonoDevelop.sh.svn-base | 2 + .../.svn/text-base/Prebuild.nsi.svn-base | 231 ++++ .../.svn/text-base/SharpDevelop.bat.svn-base | 4 + .../.svn/text-base/SharpDevelop2.bat.svn-base | 4 + .../.svn/text-base/VS2002.bat.svn-base | 4 + .../.svn/text-base/VS2003.bat.svn-base | 4 + .../.svn/text-base/VS2005.bat.svn-base | 4 + .../.svn/text-base/VS2008.bat.svn-base | 4 + .../.svn/text-base/VS2010.bat.svn-base | 4 + .../.svn/text-base/autotools.bat.svn-base | 4 + .../.svn/text-base/autotools.sh.svn-base | 5 + .../.svn/text-base/makefile.bat.svn-base | 4 + .../.svn/text-base/makefile.sh.svn-base | 10 + .../scripts/.svn/text-base/nant.bat.svn-base | 4 + .../scripts/.svn/text-base/nant.sh.svn-base | 2 + .../scripts/.svn/text-base/xcode.bat.svn-base | 4 + .../scripts/.svn/text-base/xcode.sh.svn-base | 2 + Prebuild/scripts/Clean.bat | 2 + Prebuild/scripts/Clean.sh | 4 + Prebuild/scripts/Help.bat | 2 + Prebuild/scripts/MonoDevelop.sh | 2 + Prebuild/scripts/Prebuild.nsi | 231 ++++ Prebuild/scripts/SharpDevelop.bat | 4 + Prebuild/scripts/SharpDevelop2.bat | 4 + Prebuild/scripts/VS2002.bat | 4 + Prebuild/scripts/VS2003.bat | 4 + Prebuild/scripts/VS2005.bat | 4 + Prebuild/scripts/VS2008.bat | 4 + Prebuild/scripts/VS2010.bat | 4 + Prebuild/scripts/autotools.bat | 4 + Prebuild/scripts/autotools.sh | 5 + Prebuild/scripts/makefile.bat | 4 + Prebuild/scripts/makefile.sh | 10 + Prebuild/scripts/nant.bat | 4 + Prebuild/scripts/nant.sh | 2 + Prebuild/scripts/xcode.bat | 4 + Prebuild/scripts/xcode.sh | 2 + Prebuild/src/.svn/all-wcprops | 23 + Prebuild/src/.svn/dir-prop-base | 16 + Prebuild/src/.svn/entries | 139 +++ Prebuild/src/.svn/prop-base/App.ico.svn-base | 5 + .../src/.svn/prop-base/Prebuild.cs.svn-base | 9 + .../src/.svn/prop-base/Prebuild.snk.svn-base | 5 + Prebuild/src/.svn/text-base/App.ico.svn-base | Bin 0 -> 4286 bytes .../src/.svn/text-base/Prebuild.cs.svn-base | 165 +++ .../src/.svn/text-base/Prebuild.snk.svn-base | Bin 0 -> 596 bytes Prebuild/src/App.ico | Bin 0 -> 4286 bytes Prebuild/src/Core/.svn/all-wcprops | 29 + Prebuild/src/Core/.svn/dir-prop-base | 5 + Prebuild/src/Core/.svn/entries | 182 +++ .../.svn/prop-base/FatalException.cs.svn-base | 9 + .../Core/.svn/prop-base/Kernel.cs.svn-base | 9 + .../UnknownLanguageException.cs.svn-base | 9 + .../prop-base/WarningException.cs.svn-base | 9 + .../.svn/text-base/FatalException.cs.svn-base | 85 ++ .../Core/.svn/text-base/Kernel.cs.svn-base | 832 +++++++++++++ .../UnknownLanguageException.cs.svn-base | 63 + .../text-base/WarningException.cs.svn-base | 84 ++ Prebuild/src/Core/Attributes/.svn/all-wcprops | 23 + .../src/Core/Attributes/.svn/dir-prop-base | 5 + Prebuild/src/Core/Attributes/.svn/entries | 130 ++ .../prop-base/DataNodeAttribute.cs.svn-base | 9 + .../prop-base/OptionNodeAttribute.cs.svn-base | 9 + .../prop-base/TargetAttribute.cs.svn-base | 9 + .../text-base/DataNodeAttribute.cs.svn-base | 72 ++ .../text-base/OptionNodeAttribute.cs.svn-base | 71 ++ .../text-base/TargetAttribute.cs.svn-base | 71 ++ .../src/Core/Attributes/DataNodeAttribute.cs | 72 ++ .../Core/Attributes/OptionNodeAttribute.cs | 71 ++ .../src/Core/Attributes/TargetAttribute.cs | 71 ++ Prebuild/src/Core/FatalException.cs | 85 ++ Prebuild/src/Core/Interfaces/.svn/all-wcprops | 17 + .../src/Core/Interfaces/.svn/dir-prop-base | 5 + Prebuild/src/Core/Interfaces/.svn/entries | 96 ++ .../.svn/prop-base/IDataNode.cs.svn-base | 9 + .../.svn/prop-base/ITarget.cs.svn-base | 9 + .../.svn/text-base/IDataNode.cs.svn-base | 47 + .../.svn/text-base/ITarget.cs.svn-base | 51 + Prebuild/src/Core/Interfaces/IDataNode.cs | 47 + Prebuild/src/Core/Interfaces/ITarget.cs | 51 + Prebuild/src/Core/Kernel.cs | 832 +++++++++++++ Prebuild/src/Core/Nodes/.svn/all-wcprops | 119 ++ Prebuild/src/Core/Nodes/.svn/dir-prop-base | 5 + Prebuild/src/Core/Nodes/.svn/entries | 674 +++++++++++ .../prop-base/ConfigurationNode.cs.svn-base | 9 + .../Nodes/.svn/prop-base/DataNode.cs.svn-base | 9 + .../.svn/prop-base/ExcludeNode.cs.svn-base | 9 + .../Nodes/.svn/prop-base/FileNode.cs.svn-base | 9 + .../.svn/prop-base/FilesNode.cs.svn-base | 9 + .../.svn/prop-base/MatchNode.cs.svn-base | 9 + .../.svn/prop-base/OptionsNode.cs.svn-base | 9 + .../.svn/prop-base/ProcessNode.cs.svn-base | 9 + .../.svn/prop-base/ProjectNode.cs.svn-base | 9 + .../.svn/prop-base/ReferenceNode.cs.svn-base | 9 + .../prop-base/ReferencePathNode.cs.svn-base | 9 + .../.svn/prop-base/SolutionNode.cs.svn-base | 9 + .../.svn/text-base/AuthorNode.cs.svn-base | 87 ++ .../.svn/text-base/CleanFilesNode.cs.svn-base | 80 ++ .../.svn/text-base/CleanupNode.cs.svn-base | 85 ++ .../text-base/ConfigurationNode.cs.svn-base | 225 ++++ .../ConfigurationNodeCollection.cs.svn-base | 71 ++ .../Nodes/.svn/text-base/DataNode.cs.svn-base | 117 ++ .../text-base/DatabaseProjectNode.cs.svn-base | 93 ++ .../DatabaseReferenceNode.cs.svn-base | 63 + .../text-base/DescriptionNode.cs.svn-base | 87 ++ .../.svn/text-base/ExcludeNode.cs.svn-base | 89 ++ .../Nodes/.svn/text-base/FileNode.cs.svn-base | 285 +++++ .../.svn/text-base/FilesNode.cs.svn-base | 204 ++++ .../.svn/text-base/MatchNode.cs.svn-base | 367 ++++++ .../.svn/text-base/OptionsNode.cs.svn-base | 634 ++++++++++ .../.svn/text-base/ProcessNode.cs.svn-base | 108 ++ .../.svn/text-base/ProjectNode.cs.svn-base | 579 +++++++++ .../.svn/text-base/ReferenceNode.cs.svn-base | 144 +++ .../text-base/ReferencePathNode.cs.svn-base | 97 ++ .../.svn/text-base/SolutionNode.cs.svn-base | 382 ++++++ Prebuild/src/Core/Nodes/AuthorNode.cs | 87 ++ Prebuild/src/Core/Nodes/CleanFilesNode.cs | 80 ++ Prebuild/src/Core/Nodes/CleanupNode.cs | 85 ++ Prebuild/src/Core/Nodes/ConfigurationNode.cs | 225 ++++ .../Core/Nodes/ConfigurationNodeCollection.cs | 71 ++ Prebuild/src/Core/Nodes/DataNode.cs | 117 ++ .../src/Core/Nodes/DatabaseProjectNode.cs | 93 ++ .../src/Core/Nodes/DatabaseReferenceNode.cs | 63 + Prebuild/src/Core/Nodes/DescriptionNode.cs | 87 ++ Prebuild/src/Core/Nodes/ExcludeNode.cs | 89 ++ Prebuild/src/Core/Nodes/FileNode.cs | 285 +++++ Prebuild/src/Core/Nodes/FilesNode.cs | 204 ++++ Prebuild/src/Core/Nodes/MatchNode.cs | 367 ++++++ Prebuild/src/Core/Nodes/OptionsNode.cs | 634 ++++++++++ Prebuild/src/Core/Nodes/ProcessNode.cs | 108 ++ Prebuild/src/Core/Nodes/ProjectNode.cs | 579 +++++++++ Prebuild/src/Core/Nodes/ReferenceNode.cs | 144 +++ Prebuild/src/Core/Nodes/ReferencePathNode.cs | 97 ++ Prebuild/src/Core/Nodes/SolutionNode.cs | 382 ++++++ Prebuild/src/Core/Parse/.svn/all-wcprops | 17 + Prebuild/src/Core/Parse/.svn/dir-prop-base | 5 + Prebuild/src/Core/Parse/.svn/entries | 96 ++ .../.svn/prop-base/IfContext.cs.svn-base | 9 + .../.svn/prop-base/Preprocessor.cs.svn-base | 9 + .../.svn/text-base/IfContext.cs.svn-base | 154 +++ .../.svn/text-base/Preprocessor.cs.svn-base | 652 ++++++++++ Prebuild/src/Core/Parse/IfContext.cs | 154 +++ Prebuild/src/Core/Parse/Preprocessor.cs | 652 ++++++++++ Prebuild/src/Core/Targets/.NAntTarget.cs.swp | Bin 0 -> 49152 bytes Prebuild/src/Core/Targets/.svn/all-wcprops | 101 ++ Prebuild/src/Core/Targets/.svn/dir-prop-base | 5 + Prebuild/src/Core/Targets/.svn/entries | 572 +++++++++ .../.svn/prop-base/DebugTarget.cs.svn-base | 9 + .../.svn/prop-base/MakefileTarget.cs.svn-base | 9 + .../prop-base/MonoDevelopTarget.cs.svn-base | 9 + .../.svn/prop-base/NAntTarget.cs.svn-base | 9 + .../prop-base/SharpDevelopTarget.cs.svn-base | 9 + .../.svn/prop-base/VS2002Target.cs.svn-base | 9 + .../.svn/prop-base/VS2003Target.cs.svn-base | 9 + .../.svn/prop-base/VS2005Target.cs.svn-base | 9 + .../.svn/prop-base/XcodeTarget.cs.svn-base | 9 + .../text-base/AutotoolsTarget.cs.svn-base | 1070 +++++++++++++++++ .../.svn/text-base/DebugTarget.cs.svn-base | 102 ++ .../.svn/text-base/MakefileTarget.cs.svn-base | 469 ++++++++ .../text-base/MonoDevelopTarget.cs.svn-base | 515 ++++++++ .../.svn/text-base/NAntTarget.cs.svn-base | 776 ++++++++++++ .../text-base/SharpDevelop2Target.cs.svn-base | 82 ++ .../text-base/SharpDevelopTarget.cs.svn-base | 425 +++++++ .../.svn/text-base/ToolInfo.cs.svn-base | 197 +++ .../.svn/text-base/VS2002Target.cs.svn-base | 87 ++ .../.svn/text-base/VS2003Target.cs.svn-base | 593 +++++++++ .../.svn/text-base/VS2005Target.cs.svn-base | 147 +++ .../.svn/text-base/VS2008Target.cs.svn-base | 127 ++ .../.svn/text-base/VS2010Target.cs.svn-base | 138 +++ .../text-base/VSGenericTarget.cs.svn-base | 922 ++++++++++++++ .../.svn/text-base/VSVersion.cs.svn-base | 54 + .../.svn/text-base/XcodeTarget.cs.svn-base | 594 +++++++++ Prebuild/src/Core/Targets/AutotoolsTarget.cs | 1070 +++++++++++++++++ Prebuild/src/Core/Targets/DebugTarget.cs | 102 ++ Prebuild/src/Core/Targets/MakefileTarget.cs | 469 ++++++++ .../src/Core/Targets/MonoDevelopTarget.cs | 515 ++++++++ Prebuild/src/Core/Targets/NAntTarget.cs | 792 ++++++++++++ .../src/Core/Targets/SharpDevelop2Target.cs | 82 ++ .../src/Core/Targets/SharpDevelopTarget.cs | 425 +++++++ Prebuild/src/Core/Targets/ToolInfo.cs | 197 +++ Prebuild/src/Core/Targets/VS2002Target.cs | 87 ++ Prebuild/src/Core/Targets/VS2003Target.cs | 593 +++++++++ Prebuild/src/Core/Targets/VS2005Target.cs | 147 +++ Prebuild/src/Core/Targets/VS2008Target.cs | 127 ++ Prebuild/src/Core/Targets/VS2010Target.cs | 138 +++ Prebuild/src/Core/Targets/VSGenericTarget.cs | 922 ++++++++++++++ Prebuild/src/Core/Targets/VSVersion.cs | 54 + Prebuild/src/Core/Targets/XcodeTarget.cs | 594 +++++++++ Prebuild/src/Core/UnknownLanguageException.cs | 63 + Prebuild/src/Core/Utilities/.svn/all-wcprops | 29 + .../src/Core/Utilities/.svn/dir-prop-base | 5 + Prebuild/src/Core/Utilities/.svn/entries | 164 +++ .../CommandLineCollection.cs.svn-base | 9 + .../prop-base/CurrentDirectory.cs.svn-base | 9 + .../.svn/prop-base/Helper.cs.svn-base | 9 + .../Utilities/.svn/prop-base/Log.cs.svn-base | 9 + .../CommandLineCollection.cs.svn-base | 152 +++ .../text-base/CurrentDirectory.cs.svn-base | 68 ++ .../.svn/text-base/Helper.cs.svn-base | 575 +++++++++ .../Utilities/.svn/text-base/Log.cs.svn-base | 276 +++++ .../Core/Utilities/CommandLineCollection.cs | 152 +++ .../src/Core/Utilities/CurrentDirectory.cs | 68 ++ Prebuild/src/Core/Utilities/Helper.cs | 575 +++++++++ Prebuild/src/Core/Utilities/Log.cs | 276 +++++ Prebuild/src/Core/WarningException.cs | 84 ++ Prebuild/src/Prebuild.cs | 165 +++ Prebuild/src/Prebuild.snk | Bin 0 -> 596 bytes Prebuild/src/Properties/.svn/all-wcprops | 11 + Prebuild/src/Properties/.svn/entries | 62 + .../.svn/prop-base/AssemblyInfo.cs.svn-base | 9 + .../.svn/text-base/AssemblyInfo.cs.svn-base | 113 ++ Prebuild/src/Properties/AssemblyInfo.cs | 113 ++ Prebuild/src/data/.svn/all-wcprops | 71 ++ Prebuild/src/data/.svn/dir-prop-base | 6 + Prebuild/src/data/.svn/entries | 402 +++++++ .../data/.svn/prop-base/dnpb-1.0.xsd.svn-base | 9 + .../data/.svn/prop-base/dnpb-1.1.xsd.svn-base | 9 + .../data/.svn/prop-base/dnpb-1.2.xsd.svn-base | 9 + .../data/.svn/prop-base/dnpb-1.3.xsd.svn-base | 9 + .../data/.svn/prop-base/dnpb-1.4.xsd.svn-base | 9 + .../data/.svn/prop-base/dnpb-1.5.xsd.svn-base | 9 + .../.svn/prop-base/prebuild-1.6.xsd.svn-base | 9 + .../.svn/text-base/autotools.xml.svn-base | 790 ++++++++++++ .../data/.svn/text-base/dnpb-1.0.xsd.svn-base | 183 +++ .../data/.svn/text-base/dnpb-1.1.xsd.svn-base | 184 +++ .../data/.svn/text-base/dnpb-1.2.xsd.svn-base | 198 +++ .../data/.svn/text-base/dnpb-1.3.xsd.svn-base | 206 ++++ .../data/.svn/text-base/dnpb-1.4.xsd.svn-base | 212 ++++ .../data/.svn/text-base/dnpb-1.5.xsd.svn-base | 215 ++++ .../.svn/text-base/prebuild-1.6.xsd.svn-base | 231 ++++ .../.svn/text-base/prebuild-1.7.xsd.svn-base | 350 ++++++ .../.svn/text-base/prebuild-1.8.xsd.svn-base | 331 +++++ .../.svn/text-base/prebuild-1.9.xsd.svn-base | 336 ++++++ Prebuild/src/data/autotools.xml | 790 ++++++++++++ Prebuild/src/data/dnpb-1.0.xsd | 183 +++ Prebuild/src/data/dnpb-1.1.xsd | 184 +++ Prebuild/src/data/dnpb-1.2.xsd | 198 +++ Prebuild/src/data/dnpb-1.3.xsd | 206 ++++ Prebuild/src/data/dnpb-1.4.xsd | 212 ++++ Prebuild/src/data/dnpb-1.5.xsd | 215 ++++ Prebuild/src/data/prebuild-1.6.xsd | 231 ++++ Prebuild/src/data/prebuild-1.7.xsd | 350 ++++++ Prebuild/src/data/prebuild-1.8.xsd | 331 +++++ Prebuild/src/data/prebuild-1.9.xsd | 336 ++++++ Prebuild/tests/.svn/all-wcprops | 59 + Prebuild/tests/.svn/entries | 334 +++++ .../tests/.svn/text-base/Makefile.svn-base | 24 + .../tests/.svn/text-base/README.txt.svn-base | 5 + .../text-base/include-001.expected.svn-base | 46 + .../text-base/include-001.include.svn-base | 33 + .../text-base/include-001.prebuild.svn-base | 22 + .../text-base/include-002-2.include.svn-base | 8 + .../text-base/include-002.expected.svn-base | 26 + .../text-base/include-002.include.svn-base | 14 + .../text-base/include-002.prebuild.svn-base | 7 + Prebuild/tests/Makefile | 24 + Prebuild/tests/README.txt | 5 + Prebuild/tests/include-001.expected | 46 + Prebuild/tests/include-001.include | 33 + Prebuild/tests/include-001.prebuild | 22 + Prebuild/tests/include-002-2.include | 8 + Prebuild/tests/include-002.expected | 26 + Prebuild/tests/include-002.include | 14 + Prebuild/tests/include-002.prebuild | 7 + bin/Prebuild.exe | Bin 227840 -> 228352 bytes 319 files changed, 44002 insertions(+) create mode 100644 Prebuild/AUTHORS create mode 100644 Prebuild/COPYING create mode 100644 Prebuild/ChangeLog create mode 100644 Prebuild/INSTALL create mode 100644 Prebuild/NEWS create mode 100644 Prebuild/README create mode 100644 Prebuild/THANKS create mode 100644 Prebuild/TODO create mode 100755 Prebuild/clean.bat create mode 100755 Prebuild/clean.sh create mode 100644 Prebuild/doc/.svn/all-wcprops create mode 100644 Prebuild/doc/.svn/dir-prop-base create mode 100644 Prebuild/doc/.svn/entries create mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example1.xml.svn-base create mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example2.xml.svn-base create mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example3.xml.svn-base create mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example4.xml.svn-base create mode 100644 Prebuild/doc/.svn/text-base/prebuild-example1.xml.svn-base create mode 100644 Prebuild/doc/.svn/text-base/prebuild-example2.xml.svn-base create mode 100644 Prebuild/doc/.svn/text-base/prebuild-example3.xml.svn-base create mode 100644 Prebuild/doc/.svn/text-base/prebuild-example4.xml.svn-base create mode 100644 Prebuild/doc/.svn/text-base/prebuild-example5.xml.svn-base create mode 100644 Prebuild/doc/prebuild-example1.xml create mode 100644 Prebuild/doc/prebuild-example2.xml create mode 100644 Prebuild/doc/prebuild-example3.xml create mode 100644 Prebuild/doc/prebuild-example4.xml create mode 100644 Prebuild/doc/prebuild-example5.xml create mode 100755 Prebuild/prebuild create mode 100644 Prebuild/prebuild.xml create mode 100644 Prebuild/scripts/.svn/all-wcprops create mode 100644 Prebuild/scripts/.svn/dir-prop-base create mode 100644 Prebuild/scripts/.svn/entries create mode 100644 Prebuild/scripts/.svn/prop-base/Clean.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/Clean.sh.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/Help.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/MonoDevelop.sh.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/Prebuild.nsi.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/SharpDevelop.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/SharpDevelop2.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/VS2002.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/VS2003.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/VS2005.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/VS2008.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/autotools.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/autotools.sh.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/makefile.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/makefile.sh.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/nant.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/nant.sh.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/xcode.bat.svn-base create mode 100644 Prebuild/scripts/.svn/prop-base/xcode.sh.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/Clean.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/Clean.sh.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/Help.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/MonoDevelop.sh.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/Prebuild.nsi.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/SharpDevelop.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/SharpDevelop2.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/VS2002.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/VS2003.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/VS2005.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/VS2008.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/VS2010.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/autotools.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/autotools.sh.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/makefile.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/makefile.sh.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/nant.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/nant.sh.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/xcode.bat.svn-base create mode 100644 Prebuild/scripts/.svn/text-base/xcode.sh.svn-base create mode 100755 Prebuild/scripts/Clean.bat create mode 100755 Prebuild/scripts/Clean.sh create mode 100755 Prebuild/scripts/Help.bat create mode 100755 Prebuild/scripts/MonoDevelop.sh create mode 100644 Prebuild/scripts/Prebuild.nsi create mode 100755 Prebuild/scripts/SharpDevelop.bat create mode 100755 Prebuild/scripts/SharpDevelop2.bat create mode 100755 Prebuild/scripts/VS2002.bat create mode 100755 Prebuild/scripts/VS2003.bat create mode 100755 Prebuild/scripts/VS2005.bat create mode 100755 Prebuild/scripts/VS2008.bat create mode 100644 Prebuild/scripts/VS2010.bat create mode 100755 Prebuild/scripts/autotools.bat create mode 100755 Prebuild/scripts/autotools.sh create mode 100755 Prebuild/scripts/makefile.bat create mode 100755 Prebuild/scripts/makefile.sh create mode 100755 Prebuild/scripts/nant.bat create mode 100755 Prebuild/scripts/nant.sh create mode 100755 Prebuild/scripts/xcode.bat create mode 100755 Prebuild/scripts/xcode.sh create mode 100644 Prebuild/src/.svn/all-wcprops create mode 100644 Prebuild/src/.svn/dir-prop-base create mode 100644 Prebuild/src/.svn/entries create mode 100644 Prebuild/src/.svn/prop-base/App.ico.svn-base create mode 100644 Prebuild/src/.svn/prop-base/Prebuild.cs.svn-base create mode 100644 Prebuild/src/.svn/prop-base/Prebuild.snk.svn-base create mode 100644 Prebuild/src/.svn/text-base/App.ico.svn-base create mode 100644 Prebuild/src/.svn/text-base/Prebuild.cs.svn-base create mode 100644 Prebuild/src/.svn/text-base/Prebuild.snk.svn-base create mode 100644 Prebuild/src/App.ico create mode 100644 Prebuild/src/Core/.svn/all-wcprops create mode 100644 Prebuild/src/Core/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/.svn/entries create mode 100644 Prebuild/src/Core/.svn/prop-base/FatalException.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/prop-base/Kernel.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/prop-base/UnknownLanguageException.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/prop-base/WarningException.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/text-base/FatalException.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base create mode 100644 Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/.svn/all-wcprops create mode 100644 Prebuild/src/Core/Attributes/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/Attributes/.svn/entries create mode 100644 Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base create mode 100644 Prebuild/src/Core/Attributes/DataNodeAttribute.cs create mode 100644 Prebuild/src/Core/Attributes/OptionNodeAttribute.cs create mode 100644 Prebuild/src/Core/Attributes/TargetAttribute.cs create mode 100644 Prebuild/src/Core/FatalException.cs create mode 100644 Prebuild/src/Core/Interfaces/.svn/all-wcprops create mode 100644 Prebuild/src/Core/Interfaces/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/Interfaces/.svn/entries create mode 100644 Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base create mode 100644 Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base create mode 100644 Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base create mode 100644 Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base create mode 100644 Prebuild/src/Core/Interfaces/IDataNode.cs create mode 100644 Prebuild/src/Core/Interfaces/ITarget.cs create mode 100644 Prebuild/src/Core/Kernel.cs create mode 100644 Prebuild/src/Core/Nodes/.svn/all-wcprops create mode 100644 Prebuild/src/Core/Nodes/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/Nodes/.svn/entries create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base create mode 100644 Prebuild/src/Core/Nodes/AuthorNode.cs create mode 100644 Prebuild/src/Core/Nodes/CleanFilesNode.cs create mode 100644 Prebuild/src/Core/Nodes/CleanupNode.cs create mode 100644 Prebuild/src/Core/Nodes/ConfigurationNode.cs create mode 100644 Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs create mode 100644 Prebuild/src/Core/Nodes/DataNode.cs create mode 100644 Prebuild/src/Core/Nodes/DatabaseProjectNode.cs create mode 100644 Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs create mode 100644 Prebuild/src/Core/Nodes/DescriptionNode.cs create mode 100644 Prebuild/src/Core/Nodes/ExcludeNode.cs create mode 100644 Prebuild/src/Core/Nodes/FileNode.cs create mode 100644 Prebuild/src/Core/Nodes/FilesNode.cs create mode 100644 Prebuild/src/Core/Nodes/MatchNode.cs create mode 100644 Prebuild/src/Core/Nodes/OptionsNode.cs create mode 100644 Prebuild/src/Core/Nodes/ProcessNode.cs create mode 100644 Prebuild/src/Core/Nodes/ProjectNode.cs create mode 100644 Prebuild/src/Core/Nodes/ReferenceNode.cs create mode 100644 Prebuild/src/Core/Nodes/ReferencePathNode.cs create mode 100644 Prebuild/src/Core/Nodes/SolutionNode.cs create mode 100644 Prebuild/src/Core/Parse/.svn/all-wcprops create mode 100644 Prebuild/src/Core/Parse/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/Parse/.svn/entries create mode 100644 Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base create mode 100644 Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base create mode 100644 Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base create mode 100644 Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base create mode 100644 Prebuild/src/Core/Parse/IfContext.cs create mode 100644 Prebuild/src/Core/Parse/Preprocessor.cs create mode 100644 Prebuild/src/Core/Targets/.NAntTarget.cs.swp create mode 100644 Prebuild/src/Core/Targets/.svn/all-wcprops create mode 100644 Prebuild/src/Core/Targets/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/Targets/.svn/entries create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/DebugTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/MakefileTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/MonoDevelopTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/NAntTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/SharpDevelopTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/VS2002Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/VS2003Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/VS2005Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/XcodeTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/AutotoolsTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base create mode 100644 Prebuild/src/Core/Targets/AutotoolsTarget.cs create mode 100644 Prebuild/src/Core/Targets/DebugTarget.cs create mode 100644 Prebuild/src/Core/Targets/MakefileTarget.cs create mode 100644 Prebuild/src/Core/Targets/MonoDevelopTarget.cs create mode 100644 Prebuild/src/Core/Targets/NAntTarget.cs create mode 100644 Prebuild/src/Core/Targets/SharpDevelop2Target.cs create mode 100644 Prebuild/src/Core/Targets/SharpDevelopTarget.cs create mode 100644 Prebuild/src/Core/Targets/ToolInfo.cs create mode 100644 Prebuild/src/Core/Targets/VS2002Target.cs create mode 100644 Prebuild/src/Core/Targets/VS2003Target.cs create mode 100644 Prebuild/src/Core/Targets/VS2005Target.cs create mode 100644 Prebuild/src/Core/Targets/VS2008Target.cs create mode 100644 Prebuild/src/Core/Targets/VS2010Target.cs create mode 100644 Prebuild/src/Core/Targets/VSGenericTarget.cs create mode 100644 Prebuild/src/Core/Targets/VSVersion.cs create mode 100644 Prebuild/src/Core/Targets/XcodeTarget.cs create mode 100644 Prebuild/src/Core/UnknownLanguageException.cs create mode 100644 Prebuild/src/Core/Utilities/.svn/all-wcprops create mode 100644 Prebuild/src/Core/Utilities/.svn/dir-prop-base create mode 100644 Prebuild/src/Core/Utilities/.svn/entries create mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base create mode 100644 Prebuild/src/Core/Utilities/CommandLineCollection.cs create mode 100644 Prebuild/src/Core/Utilities/CurrentDirectory.cs create mode 100644 Prebuild/src/Core/Utilities/Helper.cs create mode 100644 Prebuild/src/Core/Utilities/Log.cs create mode 100644 Prebuild/src/Core/WarningException.cs create mode 100644 Prebuild/src/Prebuild.cs create mode 100644 Prebuild/src/Prebuild.snk create mode 100644 Prebuild/src/Properties/.svn/all-wcprops create mode 100644 Prebuild/src/Properties/.svn/entries create mode 100644 Prebuild/src/Properties/.svn/prop-base/AssemblyInfo.cs.svn-base create mode 100644 Prebuild/src/Properties/.svn/text-base/AssemblyInfo.cs.svn-base create mode 100644 Prebuild/src/Properties/AssemblyInfo.cs create mode 100644 Prebuild/src/data/.svn/all-wcprops create mode 100644 Prebuild/src/data/.svn/dir-prop-base create mode 100644 Prebuild/src/data/.svn/entries create mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/autotools.xml.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base create mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base create mode 100644 Prebuild/src/data/autotools.xml create mode 100644 Prebuild/src/data/dnpb-1.0.xsd create mode 100644 Prebuild/src/data/dnpb-1.1.xsd create mode 100644 Prebuild/src/data/dnpb-1.2.xsd create mode 100644 Prebuild/src/data/dnpb-1.3.xsd create mode 100644 Prebuild/src/data/dnpb-1.4.xsd create mode 100644 Prebuild/src/data/dnpb-1.5.xsd create mode 100644 Prebuild/src/data/prebuild-1.6.xsd create mode 100644 Prebuild/src/data/prebuild-1.7.xsd create mode 100644 Prebuild/src/data/prebuild-1.8.xsd create mode 100644 Prebuild/src/data/prebuild-1.9.xsd create mode 100644 Prebuild/tests/.svn/all-wcprops create mode 100644 Prebuild/tests/.svn/entries create mode 100644 Prebuild/tests/.svn/text-base/Makefile.svn-base create mode 100644 Prebuild/tests/.svn/text-base/README.txt.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-001.expected.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-001.include.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-002-2.include.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-002.expected.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-002.include.svn-base create mode 100644 Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base create mode 100644 Prebuild/tests/Makefile create mode 100644 Prebuild/tests/README.txt create mode 100644 Prebuild/tests/include-001.expected create mode 100644 Prebuild/tests/include-001.include create mode 100644 Prebuild/tests/include-001.prebuild create mode 100644 Prebuild/tests/include-002-2.include create mode 100644 Prebuild/tests/include-002.expected create mode 100644 Prebuild/tests/include-002.include create mode 100644 Prebuild/tests/include-002.prebuild diff --git a/Prebuild/AUTHORS b/Prebuild/AUTHORS new file mode 100644 index 0000000000..9e86ac018f --- /dev/null +++ b/Prebuild/AUTHORS @@ -0,0 +1,10 @@ +Dave Hudson (jendave@yahoo.com), +Matthew Holmes (matthew@wildfiregames.com) +Dan Moorehead (dan05a@gmail.com) +Rob Loach (http://www.robloach.net) +C.J. Adams-Collier (cjac@colliertech.org) + +Patch Contributers +lbsa71 +chi11ken +sdague diff --git a/Prebuild/COPYING b/Prebuild/COPYING new file mode 100644 index 0000000000..d3cdf7e38e --- /dev/null +++ b/Prebuild/COPYING @@ -0,0 +1,65 @@ +BSD License +Copyright (c)2004-2008 + +See AUTHORS file for list of copyright holders + +Dave Hudson (jendave@yahoo.com), +Matthew Holmes (matthew@wildfiregames.com) +Dan Moorehead (dan05a@gmail.com) +Rob Loach (http://www.robloach.net) +C.J. Adams-Collier (cjac@colliertech.org) + +http://dnpb.sourceforge.net +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +--- + +Portions of src/Core/Targets/AutotoolsTarget.cs +// Copyright (C) 2006 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Prebuild/ChangeLog b/Prebuild/ChangeLog new file mode 100644 index 0000000000..bb8e7b09d8 --- /dev/null +++ b/Prebuild/ChangeLog @@ -0,0 +1,461 @@ +2008-12-09T02:15 D. Moonfire + * src/Core/Kernel.cs + - Added a /ppi target to get the results of processing but before + processing the actual results. + * src/Core/Preprocessor.cs + - Applied the patch from kanato with formatting changes. + - Uses the format. + * tests/ + - Added some lightweight tests to test the functionality of the + include patch. + +2008-06-19T09:37 John Anderson + * src/Core/Kernel.cs + - Only Loop through targets that are not abstract. + * src/Core/Targets/VSGenericTarget.cs + - Marked abstract and removed the Target attribute. + +2008-06-16T17:37 John Anderson + * src/Core/Nodes/ProjectNode.cs,data/prebuild-1.7.xsd + - Added the ability to hardcode guid's in the projects + +2008-05-21T0737 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - catch exception when unable to compile AssemblyInfo.cs + +2008-05-07T17:29 John Anderson + * src/Core/Targets/VSGenericTarget.cs + - Generate asp.net output in bin\ folder (asp.net requires it there) + +2008-04-30T17:29 John Anderson + * src/Core/Nodes/DatabaseReferenceNode.cs, + src/Core/Nodes/Datanode.cs, + src/Core/Nodes/FileNode.cs, + src/Core/Nodes/FileNodes.cs, + src/Core/Nodes/MatchNode.cs, + src/Core/Targets/VS2008Target.cs, + src/data/prebuild-1.7.xsd + - Refactored the project generation code to handle web projects and more + logically handle embedded resources and designer files. + +2008-04-30T17:29 Joseph Lombrozo + * src/Core/Nodes/SolutionNode.cs + - Had solutions inherit Configurations in the same way that Projects do. + +2008-04-29T06:35 Joseph Lombrozo + * src/Core/Targets/VS2008Target.cs, + src/Core/Nodes/DatabaseProjectNode.cs, + src/Core/Nodes/DatabaseReferenceNode.cs, + src/data/prebuild-1.7.xsd + - Added database references to database projects. + - Prevented nested solutions from being written to disk. + +2008-04-29T05:43 Joseph Lombrozo + * src/Core/Targets/VS2008Target.cs + - Enabled embedded solutions to contain Files. + +2008-04-29T04:13 Joseph Lombrozo + * src/Core/VSVersion.cs + - Fixed spelling mistake in enum comment. + * src/Core/Attributes/DataNodeAttribute.cs + - Allowed the DataNodeAttribute to be attached to a single class + more than once, allowing one class to be used to parse more than + one node at a time. + * src/Core/Kernel.cs + - Changed CacheNodeTypes() to allow for multiple DataNodeAttribute + instances in one class. Refactored ProcessFile(...) to return Solutions, + rather than adding them to the Kernel. + * src/Core/Nodes/SolutionNode.cs + - Added Guid (for embedded folders) + - Added DatabaseProjects, Solutions and Processes to the SolutionNode + when parsing. + * src/Core/Nodes/ProjectNode.cs + - Added FrameworkVersion property to allow for 2.0/3.0/3.5 differentiation. + * src/Core/Targets/VS2008Target.cs, src/data/prebuild-1.7.xsd + - Added ability to have embedded solutions, and externally referenced + prebuild scripts. + +2008-04-24T04:33 John M. Anderson + * src/Core/Targets/VS2003Target.cs, src/Core/Targets/VSVersion.cs + - Moved the VSVersion enum into its own file. + * src/Core/Targets/VS2008Target.cs + - added support for VS2008 + * src/Core/Nodes/ProjectNode.cs + - Added initial support for ASP.NET projects + * src/Core/Nodes/DatabaseProjectNode.cs + - Added support for Visual Studio database projects + +2008-02-19T07:08 C.J. Adams-Collier + * TODO + - added some tasks from Sam Hocevar + * src/Core/Targets/AutotoolsTarget.cs + - added a missing end paren + * COPYING + - Removed Randy Ridge's name from the copyright. Looks to me like + his name was present only because the file was nabbed from Tao + +2008-02-09T20:29 C.J. Adams-Collier + * COPYING + - added MIT/X11 license due to inclusion of code from Monodevelop + * THANKS + - added Lluis Sanchez Gual and Todd Berman - I yoinked code from + their pkg-config .pc file parser to build AutotoolsTarget.cs. + Sorry it took me so long to remember to add mention of you guys! + * src/Core/Targets/AutotoolsTarget.cs + - added MIT/X11 license. see above. + +2008-02-07T08:27 C.J. Adams-Collier + * AUTHORS + - consolidated names and contact info found laying around the + source + * src/Core/Kernel.cs + - updated copyright date + - re-formatted license for 80-column editor + - updated log banner to indicate new date, new authors + * src/Core/Targets/AutotoolsTarget.cs + - clarified reasoning behind use of constants in + AutotoolsTarget.ParsePCFile + - reduced length of some long lines using newline/indent + - added log messages for parsing .pc files, emitting solutions, + projects + - robustified the inter-package dependency resolution target + - log warning when we can't find assembly for + - clarified code for case of inability to find embedded + autotools.xml + * src/data/autotools.xml + - adding system lookup of resgen2 to configure.ac + - fixed .resource -> .resources typo + - added a rule to create .response file containing all sources + - using @.response on $(CSC) command line instead of listing + all source files + * src/Properties/AssemblyInfo.cs + - re-formatted license for an 80-column editor + - added more authors to the AssemblyCopyright attribute + - bumped version to 2.0.3 + * prebuild.xml + - bumped version to 2.0.3 + * scripts/autotools.sh + - if 'mono' is in the path, run Prebuild.exe with it + - using dirname to capture correct path to prebuild.xml &c + +2008-02-06T17:18 C.J. Adams-Collier + * src/Core/Targets/NAntTarget.cs + - re-formatted the license for an 80-column editor + - added myself to the copyright + - added a fix submitted by Gryc Ueusp + * src/Core/Targets/AutotoolsTarget.cs + - updated copyright to include 2008 + * THANKS + - created file, added Gryc Ueusp + +2008-01-01T14:50 C.J. Adams-Collier + * src/data/autotools.xml + - fixed .resx -> .resource compilation + - fixed failing edge case where Project is an unsigned Library + - added $(RESOURCE_SRC) to list of extra dist files + * src/Core/Targets/AutotoolsTarget.cs + - removed embeddedResources from extraDistFiles list + +2007-04-18T07:49 C.J. Adams-Collier + * src/data/prebuild-1.7.xsd + - removed default version from references + +2007-04-06T12:42 C.J. Adams-Collier + * src/data/autotools.xml + - added support for /doc: output when XmlDocFile is not empty + - not printing \t \\n on lines that have no content + - gacutil now installs the root assembly instead of the one under + bin/Debug or whatever + +2007-04-04T22:12 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - removed debugging Console.WriteLine() + * src/data/autotools.xml + - ensuring that install-sh and missing get distributed + - explicitly stating that the sources, snk, resources and binary + references live under $(srcdir) + - corrected uninstall target + - verified distcheck completes successfully + +2007-04-03T21:56 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - added a using for System.Diagnostics + - added enum ClrVersion for use with the pkg-config parser + - added class SystemPackage for use with the pkg-config parser + - removed explicit "private" property of members since it is implied + - flushing the stream-writer before it's closed + - removed excess braces around an if statement + ! NormalizeAsmName(), AddAssembly(), GetAssembliesWithLibInfo(), + GetAssembliesWithoutLibInfo(), ProcessPiece(), + GetVariableFromPkgConfig(), ParsePCFile(), + RegisterSystemAssemblies(), RunInitialization() + - pulled the above from MonoDevelop to parse the system pkgconfig + files and determine /pkg: arguments. Original sources are here: + http://svn.myrealbox.com/source/trunk/monodevelop/Core/src/MonoDevelop.Core/MonoDevelop.Core/SystemAssemblyService.cs + http://svn.myrealbox.com/source/trunk/monodevelop/Core/src/MonoDevelop.Core/MonoDevelop.Core/ClrVersion.cs + ! WriteProject() + - now gathering project version from AssemblyInfo.cs if it is part + of the project + - changed the declaration of the ArrayList's in the method + - now copying assembly .config files to the project, distributing, + installing + - making sure all needed files live under the Project directory + - copying strongname keys to project directory + - parsing AssemblyInfo.cs to determine assembly version + - removing all references to ".." + - removed superfluous if(project.References.Count > 0) around + for(int refNum = 0; refNum < project.References.Count; refNum++) + - removed use of runtimeLibs + - adding hook to copy sibling project's generated assemblies to + this project during Make time + - added extra dist target to ensure all files required to build + get distributed during "make dist" + - added new xslt processing args: + -- assemblyName + -- extraDistFiles + -- pkgLibs (/pkg:foo) + -- localCopyTargets (to copy sibling assemblies at Make time) + -- projectVersion (if determined from AssemblyInfo.cs) + -- hasAssemblyConfig (if there's a assembly.exe.config present) + ! Write() + - calling RunInitialization() to gather pkg-config data + * src/data/autotools.xml + - accepting new args passed from AutotoolsTarget.cs + - modernized configure.ac a bit + - using a version of tar that allows >99-char filenames + - added ASSEMBLY_NAME variable + - using assembly name rather than project name for gac installation + - generated assembly is now assembly name and not project name + - accepting /pkg: flags gathered from AutotoolsTarget.cs + - adding Makefile targets to copy sibling project assemblies to . + - fixed Debug, Release targets + - adding support for strongname key signing + - adding /unsafe support + - adding a clean make target + - only running gacutil /u if the assembly being uninstalled is in gac + - added some templates to determine each Configuration's .snk + - added explanation as to why .exe assemblies live in $prefix/lib + * src/Properties/AssemblyInfo.cs + - bumped assembly version + * prebuild.xml + - bumped assembly version + +2007-03-29T18:03 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + ! WriteProject() + - re-named incorrectly-named variable gacLibs to systemLibs + - added another reference list, runtimeLibs which contains the + libs we will need at runtime. we use this to build a MONO_PATH + - added monoPath to the xslt args list + * src/data/autotools.xml + ! + - renamed gacLibs to systemLibs + - added the sources to the dist list + - added logic to install libs that aren't strongnamed + ! + - accepting a param to update the MONO_PATH + +2007-03-28T19:46 C.J. Adams-Collier + * src/Core/Targets/MonoDevelopTarget.cs + ! CleanProject() + - using Assembly.LoadWithPartialName to locate the assembly + * src/Core/Targets/AutotoolsTarget.cs + ! WriteCombine() + - no longer using $PWD to determine a project's source dir; this + doesn't work with elements + - passing the solution name to all templates - fixes + multi-solution prebuild systems + ! WriteProject() + - no longer using $PWD to determine a project's source dir; this + doesn't work with elements + - passing the solution name to all templates - fixes + multi-solution prebuild systems + - copying strongname key to the autotools directory + - using Assembly.LoadWithPartialName to locate assemblies + * src/data/autotools.xml + ! + - fixed the .pc AC_CONFIG_FILES macro + ! + - added solution name param + - wrapping if type=exe check around script install macro + - added type=lib check and .pc file install macro + - added support for Configuration-specific builds (Debug, Release, etc) + - added strongname keyfile code + - TODO: support non-strongnamed library installation + ! + - added space preservation attribute to stylesheet element + - added a lower-case project name variable + - added solution name param + - made for-each template more specific + ! + - added solution name param + ! + - added solution name param + ! + - added solution name param + ! + - added solution name param + +2007-03-27T09:33 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - now processing the wrapper script if type is "Exe" or "WinExe" + * src/data/autotools.xml + ! + - being more exact about where text escaping is used + - using the correct variable name for the GACUTIL_FLAGS template + - using correct test="" for the AC_CONFIG_FILES macros + ! + - uncommented the bin_SCRIPTS section now that the script is being + generated correctly + ! + - fixed whitespace at beginning of file, before #! + - using lower-case packageName to indicate installation location + +2007-03-27T09:33 C.J. Adams-Collier + * src/data/autotools.xml + ! + * added a lcProjectName which is $projectName lower-cased + * moved autoconf template specifier near AC_OUTPUT + * AC_OUTPUT with args is deprecated. now using AC_CONFIG_FILES + * placed AC_CONFIG_FILES() calls for wrapper script or pkg-config + file in xslt project type checks + ! + * commented out bin_SCRIPTS + * added a lcProjectName which is $projectName lower-cased + * using $lcProjectName instead of the longer version + +2007-03-27T08:39 C.J. Adams-Collier + * src/data/autotools.xml + ! + - added whitespace-preservation + - added the missing projectName param + - replaced bin_SCRIPTS with something that worked + +2007-03-27T07:56 C.J. Adams-Collier + * src/data/autotools.xml + ! + - cleaned up duplicate checks + - placed initialization macros above system check macros + - added some more messages about what's going on + - added GACUTIL_FLAGS variable including /package option + ! + - added an incomplete bin_SCRIPTS + - RCS check says "building" instead of "compiling" + ! + - removed macros that are useful only for projects + ! + - created this element on this revision + - this is a wrapper shell script that lives in the $PATH and runs + the CIL assembly + +2007-03-26T20:18 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - creating new template arguments to contain the list of libs to + reference: source, binary & GAC + - source libs are included as part of this solution (untested) + - binary libs are distributed with the source (untested) + - GAC libs are assumed to be in the GAC or other lib path (tested) + * src/data/autotools.xml + - created new params through which to accept reference info + - created a working $(CSC) line + - added a TODO item for ordering project dependency for + AC_CONFIG_SUBDIRS code + +2007-03-26T08:41 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - now creating list of source files in managed code and passing + them to the template via s + * src/data/prebuild-1.7.xsd + - updated the header comment to 2007 + * src/data/autotools.xml + ! + - copied checks from Solution-level configure.ac + - copied solution-level config status + ! + - added elements for file list to be passed through + - made a temporary target for the assembly we're building + - added this target to the deps of "all:" + ! + - changed status header/footer from "- - -" to "===" + +2007-03-23T08:33 C.J. Adams-Collier + Added version attribute handling code for Property element + Added description element handling code + * prebuild.xml + - added /Prebuild/Solution/Property/@version attribute + - added /Prebuild/Solution/Property/Description element + * src/Core/Nodes/ProjectNode.cs + - added some docs where they were missing and obvious + - added code to handle @version + * src/Core/Nodes/DescriptionNode.cs + - new file. Used to handle /Prebuild/Solution/Property/Description + * src/Core/Targets/AutotoolsTarget.cs + - added mkdirDashP(), a recursive directory creation method + - WriteProject() now copies the files to autotools/ + * src/data/prebuild-1.7.xsd + - added /Prebuild/Solution/Property/Description element + - added /Prebuild/Solution/Property/@version attribute + * src/data/autotools.xml + - removed excess + - explicitly using dnpb: prefix + +2007-03-23T04:31 C.J. Adams-Collier + Merged code from my stripped-down test + Adding support for the /Prebuild/Solution/Project/Author element + * prebuild.xml + - added Author elements + - cleaned up the really long Project element + * src/Core/Nodes/ProjectNode.cs + - added Author tag processing code + * src/Core/Nodes/AuthorNode.cs + - Created to process Author elements + - based off of ReferencePathNode.cs + * src/Core/Targets/AutotoolsTarget.cs + - merged code from https://svn.colliertech.org/mono/dnpbAutotools/dnpbAutotools/test.cs + - renamed old WriteCombine to WriteCombineOld + - renamed old WriteProject to WriteProjectOld + * src/data/prebuild-1.7.xsd + - added Author element to Project + * src/data/autotools.xml + - lower-cased utf + + +2007-03-22T13:58 C.J. Adams-Collier + Exposing an XmlDocument that represents the prebuild.xml file + passed to the program + + * src/Core/Kernel.cs + - created an object member called XmlDocument m_CurrentDoc + - created a property to access its value + - using m_CurrentDoc to load up the prebuild.xml file rather than + a local variable called "doc" + +2007-03-22 C.J. Adams-Collier + * prebuild.xml + - added autotools.xml created at https://svn.colliertech.org/mono/dnpbAutotools/dnpbAutotools/autotools.xml + * src/data/autotools.xml + - the same + * src/Core/Targets/MonoDevelopTarget.cs + - fixed bug introduced in r206 + +2007-03-07 C.J. Adams-Collier + * src/data/prebuild-1.7.xsd + - added version attribute to Solution and Project elements + +2006-11-04T00:38 C.J. Adams-Collier + * placing AssemblyInfo.cs into Properties/ + * Fixed double-mention of the package name + +2006-11-03T15:23 C.J. Adams-Collier + * corrected a problem in the Include.am generation code + * created the new .exe + * copied it to the root of the build + +2006-11-03T14:57 C.J. Adams-Collier + * Updated the .exe file + +2006-11-03 C.J. Adams-Collier + * Added a TODO file + * Added a ChangeLog file + * applied some fixes for autotools gac and pkg-config installation + problems diff --git a/Prebuild/INSTALL b/Prebuild/INSTALL new file mode 100644 index 0000000000..23e5f25d0e --- /dev/null +++ b/Prebuild/INSTALL @@ -0,0 +1,236 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Prebuild/NEWS b/Prebuild/NEWS new file mode 100644 index 0000000000..bea28dac26 --- /dev/null +++ b/Prebuild/NEWS @@ -0,0 +1,200 @@ +Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, MonoDevelop, and NAnt. + +Documentation and downloads are available at http://dnpb.sourceforge.net. + +Prebuild is licensed under the BSD license. + +[ XXXXXXX XX, XXX - 1.3.2 ] + + Added Keyfile signing to NAnt target and VS2005 target + + Updated XSD file to 1.7 + + Boo and VisualBasic Language support in VS2005 target + + Added basic Autotools target. It creates a non-recursive Autotools system. + ! Multiple files can be excluded from the Match node + ! VS2005 now handles .resx files correctly. + ! NAnt and Autotools now handle defines + ! NAnt and Autotools now handle resources + + Conditional XML variables can be passed through the command line. + + Added /install and /remove command line flags to install and remove assemblies from the GAC + + Many fixes to VS2005 target + +[ July 21, 2006 - 1.3.1 ] + ! VS2005 fixes from Rob Loach + ! NAnt fixes from Rob Loach and David Hudson + ! XML doc fixes from Rob Loach + + Added SharpDevelop2 target (really just uses VS2005 target) + ! Fixed bug with BuildEvents in Monodevelop target + + Passing /yes will default to answering yes to any warnings + +[ February 28, 2006 - 1.3 ] + + Added MonoDevelop target. + + Added NAnt target. + + Lots of fixes to all targets. + * Cleaned up the code using FXCop. + * Updated schema to 1.6 to fix a typo and add a new parameter. + * jendave is now the maintainer of the project. RobLoach has been added as a developer. + * Removed references to 'dnpb'. + + Added rudimentary support for pre- and post- build scripts + * Updated examples. + +[ August 5, 2004 - 1.2 ] + + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages + + Added the allowedgroups command line option followed by a pipe-delimited list of project group filter flags (eg. Group1|Group2) allow optional filtering of all projects that dont have at least one of these flags + + Added the filterGroups XML attribute to the project node and updated the scheme to v1.5 for this addition, it is used to specified the delimited list of filter groups to which a project belongs + * Modified the removedir command line option to allow for a pipe-delimited list of directory names + ! Modified the resource loading code to search for resourced without the prepended namespace (as Visual Studio .NET does it) to allow for it to be compiled with SharpDevelop as well + + Added the GenerateXmlDocFile boolean option to the Options XML element + * Changed the behavior of the XmlDocFile option so that if not specified it uses the assemblyName (without file extension) + .xml for the file name instead of just not generating the file since the new GenerateXmlDocFile takes care of this + +[ January 3, 2004 - 1.1 ] + ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems + + Added the checkOsVars attribute to the root element for enabling interpolation for Enviroment variables in the form ${var}, otherwise no checking is performed for efficiency-sake + * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version + +[ December 30, 2004 - 1.1 ] + ! Applied Leed's fix for SharpDevelop references + + Rewrote much of the processing for better validation and without the use of a temp file + + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs + * Changed all spaces into tabs + + Added support for the None build action + * Replaced all sequence's in the XML schema for all's because the order doesn't matter since the xml file is loaded into an XmlDocument + +[ December 25, 2004 - 1.0 ] + + Added the /removedir option for cleaning directories like obj before file releases + + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds + * Made path optional for Match elements (defaults to current directory) and updates schema for it + ! Fixed XML example in the readme.txt + + Added example xml files to docs directory + * Updated license.txt to add Dan Moorehead and update copyright years + + Updated prebuild.xml to take advantage of the default path attribute for match elements + + Updated Clean to delete the obj directories + +[ December 25, 2004 - 0.13 ] + + Added dnpb.exe so that it can be used to generate the project files + + Added dnpb.ico + * Added parameterless Write statement to Log for writing a single line + * Changed scehema to version 1.3 for support of icon attribute + * Added support for All configuration name under a Project node signifying common settings for all configurations + ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode + * Wrote documentation in docs/readme.txt + * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 + * Updated prebuild.xml + * Optimized Log class + * Updated OutputUsage() + * /clean targets all by default + * No log file is used by default, /log without value specified uses default file name + + Added support for the /pause which pauses the utility after execution to observe output + + +[ September 27, 2004 - 0.12.2a ] + ! Fixed a nasty bug when trying to delete our temp file for pre-processing. + +[ September 15, 2004 - 0.12.2 ] + + Expanded platform identification, thanks to the NAnt guys for shedding some + light on how to properly check for UNIX platforms! Thanks guys! + * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", + and "Unknown". + ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of + the Project tag. + + New command-line switch, /ppo, forces DNPB to pre-process the file and write + the pre-processed file. This allows you to test/debug your pre-processor + macros. No other processing will be done. You can specify a target file as + a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' + if you do not specify a file. + + The Match tag now has a 'buildAction' attribute which functions exactly like + the attribute of the same name for the File tag. + +[ August 5, 2004 - 0.12.1 ] + + Added environment variable expansion for all values. Environment variables + should be listed in the form ${VAR}. + +[ July 30, 2004 - 0.12.0 ] + + Added preprocessing via XML processing information tags. Available tags + are: ?>, ?>, and . The + current expression parser is very basic, but will be replaced with a more + capable parser over time. Current operators available are: =, !=, <, >, + <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, + RuntimeMinor, RuntimeRevision. + +[ July 27, 2004 - 0.11.4 ] + + Added 'useRegex' attribute to the Match tag. Matches can now use regular + expressions to match filenames. + + Added the 'assemblyName' attribute to the Project tag. Projects can now + set their output assembly name. + ! Fixed several bugs in the way that Project tags inheirt their parent + Solutions configuration options. This operation should now work fully as + intended. + ! Due to some wierdness, Project Guid's are now stored as part of the Project + node and created at parse time. + +[ May 11, 2004 - 0.11.3 ] + ! Fixed a bug where I was writing the wrong property name for a projects root + namespace. + ! Removed a DEBUG statement I had left in the code in 0.11.2. + ! Fixed a bug in the VS2002 writer which caused the version variables to not + be overriden correctly. + + Added the rootNamespace property to the element, allowing you to + specify the root namespace. + * /target and /clean are now mutually exclusive command line switches, and + they both now take the all option. In the case of /target all, all build + file for all targets will be created. In the case of /clean all, the user + will be prompted to make sure they want to do it, and if so, will clean + all build files for all targets. + +[ April 22, 2004 - 0.11.2 ] + ! Fixed a bug with the /file command-line operator. Was using the unresolved + file path rather then the resolved one, was making the attempt to open the + dnpb file fail. + ! Fixed a bug in the schema that required at least 1 solution and 1 reference + path. We can do just fine with 0 of either of these. Some files may be all + statements and not have any tags. + ! Fixed a bug that caused the project references not to be written with the + SharpDevelop target. + * Changed the schema to version 1.2, allowing for Configuration nodes to exist + under project nodes. The inheritance of values is hierarchical. Meaning, if + you define a configuration named Debug at the Soltion level, and one by the + same name at the Project level, the one at the Project level will first + inherit the options of the Solution level configuration, then set it's own + options. If you define a configuration at the Project level and it does not + exist at the Solution level, it will be created at the Solution level. + * Project references should now work correctly across the board. Note that due + to a restriction in Visual Studio, you can only reference projects in the same + solution. + +[ April 21, 2004 - 0.11.1 ] + ! Fixed a problem with resolving paths in various targets. Was not properly + setting the CWD. + * Schema updated to 1.1, moving the ReferencePath element from the Options + element to the Project element. This makes more logical sense, given that + reference paths are resolved relative to the project path. Any prebuild.xml + file referecning verison 1.0 will fail! Please update to the 1.1 schema. + +[ April 19, 2004 - 0.11.0 ] + * Added several attributes across the code to make FxCop happy + ! Fixed bugs in reference paths being written in the VS targets. + ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of + a Push/Pop pair. Was wreaking havoc with tags. + ! Fixed some bugs in the path tracking, both the Project and Solution nodes now + have a FullPath property, which is the full path to the file resolved at load + time. This should fix all path relativity problems. + + Added new /clean switch, allowing the target to clean up any files it generated. + in accordance, the ITarget interface has been updated to support a new Clean() + method. + + Completed addition of the tag, to allow the referencing of external + prebuild.xml files. + + Added the runtime attribute to the Project element. This allows the developer + to specify which runtime a project should target (Mono or Microsoft). This is + of course ignored in certain targets like the Visual Studio targets. + + Added the SharpDevelop target. + +[ April 13, 2004 - 0.10.1a ] + + Added the buildAction attribute to the File node. This is needed for dnpb + to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) + +[ April 13, 2004 - 0.10.1 ] + * First Release + +[ Key ] +* = Change or information ++ = Addition +! = Bug Fix + diff --git a/Prebuild/README b/Prebuild/README new file mode 100644 index 0000000000..2b05fb598d --- /dev/null +++ b/Prebuild/README @@ -0,0 +1,274 @@ +Prebuild Instructions + +Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, SharpDevelop2, MonoDevelop, and NAnt. + +_______________________________________________________________________________ +Overview + +Prebuild can be either be run from the command line to generate the +project and make files or you can execute the included batch (*.bat) +and Unix Shell script (*.sh) files. + +_______________________________________________________________________________ +The currently supported developement tools and their associated batch +and shell script files. + +Visual Studio .NET 2005 (VS2005.bat) +Visual Studio .NET 2003 (VS2003.bat) +Visual Studio .NET 2002 (VS2002.bat) +SharpDevelop (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ +SharpDevelop2 (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ +MonoDevelop (MonoDevelop.sh) - http://www.monodevelop.com/ +NAnt (nant.sh and nant.bat) - http://nant.sourceforge.net/ +Autotools (autotools.bat and autotools.sh) - http://en.wikipedia.org/wiki/GNU_build_system + +Notes: + +A Unix Shell script is provided for MonoDevelop, as it does not run on +Windows at this time. + +Visual Studio .NET 2005 and the Visual Express IDE's can import +solutions from older versions of Visual Studio .NET. + +Makefiles are not currently supported. + +_______________________________________________________________________________ +Command Line Syntax: + +Example: +> Prebuild /target vs2003 + +This will generate the project files for Visual Studio.NET 2003 and +place the redirect the log to a file named PrebuildLog.txt in the +parent directory + + +The syntax structure is as below, where commandParameter is optional +depending on the command and you can provide several option-value +pairs. + +Note: The '> ' signifies the command prompt, do not enter this literally + +> Prebuild / + class Prebuild + { + #region Main + + [STAThread] + static void Main(string[] args) + { + Kernel kernel = null; + try + { + kernel = Kernel.Instance; + kernel.Initialize(LogTargets.File | LogTargets.Console, args); + bool exit = false; + + if(kernel.CommandLine.WasPassed("usage")) + { + exit = true; + OutputUsage(); + } + if(kernel.CommandLine.WasPassed("showtargets")) + { + exit = true; + OutputTargets(kernel); + } + if(kernel.CommandLine.WasPassed("install")) + { + exit = true; + InstallAssembly(kernel); + } + if(kernel.CommandLine.WasPassed("remove")) + { + exit = true; + RemoveAssembly(kernel); + } + + if(!exit) + { + kernel.Process(); + } + } +#if !DEBUG + catch (Exception ex) + { + Console.WriteLine("Unhandled error: {0}", ex.Message); + Console.WriteLine("{0}", ex.StackTrace); + } +#endif + finally + { + if(kernel != null && kernel.PauseAfterFinish) + { + Console.WriteLine("\nPress enter to continue..."); + Console.ReadLine(); + } + } + } + + #endregion + + #region Private Methods + + private static void InstallAssembly(Kernel kernel) + { + Publish publish = new Publish(); + string file = kernel.CommandLine["install"]; + //Console.WriteLine(".."+file+".."); + publish.GacInstall(file); + } + + private static void RemoveAssembly(Kernel kernel) + { + Publish publish = new Publish(); + string file = kernel.CommandLine["remove"]; + publish.GacRemove(file); + } + + private static void OutputUsage() + { + Console.WriteLine("Usage: prebuild /target [options]"); + Console.WriteLine("Available command-line switches:"); + Console.WriteLine(); + Console.WriteLine("/target Target for Prebuild"); + Console.WriteLine("/clean Clean the build files for the given target"); + Console.WriteLine("/file XML file to process"); + Console.WriteLine("/log Log file to write to"); + Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); + Console.WriteLine("/pause Pauses the application after execution to view the output"); + Console.WriteLine("/yes Default to yes to any questions asked"); + Console.WriteLine("/install Install assembly into the GAC"); + Console.WriteLine("/remove Remove assembly from the GAC"); + Console.WriteLine(); + Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); + Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); + Console.WriteLine(); + } + + private static void OutputTargets(Kernel kern) + { + Console.WriteLine("Targets available in Prebuild:"); + Console.WriteLine(""); + if(kern.Targets.Keys.Count > 0) + { + string[] targs = new string[kern.Targets.Keys.Count]; + kern.Targets.Keys.CopyTo(targs, 0); + Array.Sort(targs); + foreach(string target in targs) + { + Console.WriteLine(target); + } + } + Console.WriteLine(""); + } + + #endregion + } +} diff --git a/Prebuild/src/.svn/text-base/Prebuild.snk.svn-base b/Prebuild/src/.svn/text-base/Prebuild.snk.svn-base new file mode 100644 index 0000000000000000000000000000000000000000..f9dce054ffae7c79dce7d3ba0b790904bdb36831 GIT binary patch literal 596 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 + /// + /// + [Serializable()] + public class FatalException : Exception + { + #region Constructors + + + /// + /// Initializes a new instance of the class. + /// + public FatalException() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The format. + /// The args. + public FatalException(string format, params object[] args) + : base(String.Format(format, args)) + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public FatalException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public FatalException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base b/Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base new file mode 100644 index 0000000000..67051d5747 --- /dev/null +++ b/Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base @@ -0,0 +1,832 @@ +#region BSD License +/* +Copyright (c) 2004-2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Rob Loach (http://www.robloach.net), +C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +#define NO_VALIDATE + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Schema; +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core +{ + /// + /// + /// + public class Kernel : IDisposable + { + #region Inner Classes + + private struct NodeEntry + { + public Type Type; + public DataNodeAttribute Attribute; + } + + #endregion + + #region Fields + + private static readonly Kernel m_Instance = new Kernel(); + + /// + /// This must match the version of the schema that is embeeded + /// + private const string m_SchemaVersion = "1.9"; + private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; + private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; + bool disposed; + private Version m_Version; + private const string m_Revision = ""; + private CommandLineCollection m_CommandLine; + private Log m_Log; + private CurrentDirectory m_CurrentWorkingDirectory; + private XmlSchemaCollection m_Schemas; + + private readonly Dictionary m_Targets = new Dictionary(); + private readonly Dictionary m_Nodes = new Dictionary(); + + readonly List m_Solutions = new List(); + string m_Target; + string m_Clean; + string[] m_RemoveDirectories; + XmlDocument m_CurrentDoc; + bool m_PauseAfterFinish; + string[] m_ProjectGroups; + + #endregion + + #region Constructors + + private Kernel() + { + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether [pause after finish]. + /// + /// true if [pause after finish]; otherwise, false. + public bool PauseAfterFinish + { + get + { + return m_PauseAfterFinish; + } + } + + /// + /// Gets the instance. + /// + /// The instance. + public static Kernel Instance + { + get + { + return m_Instance; + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); + } + } + + /// + /// Gets the command line. + /// + /// The command line. + public CommandLineCollection CommandLine + { + get + { + return m_CommandLine; + } + } + + /// + /// Gets the targets. + /// + /// The targets. + public Dictionary Targets + { + get + { + return m_Targets; + } + } + + /// + /// Gets the log. + /// + /// The log. + public Log Log + { + get + { + return m_Log; + } + } + + /// + /// Gets the current working directory. + /// + /// The current working directory. + public CurrentDirectory CurrentWorkingDirectory + { + get + { + return m_CurrentWorkingDirectory; + } + } + + /// + /// Gets the solutions. + /// + /// The solutions. + public List Solutions + { + get + { + return m_Solutions; + } + } + + /// + /// Gets the XmlDocument object representing the prebuild.xml + /// being processed + /// + /// The XmlDocument object + public XmlDocument CurrentDoc + { + get + { + return m_CurrentDoc; + } + } + + #endregion + + #region Private Methods + + private static void RemoveDirectories(string rootDir, string[] dirNames) + { + foreach(string dir in Directory.GetDirectories(rootDir)) + { + string simpleName = Path.GetFileName(dir); + + if(Array.IndexOf(dirNames, simpleName) != -1) + { + //delete if the name matches one of the directory names to delete + string fullDirPath = Path.GetFullPath(dir); + Directory.Delete(fullDirPath,true); + } + else//not a match, so check children + { + RemoveDirectories(dir,dirNames); + //recurse, checking children for them + } + } + } + +// private void RemoveDirectoryMatches(string rootDir, string dirPattern) +// { +// foreach(string dir in Directory.GetDirectories(rootDir)) +// { +// foreach(string match in Directory.GetDirectories(dir)) +// {//delete all child directories that match +// Directory.Delete(Path.GetFullPath(match),true); +// } +// //recure through the rest checking for nested matches to delete +// RemoveDirectoryMatches(dir,dirPattern); +// } +// } + + private void LoadSchema() + { + Assembly assembly = GetType().Assembly; + Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); + if(stream == null) + { + //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET + stream = assembly.GetManifestResourceStream(m_Schema); + if(stream == null) + { + throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); + } + } + XmlReader schema = new XmlTextReader(stream); + + m_Schemas = new XmlSchemaCollection(); + m_Schemas.Add(m_SchemaURI, schema); + } + + private void CacheVersion() + { + m_Version = Assembly.GetEntryAssembly().GetName().Version; + } + + private void CacheTargets(Assembly assm) + { + foreach(Type t in assm.GetTypes()) + { + TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); + + if(ta == null) + continue; + + if (t.IsAbstract) + continue; + + ITarget target = (ITarget)assm.CreateInstance(t.FullName); + if (target == null) + { + throw new MissingMethodException("Could not create ITarget instance"); + } + + m_Targets[ta.Name] = target; + } + } + + private void CacheNodeTypes(Assembly assm) + { + foreach(Type t in assm.GetTypes()) + { + foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) + { + NodeEntry ne = new NodeEntry(); + ne.Type = t; + ne.Attribute = dna; + m_Nodes[dna.Name] = ne; + } + } + } + + private void LogBanner() + { + m_Log.Write("Prebuild v" + Version); + m_Log.Write("Copyright (c) 2004-2010"); + m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); + m_Log.Write("Dan Moorehead (dan05a@gmail.com),"); + m_Log.Write("David Hudson (jendave@yahoo.com),"); + m_Log.Write("Rob Loach (http://www.robloach.net),"); + m_Log.Write("C.J. Adams-Collier (cjac@colliertech.org),"); + m_Log.Write("John Hurliman (john.hurliman@intel.com),"); + + m_Log.Write("See 'prebuild /usage' for help"); + m_Log.Write(); + } + + + + private void ProcessFile(string file) + { + ProcessFile(file, m_Solutions); + } + + public void ProcessFile(ProcessNode node, SolutionNode parent) + { + if (node.IsValid) + { + List list = new List(); + ProcessFile(node.Path, list); + + foreach (SolutionNode solution in list) + parent.SolutionsTable[solution.Name] = solution; + } + } + + /// + /// + /// + /// + /// + /// + public void ProcessFile(string file, IList solutions) + { + m_CurrentWorkingDirectory.Push(); + + string path = file; + try + { + try + { + path = Helper.ResolvePath(path); + } + catch(ArgumentException) + { + m_Log.Write("Could not open Prebuild file: " + path); + m_CurrentWorkingDirectory.Pop(); + return; + } + + Helper.SetCurrentDir(Path.GetDirectoryName(path)); + + XmlTextReader reader = new XmlTextReader(path); + + Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); + + //register command line arguments as XML variables + IEnumerator> dict = m_CommandLine.GetEnumerator(); + while (dict.MoveNext()) + { + string name = dict.Current.Key.Trim(); + if (name.Length > 0) + pre.RegisterVariable(name, dict.Current.Value); + } + + string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML + + // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the + // output before the system processes it. + if (m_CommandLine.WasPassed("ppi")) + { + // Get the filename if there is one, otherwise use a default. + string ppiFile = m_CommandLine["ppi"]; + if (ppiFile == null || ppiFile.Trim().Length == 0) + { + ppiFile = "preprocessed-input.xml"; + } + + // Write out the string to the given stream. + try + { + using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) + { + ppiWriter.WriteLine(xml); + } + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); + } + + // Finish processing this special tag. + return; + } + + m_CurrentDoc = new XmlDocument(); + try + { +#if NO_VALIDATE + XmlReader validator = XmlReader.Create(new StringReader(xml)); + m_CurrentDoc.Load(validator); +#else + XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); + + //validate while reading from string into XmlDocument DOM structure in memory + foreach(XmlSchema schema in m_Schemas) + { + validator.Schemas.Add(schema); + } + m_CurrentDoc.Load(validator); +#endif + } + catch(XmlException e) + { + throw new XmlException(e.ToString()); + } + + //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details + if(m_CommandLine.WasPassed("ppo")) + { + string ppoFile = m_CommandLine["ppo"]; + if(ppoFile == null || ppoFile.Trim().Length < 1) + { + ppoFile = "preprocessed.xml"; + } + + StreamWriter writer = null; + try + { + writer = new StreamWriter(ppoFile); + writer.Write(xml); + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); + } + finally + { + if(writer != null) + { + writer.Close(); + } + } + return; + } + //start reading the xml config file + XmlElement rootNode = m_CurrentDoc.DocumentElement; + //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); + Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); + + foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions + { + IDataNode dataNode = ParseNode(node, null); + if(dataNode is ProcessNode) + { + ProcessNode proc = (ProcessNode)dataNode; + if(proc.IsValid) + { + ProcessFile(proc.Path); + } + } + else if(dataNode is SolutionNode) + { + solutions.Add((SolutionNode)dataNode); + } + } + } + catch(XmlSchemaException xse) + { + m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", + xse.LineNumber, path, xse.Message); + } + finally + { + m_CurrentWorkingDirectory.Pop(); + } + } + + #endregion + + #region Public Methods + + /// + /// Allows the project. + /// + /// The project groups flags. + /// + public bool AllowProject(string projectGroupsFlags) + { + if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) + { + if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) + { + foreach(string group in projectGroupsFlags.Split('|')) + { + if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list + { + return true; + } + } + } + return false;//not included in the list or no groups specified for the project + } + return true;//no filter specified in the command line args + } + + /// + /// Gets the type of the node. + /// + /// The node. + /// + public Type GetNodeType(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(!m_Nodes.ContainsKey(node.Name)) + { + return null; + } + + NodeEntry ne = m_Nodes[node.Name]; + return ne.Type; + } + + /// + /// + /// + /// + /// + /// + public IDataNode ParseNode(XmlNode node, IDataNode parent) + { + return ParseNode(node, parent, null); + } + + //Create an instance of the data node type that is mapped to the name of the xml DOM node + /// + /// Parses the node. + /// + /// The node. + /// The parent. + /// The pre node. + /// + public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) + { + IDataNode dataNode; + + try + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(preNode == null) + { + if(!m_Nodes.ContainsKey(node.Name)) + { + Console.WriteLine("WARNING: Unknown XML node: " + node.Name); + return null; + } + + NodeEntry ne = m_Nodes[node.Name]; + Type type = ne.Type; + //DataNodeAttribute dna = ne.Attribute; + + dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); + if(dataNode == null) + { + throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); + } + } + else + dataNode = preNode; + + dataNode.Parent = parent; + dataNode.Parse(node); + } + catch(WarningException wex) + { + m_Log.Write(LogType.Warning, wex.Message); + return null; + } + catch(FatalException fex) + { + m_Log.WriteException(LogType.Error, fex); + throw; + } + catch(Exception ex) + { + m_Log.WriteException(LogType.Error, ex); + throw; + } + + return dataNode; + } + + /// + /// Initializes the specified target. + /// + /// The target. + /// The args. + public void Initialize(LogTargets target, string[] args) + { + CacheTargets(GetType().Assembly); + CacheNodeTypes(GetType().Assembly); + CacheVersion(); + + m_CommandLine = new CommandLineCollection(args); + + string logFile = null; + if(m_CommandLine.WasPassed("log")) + { + logFile = m_CommandLine["log"]; + + if(logFile != null && logFile.Length == 0) + { + logFile = "Prebuild.log"; + } + } + else + { + target = target & ~LogTargets.File; //dont output to a file + } + + m_Log = new Log(target, logFile); + LogBanner(); + + m_CurrentWorkingDirectory = new CurrentDirectory(); + + m_Target = m_CommandLine["target"]; + m_Clean = m_CommandLine["clean"]; + string removeDirs = m_CommandLine["removedir"]; + if(removeDirs != null && removeDirs.Length == 0) + { + m_RemoveDirectories = removeDirs.Split('|'); + } + + string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include + if(flags != null && flags.Length == 0) + { + m_ProjectGroups = flags.Split('|'); + } + m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); + + LoadSchema(); + } + + /// + /// Processes this instance. + /// + public void Process() + { + bool perfomedOtherTask = false; + if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) + { + try + { + RemoveDirectories(".",m_RemoveDirectories); + } + catch(IOException e) + { + m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); + m_Log.WriteException(LogType.Error,e); + } + catch(UnauthorizedAccessException e) + { + m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); + m_Log.WriteException(LogType.Error,e); + } + perfomedOtherTask = true; + } + + if(m_Target != null && m_Clean != null) + { + m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); + return; + } + + if(m_Target == null && m_Clean == null) + { + if(perfomedOtherTask) //finished + { + return; + } + m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); + return; + } + + string file = "./prebuild.xml"; + if(m_CommandLine.WasPassed("file")) + { + file = m_CommandLine["file"]; + } + + ProcessFile(file); + + string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); + bool clean = (m_Target == null); + if(clean && target != null && target.Length == 0) + { + target = "all"; + } + if(clean && target == "all")//default to all if no target was specified for clean + { + //check if they passed yes + if (!m_CommandLine.WasPassed("yes")) + { + Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); + string ret = Console.ReadLine(); + if(ret == null) + { + return; + } + ret = ret.Trim().ToLower(); + if((ret.ToLower() != "y" && ret.ToLower() != "yes")) + { + return; + } + } + //clean all targets (just cleaning vs2002 target didn't clean nant) + foreach(ITarget targ in m_Targets.Values) + { + targ.Clean(this); + } + } + else + { + if (!m_Targets.ContainsKey(target)) { + m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); + return; + } + ITarget targ = m_Targets[target]; + + if(clean) + { + targ.Clean(this); + } + else + { + targ.Write(this); + } + } + + m_Log.Flush(); + } + + #endregion + + #region IDisposable Members + + /// + /// + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose objects + /// + /// + /// If true, it will dispose close the handle + /// + /// + /// Will dispose managed and unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!disposed) + { + if (disposing) + { + GC.SuppressFinalize(this); + if (m_Log != null) + { + m_Log.Close(); + m_Log = null; + } + } + } + disposed = true; + } + + /// + /// + /// + ~Kernel() + { + Dispose(false); + } + + /// + /// Closes and destroys this object + /// + /// + /// Same as Dispose(true) + /// + public void Close() + { + Dispose(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base b/Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base new file mode 100644 index 0000000000..607b66c022 --- /dev/null +++ b/Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base @@ -0,0 +1,63 @@ +/* + * $RCSfile$ + * Copyright (C) 2004, 2005 David Hudson (jendave@yahoo.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + [Serializable()] + public class UnknownLanguageException : Exception + { + /// + /// Basic exception. + /// + public UnknownLanguageException() + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public UnknownLanguageException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public UnknownLanguageException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + } +} diff --git a/Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base b/Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base new file mode 100644 index 0000000000..b7c3668cce --- /dev/null +++ b/Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base @@ -0,0 +1,84 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + /// + [Serializable] + public class WarningException : Exception + { + #region Constructors + + /// + /// + /// + public WarningException() + { + } + + /// + /// + /// + /// + /// + public WarningException(string format, params object[] args) + : base(String.Format(format, args)) + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public WarningException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public WarningException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Attributes/.svn/all-wcprops b/Prebuild/src/Core/Attributes/.svn/all-wcprops new file mode 100644 index 0000000000..bb28016b6a --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes +END +OptionNodeAttribute.cs +K 25 +svn:wc:ra_dav:version-url +V 84 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs +END +DataNodeAttribute.cs +K 25 +svn:wc:ra_dav:version-url +V 82 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes/DataNodeAttribute.cs +END +TargetAttribute.cs +K 25 +svn:wc:ra_dav:version-url +V 80 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes/TargetAttribute.cs +END diff --git a/Prebuild/src/Core/Attributes/.svn/dir-prop-base b/Prebuild/src/Core/Attributes/.svn/dir-prop-base new file mode 100644 index 0000000000..a1989a0b6d --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/dir-prop-base @@ -0,0 +1,5 @@ +K 10 +svn:ignore +V 5 +*.swp +END diff --git a/Prebuild/src/Core/Attributes/.svn/entries b/Prebuild/src/Core/Attributes/.svn/entries new file mode 100644 index 0000000000..1ce535ee50 --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Attributes +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +OptionNodeAttribute.cs +file + + + + +2010-09-10T22:51:44.000000Z +fe1b8740374f76dcb84f73de54376d48 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2240 + +DataNodeAttribute.cs +file + + + + +2010-09-10T22:51:44.000000Z +7988716ebc1c723842814e3eec197831 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2270 + +TargetAttribute.cs +file + + + + +2010-09-10T22:51:44.000000Z +766d4782c2b50f82a7c98e1eb968f42d +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2194 + diff --git a/Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base new file mode 100644 index 0000000000..f1938a2e20 --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base @@ -0,0 +1,72 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Specialized; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] + public sealed class DataNodeAttribute : Attribute + { + #region Fields + + private string m_Name = "unknown"; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public DataNodeAttribute(string name) + { + m_Name = name; + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base new file mode 100644 index 0000000000..2d6a6a7bfc --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base @@ -0,0 +1,71 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Field)] + public sealed class OptionNodeAttribute : Attribute + { + #region Fields + + private string m_NodeName; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// Name of the node. + public OptionNodeAttribute(string nodeName) + { + m_NodeName = nodeName; + } + + #endregion + + #region Properties + + /// + /// Gets the name of the node. + /// + /// The name of the node. + public string NodeName + { + get + { + return m_NodeName; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base new file mode 100644 index 0000000000..5ad62ee033 --- /dev/null +++ b/Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base @@ -0,0 +1,71 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] + public sealed class TargetAttribute : Attribute + { + #region Fields + + private string m_Name; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public TargetAttribute(string name) + { + m_Name = name; + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Attributes/DataNodeAttribute.cs b/Prebuild/src/Core/Attributes/DataNodeAttribute.cs new file mode 100644 index 0000000000..f1938a2e20 --- /dev/null +++ b/Prebuild/src/Core/Attributes/DataNodeAttribute.cs @@ -0,0 +1,72 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Specialized; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] + public sealed class DataNodeAttribute : Attribute + { + #region Fields + + private string m_Name = "unknown"; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public DataNodeAttribute(string name) + { + m_Name = name; + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs new file mode 100644 index 0000000000..2d6a6a7bfc --- /dev/null +++ b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs @@ -0,0 +1,71 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Field)] + public sealed class OptionNodeAttribute : Attribute + { + #region Fields + + private string m_NodeName; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// Name of the node. + public OptionNodeAttribute(string nodeName) + { + m_NodeName = nodeName; + } + + #endregion + + #region Properties + + /// + /// Gets the name of the node. + /// + /// The name of the node. + public string NodeName + { + get + { + return m_NodeName; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Attributes/TargetAttribute.cs b/Prebuild/src/Core/Attributes/TargetAttribute.cs new file mode 100644 index 0000000000..5ad62ee033 --- /dev/null +++ b/Prebuild/src/Core/Attributes/TargetAttribute.cs @@ -0,0 +1,71 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] + public sealed class TargetAttribute : Attribute + { + #region Fields + + private string m_Name; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public TargetAttribute(string name) + { + m_Name = name; + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/FatalException.cs b/Prebuild/src/Core/FatalException.cs new file mode 100644 index 0000000000..348790568f --- /dev/null +++ b/Prebuild/src/Core/FatalException.cs @@ -0,0 +1,85 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + /// + [Serializable()] + public class FatalException : Exception + { + #region Constructors + + + /// + /// Initializes a new instance of the class. + /// + public FatalException() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The format. + /// The args. + public FatalException(string format, params object[] args) + : base(String.Format(format, args)) + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public FatalException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public FatalException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Interfaces/.svn/all-wcprops b/Prebuild/src/Core/Interfaces/.svn/all-wcprops new file mode 100644 index 0000000000..0359de207a --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 61 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Interfaces +END +ITarget.cs +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Interfaces/ITarget.cs +END +IDataNode.cs +K 25 +svn:wc:ra_dav:version-url +V 74 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Interfaces/IDataNode.cs +END diff --git a/Prebuild/src/Core/Interfaces/.svn/dir-prop-base b/Prebuild/src/Core/Interfaces/.svn/dir-prop-base new file mode 100644 index 0000000000..a1989a0b6d --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/dir-prop-base @@ -0,0 +1,5 @@ +K 10 +svn:ignore +V 5 +*.swp +END diff --git a/Prebuild/src/Core/Interfaces/.svn/entries b/Prebuild/src/Core/Interfaces/.svn/entries new file mode 100644 index 0000000000..0ff8913c37 --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Interfaces +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +ITarget.cs +file + + + + +2010-09-10T22:51:44.000000Z +52c732d42919f00330b2c4ed8b6360f8 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +1984 + +IDataNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +0ff6737b55b9bc4c63f9143c367a7e62 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +1900 + diff --git a/Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base new file mode 100644 index 0000000000..986dd2de8c --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base @@ -0,0 +1,47 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +namespace Prebuild.Core.Interfaces +{ + /// + /// + /// + public interface IDataNode + { + /// + /// Gets or sets the parent. + /// + /// The parent. + IDataNode Parent { get; set; } + /// + /// Parses the specified node. + /// + /// The node. + void Parse(XmlNode node); + } +} diff --git a/Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base new file mode 100644 index 0000000000..47115c658b --- /dev/null +++ b/Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base @@ -0,0 +1,51 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Interfaces +{ + /// + /// + /// + public interface ITarget + { + /// + /// Writes the specified kern. + /// + /// The kern. + void Write(Kernel kern); + /// + /// Cleans the specified kern. + /// + /// The kern. + void Clean(Kernel kern); + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + } +} \ No newline at end of file diff --git a/Prebuild/src/Core/Interfaces/IDataNode.cs b/Prebuild/src/Core/Interfaces/IDataNode.cs new file mode 100644 index 0000000000..986dd2de8c --- /dev/null +++ b/Prebuild/src/Core/Interfaces/IDataNode.cs @@ -0,0 +1,47 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +namespace Prebuild.Core.Interfaces +{ + /// + /// + /// + public interface IDataNode + { + /// + /// Gets or sets the parent. + /// + /// The parent. + IDataNode Parent { get; set; } + /// + /// Parses the specified node. + /// + /// The node. + void Parse(XmlNode node); + } +} diff --git a/Prebuild/src/Core/Interfaces/ITarget.cs b/Prebuild/src/Core/Interfaces/ITarget.cs new file mode 100644 index 0000000000..47115c658b --- /dev/null +++ b/Prebuild/src/Core/Interfaces/ITarget.cs @@ -0,0 +1,51 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Interfaces +{ + /// + /// + /// + public interface ITarget + { + /// + /// Writes the specified kern. + /// + /// The kern. + void Write(Kernel kern); + /// + /// Cleans the specified kern. + /// + /// The kern. + void Clean(Kernel kern); + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + } +} \ No newline at end of file diff --git a/Prebuild/src/Core/Kernel.cs b/Prebuild/src/Core/Kernel.cs new file mode 100644 index 0000000000..67051d5747 --- /dev/null +++ b/Prebuild/src/Core/Kernel.cs @@ -0,0 +1,832 @@ +#region BSD License +/* +Copyright (c) 2004-2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Rob Loach (http://www.robloach.net), +C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +#define NO_VALIDATE + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Schema; +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core +{ + /// + /// + /// + public class Kernel : IDisposable + { + #region Inner Classes + + private struct NodeEntry + { + public Type Type; + public DataNodeAttribute Attribute; + } + + #endregion + + #region Fields + + private static readonly Kernel m_Instance = new Kernel(); + + /// + /// This must match the version of the schema that is embeeded + /// + private const string m_SchemaVersion = "1.9"; + private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; + private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; + bool disposed; + private Version m_Version; + private const string m_Revision = ""; + private CommandLineCollection m_CommandLine; + private Log m_Log; + private CurrentDirectory m_CurrentWorkingDirectory; + private XmlSchemaCollection m_Schemas; + + private readonly Dictionary m_Targets = new Dictionary(); + private readonly Dictionary m_Nodes = new Dictionary(); + + readonly List m_Solutions = new List(); + string m_Target; + string m_Clean; + string[] m_RemoveDirectories; + XmlDocument m_CurrentDoc; + bool m_PauseAfterFinish; + string[] m_ProjectGroups; + + #endregion + + #region Constructors + + private Kernel() + { + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether [pause after finish]. + /// + /// true if [pause after finish]; otherwise, false. + public bool PauseAfterFinish + { + get + { + return m_PauseAfterFinish; + } + } + + /// + /// Gets the instance. + /// + /// The instance. + public static Kernel Instance + { + get + { + return m_Instance; + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); + } + } + + /// + /// Gets the command line. + /// + /// The command line. + public CommandLineCollection CommandLine + { + get + { + return m_CommandLine; + } + } + + /// + /// Gets the targets. + /// + /// The targets. + public Dictionary Targets + { + get + { + return m_Targets; + } + } + + /// + /// Gets the log. + /// + /// The log. + public Log Log + { + get + { + return m_Log; + } + } + + /// + /// Gets the current working directory. + /// + /// The current working directory. + public CurrentDirectory CurrentWorkingDirectory + { + get + { + return m_CurrentWorkingDirectory; + } + } + + /// + /// Gets the solutions. + /// + /// The solutions. + public List Solutions + { + get + { + return m_Solutions; + } + } + + /// + /// Gets the XmlDocument object representing the prebuild.xml + /// being processed + /// + /// The XmlDocument object + public XmlDocument CurrentDoc + { + get + { + return m_CurrentDoc; + } + } + + #endregion + + #region Private Methods + + private static void RemoveDirectories(string rootDir, string[] dirNames) + { + foreach(string dir in Directory.GetDirectories(rootDir)) + { + string simpleName = Path.GetFileName(dir); + + if(Array.IndexOf(dirNames, simpleName) != -1) + { + //delete if the name matches one of the directory names to delete + string fullDirPath = Path.GetFullPath(dir); + Directory.Delete(fullDirPath,true); + } + else//not a match, so check children + { + RemoveDirectories(dir,dirNames); + //recurse, checking children for them + } + } + } + +// private void RemoveDirectoryMatches(string rootDir, string dirPattern) +// { +// foreach(string dir in Directory.GetDirectories(rootDir)) +// { +// foreach(string match in Directory.GetDirectories(dir)) +// {//delete all child directories that match +// Directory.Delete(Path.GetFullPath(match),true); +// } +// //recure through the rest checking for nested matches to delete +// RemoveDirectoryMatches(dir,dirPattern); +// } +// } + + private void LoadSchema() + { + Assembly assembly = GetType().Assembly; + Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); + if(stream == null) + { + //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET + stream = assembly.GetManifestResourceStream(m_Schema); + if(stream == null) + { + throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); + } + } + XmlReader schema = new XmlTextReader(stream); + + m_Schemas = new XmlSchemaCollection(); + m_Schemas.Add(m_SchemaURI, schema); + } + + private void CacheVersion() + { + m_Version = Assembly.GetEntryAssembly().GetName().Version; + } + + private void CacheTargets(Assembly assm) + { + foreach(Type t in assm.GetTypes()) + { + TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); + + if(ta == null) + continue; + + if (t.IsAbstract) + continue; + + ITarget target = (ITarget)assm.CreateInstance(t.FullName); + if (target == null) + { + throw new MissingMethodException("Could not create ITarget instance"); + } + + m_Targets[ta.Name] = target; + } + } + + private void CacheNodeTypes(Assembly assm) + { + foreach(Type t in assm.GetTypes()) + { + foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) + { + NodeEntry ne = new NodeEntry(); + ne.Type = t; + ne.Attribute = dna; + m_Nodes[dna.Name] = ne; + } + } + } + + private void LogBanner() + { + m_Log.Write("Prebuild v" + Version); + m_Log.Write("Copyright (c) 2004-2010"); + m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); + m_Log.Write("Dan Moorehead (dan05a@gmail.com),"); + m_Log.Write("David Hudson (jendave@yahoo.com),"); + m_Log.Write("Rob Loach (http://www.robloach.net),"); + m_Log.Write("C.J. Adams-Collier (cjac@colliertech.org),"); + m_Log.Write("John Hurliman (john.hurliman@intel.com),"); + + m_Log.Write("See 'prebuild /usage' for help"); + m_Log.Write(); + } + + + + private void ProcessFile(string file) + { + ProcessFile(file, m_Solutions); + } + + public void ProcessFile(ProcessNode node, SolutionNode parent) + { + if (node.IsValid) + { + List list = new List(); + ProcessFile(node.Path, list); + + foreach (SolutionNode solution in list) + parent.SolutionsTable[solution.Name] = solution; + } + } + + /// + /// + /// + /// + /// + /// + public void ProcessFile(string file, IList solutions) + { + m_CurrentWorkingDirectory.Push(); + + string path = file; + try + { + try + { + path = Helper.ResolvePath(path); + } + catch(ArgumentException) + { + m_Log.Write("Could not open Prebuild file: " + path); + m_CurrentWorkingDirectory.Pop(); + return; + } + + Helper.SetCurrentDir(Path.GetDirectoryName(path)); + + XmlTextReader reader = new XmlTextReader(path); + + Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); + + //register command line arguments as XML variables + IEnumerator> dict = m_CommandLine.GetEnumerator(); + while (dict.MoveNext()) + { + string name = dict.Current.Key.Trim(); + if (name.Length > 0) + pre.RegisterVariable(name, dict.Current.Value); + } + + string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML + + // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the + // output before the system processes it. + if (m_CommandLine.WasPassed("ppi")) + { + // Get the filename if there is one, otherwise use a default. + string ppiFile = m_CommandLine["ppi"]; + if (ppiFile == null || ppiFile.Trim().Length == 0) + { + ppiFile = "preprocessed-input.xml"; + } + + // Write out the string to the given stream. + try + { + using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) + { + ppiWriter.WriteLine(xml); + } + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); + } + + // Finish processing this special tag. + return; + } + + m_CurrentDoc = new XmlDocument(); + try + { +#if NO_VALIDATE + XmlReader validator = XmlReader.Create(new StringReader(xml)); + m_CurrentDoc.Load(validator); +#else + XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); + + //validate while reading from string into XmlDocument DOM structure in memory + foreach(XmlSchema schema in m_Schemas) + { + validator.Schemas.Add(schema); + } + m_CurrentDoc.Load(validator); +#endif + } + catch(XmlException e) + { + throw new XmlException(e.ToString()); + } + + //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details + if(m_CommandLine.WasPassed("ppo")) + { + string ppoFile = m_CommandLine["ppo"]; + if(ppoFile == null || ppoFile.Trim().Length < 1) + { + ppoFile = "preprocessed.xml"; + } + + StreamWriter writer = null; + try + { + writer = new StreamWriter(ppoFile); + writer.Write(xml); + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); + } + finally + { + if(writer != null) + { + writer.Close(); + } + } + return; + } + //start reading the xml config file + XmlElement rootNode = m_CurrentDoc.DocumentElement; + //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); + Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); + + foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions + { + IDataNode dataNode = ParseNode(node, null); + if(dataNode is ProcessNode) + { + ProcessNode proc = (ProcessNode)dataNode; + if(proc.IsValid) + { + ProcessFile(proc.Path); + } + } + else if(dataNode is SolutionNode) + { + solutions.Add((SolutionNode)dataNode); + } + } + } + catch(XmlSchemaException xse) + { + m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", + xse.LineNumber, path, xse.Message); + } + finally + { + m_CurrentWorkingDirectory.Pop(); + } + } + + #endregion + + #region Public Methods + + /// + /// Allows the project. + /// + /// The project groups flags. + /// + public bool AllowProject(string projectGroupsFlags) + { + if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) + { + if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) + { + foreach(string group in projectGroupsFlags.Split('|')) + { + if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list + { + return true; + } + } + } + return false;//not included in the list or no groups specified for the project + } + return true;//no filter specified in the command line args + } + + /// + /// Gets the type of the node. + /// + /// The node. + /// + public Type GetNodeType(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(!m_Nodes.ContainsKey(node.Name)) + { + return null; + } + + NodeEntry ne = m_Nodes[node.Name]; + return ne.Type; + } + + /// + /// + /// + /// + /// + /// + public IDataNode ParseNode(XmlNode node, IDataNode parent) + { + return ParseNode(node, parent, null); + } + + //Create an instance of the data node type that is mapped to the name of the xml DOM node + /// + /// Parses the node. + /// + /// The node. + /// The parent. + /// The pre node. + /// + public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) + { + IDataNode dataNode; + + try + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(preNode == null) + { + if(!m_Nodes.ContainsKey(node.Name)) + { + Console.WriteLine("WARNING: Unknown XML node: " + node.Name); + return null; + } + + NodeEntry ne = m_Nodes[node.Name]; + Type type = ne.Type; + //DataNodeAttribute dna = ne.Attribute; + + dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); + if(dataNode == null) + { + throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); + } + } + else + dataNode = preNode; + + dataNode.Parent = parent; + dataNode.Parse(node); + } + catch(WarningException wex) + { + m_Log.Write(LogType.Warning, wex.Message); + return null; + } + catch(FatalException fex) + { + m_Log.WriteException(LogType.Error, fex); + throw; + } + catch(Exception ex) + { + m_Log.WriteException(LogType.Error, ex); + throw; + } + + return dataNode; + } + + /// + /// Initializes the specified target. + /// + /// The target. + /// The args. + public void Initialize(LogTargets target, string[] args) + { + CacheTargets(GetType().Assembly); + CacheNodeTypes(GetType().Assembly); + CacheVersion(); + + m_CommandLine = new CommandLineCollection(args); + + string logFile = null; + if(m_CommandLine.WasPassed("log")) + { + logFile = m_CommandLine["log"]; + + if(logFile != null && logFile.Length == 0) + { + logFile = "Prebuild.log"; + } + } + else + { + target = target & ~LogTargets.File; //dont output to a file + } + + m_Log = new Log(target, logFile); + LogBanner(); + + m_CurrentWorkingDirectory = new CurrentDirectory(); + + m_Target = m_CommandLine["target"]; + m_Clean = m_CommandLine["clean"]; + string removeDirs = m_CommandLine["removedir"]; + if(removeDirs != null && removeDirs.Length == 0) + { + m_RemoveDirectories = removeDirs.Split('|'); + } + + string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include + if(flags != null && flags.Length == 0) + { + m_ProjectGroups = flags.Split('|'); + } + m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); + + LoadSchema(); + } + + /// + /// Processes this instance. + /// + public void Process() + { + bool perfomedOtherTask = false; + if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) + { + try + { + RemoveDirectories(".",m_RemoveDirectories); + } + catch(IOException e) + { + m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); + m_Log.WriteException(LogType.Error,e); + } + catch(UnauthorizedAccessException e) + { + m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); + m_Log.WriteException(LogType.Error,e); + } + perfomedOtherTask = true; + } + + if(m_Target != null && m_Clean != null) + { + m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); + return; + } + + if(m_Target == null && m_Clean == null) + { + if(perfomedOtherTask) //finished + { + return; + } + m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); + return; + } + + string file = "./prebuild.xml"; + if(m_CommandLine.WasPassed("file")) + { + file = m_CommandLine["file"]; + } + + ProcessFile(file); + + string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); + bool clean = (m_Target == null); + if(clean && target != null && target.Length == 0) + { + target = "all"; + } + if(clean && target == "all")//default to all if no target was specified for clean + { + //check if they passed yes + if (!m_CommandLine.WasPassed("yes")) + { + Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); + string ret = Console.ReadLine(); + if(ret == null) + { + return; + } + ret = ret.Trim().ToLower(); + if((ret.ToLower() != "y" && ret.ToLower() != "yes")) + { + return; + } + } + //clean all targets (just cleaning vs2002 target didn't clean nant) + foreach(ITarget targ in m_Targets.Values) + { + targ.Clean(this); + } + } + else + { + if (!m_Targets.ContainsKey(target)) { + m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); + return; + } + ITarget targ = m_Targets[target]; + + if(clean) + { + targ.Clean(this); + } + else + { + targ.Write(this); + } + } + + m_Log.Flush(); + } + + #endregion + + #region IDisposable Members + + /// + /// + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose objects + /// + /// + /// If true, it will dispose close the handle + /// + /// + /// Will dispose managed and unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!disposed) + { + if (disposing) + { + GC.SuppressFinalize(this); + if (m_Log != null) + { + m_Log.Close(); + m_Log = null; + } + } + } + disposed = true; + } + + /// + /// + /// + ~Kernel() + { + Dispose(false); + } + + /// + /// Closes and destroys this object + /// + /// + /// Same as Dispose(true) + /// + public void Close() + { + Dispose(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/all-wcprops b/Prebuild/src/Core/Nodes/.svn/all-wcprops new file mode 100644 index 0000000000..6565f05bd7 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/all-wcprops @@ -0,0 +1,119 @@ +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/dnpb/!svn/ver/321/trunk/Prebuild/src/Core/Nodes +END +CleanFilesNode.cs +K 25 +svn:wc:ra_dav:version-url +V 74 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/CleanFilesNode.cs +END +ProjectNode.cs +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/dnpb/!svn/ver/319/trunk/Prebuild/src/Core/Nodes/ProjectNode.cs +END +ConfigurationNode.cs +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/Core/Nodes/ConfigurationNode.cs +END +DataNode.cs +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/dnpb/!svn/ver/321/trunk/Prebuild/src/Core/Nodes/DataNode.cs +END +ReferencePathNode.cs +K 25 +svn:wc:ra_dav:version-url +V 77 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/ReferencePathNode.cs +END +SolutionNode.cs +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/dnpb/!svn/ver/315/trunk/Prebuild/src/Core/Nodes/SolutionNode.cs +END +ProcessNode.cs +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/ProcessNode.cs +END +FileNode.cs +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/Core/Nodes/FileNode.cs +END +DescriptionNode.cs +K 25 +svn:wc:ra_dav:version-url +V 75 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/DescriptionNode.cs +END +DatabaseReferenceNode.cs +K 25 +svn:wc:ra_dav:version-url +V 81 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs +END +ConfigurationNodeCollection.cs +K 25 +svn:wc:ra_dav:version-url +V 87 +/svnroot/dnpb/!svn/ver/315/trunk/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs +END +CleanupNode.cs +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/CleanupNode.cs +END +ExcludeNode.cs +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Nodes/ExcludeNode.cs +END +OptionsNode.cs +K 25 +svn:wc:ra_dav:version-url +V 71 +/svnroot/dnpb/!svn/ver/315/trunk/Prebuild/src/Core/Nodes/OptionsNode.cs +END +DatabaseProjectNode.cs +K 25 +svn:wc:ra_dav:version-url +V 79 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs +END +MatchNode.cs +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/dnpb/!svn/ver/318/trunk/Prebuild/src/Core/Nodes/MatchNode.cs +END +ReferenceNode.cs +K 25 +svn:wc:ra_dav:version-url +V 73 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Nodes/ReferenceNode.cs +END +FilesNode.cs +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/FilesNode.cs +END +AuthorNode.cs +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/AuthorNode.cs +END diff --git a/Prebuild/src/Core/Nodes/.svn/dir-prop-base b/Prebuild/src/Core/Nodes/.svn/dir-prop-base new file mode 100644 index 0000000000..a1989a0b6d --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/dir-prop-base @@ -0,0 +1,5 @@ +K 10 +svn:ignore +V 5 +*.swp +END diff --git a/Prebuild/src/Core/Nodes/.svn/entries b/Prebuild/src/Core/Nodes/.svn/entries new file mode 100644 index 0000000000..b60f190c46 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/entries @@ -0,0 +1,674 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Nodes +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2010-08-12T16:58:08.825470Z +321 +jhurliman +has-props + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +CleanFilesNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +c798b3c4167ec1a3815ddae93a552427 +2009-04-15T01:28:16.827957Z +307 +kunnis + + + + + + + + + + + + + + + + + + + + + +2666 + +ProjectNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +be9ade7048917117783a06508fa4d378 +2010-05-09T23:19:49.063286Z +319 +jhurliman +has-props + + + + + + + + + + + + + + + + + + + + +13444 + +ConfigurationNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +e42a548bfaba22cf94dbb203b2b28352 +2010-05-08T05:43:01.449559Z +316 +jhurliman +has-props + + + + + + + + + + + + + + + + + + + + +5222 + +DataNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +39b1d83bff018fce9f616ae2e6f1be82 +2010-08-12T16:58:08.825470Z +321 +jhurliman +has-props + + + + + + + + + + + + + + + + + + + + +3294 + +ReferencePathNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +409c91bafff2572218a6cdefcc6ec48c +2009-04-15T01:28:16.827957Z +307 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2677 + +SolutionNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +79bdf34c92682dc5ba8b5db15aaa95d6 +2009-06-06T19:47:31.451428Z +315 +dmoonfire +has-props + + + + + + + + + + + + + + + + + + + + +9720 + +ProcessNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +1816314797ef66235c58938b33ea2b3b +2009-04-15T01:28:16.827957Z +307 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2900 + +FileNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +43f98599da19618be6c6ed74f36fceae +2010-05-08T05:43:01.449559Z +316 +jhurliman +has-props + + + + + + + + + + + + + + + + + + + + +6043 + +DescriptionNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +3f8a8b8cc4b3a94b94109276ad2222d3 +2009-04-15T01:28:16.827957Z +307 +kunnis + + + + + + + + + + + + + + + + + + + + + +2493 + +DatabaseReferenceNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +4104ed953ae9105ac6498ce7882ed8ee +2009-02-19T06:47:52.218324Z +295 +kunnis + + + + + + + + + + + + + + + + + + + + + +2390 + +ConfigurationNodeCollection.cs +file + + + + +2010-09-10T22:51:44.000000Z +8620885fc85bdc06288acf6b8f58b3ff +2009-06-06T19:47:31.451428Z +315 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +2406 + +CleanupNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +198fb1e15cd545655978686277e39d96 +2009-04-15T01:28:16.827957Z +307 +kunnis + + + + + + + + + + + + + + + + + + + + + +2689 + +ExcludeNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +810fc73f537028052471239c72f41c11 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2608 + +OptionsNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +691dd5f7e7ce2a06814cdcae611fc40e +2009-06-06T19:47:31.451428Z +315 +dmoonfire +has-props + + + + + + + + + + + + + + + + + + + + +10949 + +DatabaseProjectNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +18995e6577e6bb3622fe41f5bfe01b48 +2009-04-15T01:28:16.827957Z +307 +kunnis + + + + + + + + + + + + + + + + + + + + + +2476 + +MatchNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +3344ef3bdb7db2006eb987a80128cd06 +2010-05-09T08:21:52.307305Z +318 +jhurliman +has-props + + + + + + + + + + + + + + + + + + + + +10846 + +ReferenceNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +18d76c27d53a4d54f16f57a855a21916 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +3705 + +FilesNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +e6ddefd5fff49958f77b5ef96f06c09e +2009-04-15T01:28:16.827957Z +307 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +6036 + +AuthorNode.cs +file + + + + +2010-09-10T22:51:44.000000Z +07607d8988fc1236ab8bef5fc12f8cd5 +2009-04-15T01:28:16.827957Z +307 +kunnis + + + + + + + + + + + + + + + + + + + + + +2425 + diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base new file mode 100644 index 0000000000..4c415bb6b1 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base @@ -0,0 +1,87 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Author")] + public class AuthorNode : DataNode + { + #region Fields + + private string m_Signature; + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public string Signature + { + get + { + return m_Signature; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Signature = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Signature == null) + { + m_Signature = ""; + } + + m_Signature = m_Signature.Trim(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base new file mode 100644 index 0000000000..dc2da9a3d4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base @@ -0,0 +1,80 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("CleanFiles")] + public class CleanFilesNode : DataNode + { + #region Fields + + private string m_Pattern; + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public string Pattern + { + get + { + return m_Pattern; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if (node == null) + { + throw new ArgumentNullException("node"); + } + + m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; + m_Pattern = m_Pattern.Trim(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base new file mode 100644 index 0000000000..a9b77eb105 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base @@ -0,0 +1,85 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; + +namespace Prebuild.Core.Nodes +{ + [DataNode("Cleanup")] + public class CleanupNode : DataNode + { + #region Fields + + private List m_CleanFiles = new List(); + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public List CleanFiles + { + get + { + return m_CleanFiles; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if (dataNode is CleanFilesNode) + { + m_CleanFiles.Add((CleanFilesNode)dataNode); + } + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base new file mode 100644 index 0000000000..cd2f740ae7 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base @@ -0,0 +1,225 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Configuration")] + public class ConfigurationNode : DataNode, ICloneable, IComparable + { + #region Fields + + private string m_Name = "unknown"; + private string m_Platform = "AnyCPU"; + private OptionsNode m_Options; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public ConfigurationNode() + { + m_Options = new OptionsNode(); + } + + #endregion + + #region Properties + + /// + /// Gets or sets the parent. + /// + /// The parent. + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + base.Parent = value; + if(base.Parent is SolutionNode) + { + SolutionNode node = (SolutionNode)base.Parent; + if(node != null && node.Options != null) + { + node.Options.CopyTo(m_Options); + } + } + } + } + + /// + /// Identifies the platform for this specific configuration. + /// + public string Platform + { + get + { + return m_Platform; + } + set + { + switch ((value + "").ToLower()) + { + case "x86": + case "x64": + m_Platform = value; + break; + case "itanium": + m_Platform = "Itanium"; + break; + default: + m_Platform = "AnyCPU"; + break; + } + } + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the name and platform for the configuration. + /// + /// The name and platform. + public string NameAndPlatform + { + get + { + string platform = m_Platform; + if (platform == "AnyCPU") + platform = "Any CPU"; + + return String.Format("{0}|{1}", m_Name, platform); + } + } + + /// + /// Gets or sets the options. + /// + /// The options. + public OptionsNode Options + { + get + { + return m_Options; + } + set + { + m_Options = value; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + Platform = Helper.AttributeValue(node, "platform", m_Platform); + + if (node == null) + { + throw new ArgumentNullException("node"); + } + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is OptionsNode) + { + ((OptionsNode)dataNode).CopyTo(m_Options); + } + } + } + + /// + /// Copies to. + /// + /// The conf. + public void CopyTo(ConfigurationNode conf) + { + m_Options.CopyTo(conf.m_Options); + } + + #endregion + + #region ICloneable Members + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + ConfigurationNode ret = new ConfigurationNode(); + ret.m_Name = m_Name; + ret.m_Platform = m_Platform; + m_Options.CopyTo(ret.m_Options); + return ret; + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ConfigurationNode that = (ConfigurationNode) obj; + return this.m_Name.CompareTo(that.m_Name); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base new file mode 100644 index 0000000000..7c59ac5050 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base @@ -0,0 +1,71 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System.Collections.Generic; + +namespace Prebuild.Core.Nodes +{ + /// + /// Implements a specialized list of configuration nodes which allows for lookup via + /// configuration name and platform. + /// + public class ConfigurationNodeCollection : List + { + #region Properties + + public ConfigurationNode this[string nameAndPlatform] + { + get + { + foreach (ConfigurationNode configurationNode in this) + { + if (configurationNode.NameAndPlatform == nameAndPlatform) + { + return configurationNode; + } + } + + return null; + } + + set + { + // See if the node + ConfigurationNode configurationNode = this[nameAndPlatform]; + + if (configurationNode != null) + { + this[IndexOf(configurationNode)] = value; + } + else + { + Add(value); + } + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base new file mode 100644 index 0000000000..318b13ccb9 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base @@ -0,0 +1,117 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using System.IO; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + public abstract class DataNode : IDataNode + { + #region Fields + + private IDataNode parent; + string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; + + #endregion + + #region IDataNode Members + + /// + /// Gets or sets the parent. + /// + /// The parent. + public virtual IDataNode Parent + { + get + { + return parent; + } + set + { + parent = value; + } + } + public string[] WebTypes + { + get { return m_WebTypes; } + } + /// + /// Parses the specified node. + /// + /// The node. + public virtual void Parse(XmlNode node) + { + } + public BuildAction GetBuildActionByFileName(string fileName) + { + string extension = Path.GetExtension(fileName).ToLower(); + foreach (string type in WebTypes) + { + if (extension == type) + return BuildAction.Content; + } + return BuildAction.Compile; + } + /// + /// Parses the file type to figure out what type it is + /// + /// + public SubType GetSubTypeByFileName(string fileName) + { + string extension = System.IO.Path.GetExtension(fileName).ToLower(); + string designer = String.Format(".designer{0}", extension); + string path = fileName.ToLower(); + if (extension == ".resx") + { + return SubType.Designer; + } + else if (path.EndsWith(".settings")) + { + return SubType.Settings; + } + else + { + + foreach (string type in WebTypes) + { + if (path.EndsWith(type)) + { + return SubType.CodeBehind; + } + } + } + return SubType.Code; + } + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base new file mode 100644 index 0000000000..20095c36de --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseProject")] + public class DatabaseProjectNode : DataNode + { + string name; + string path; + string fullpath; + Guid guid = Guid.NewGuid(); + readonly List authors = new List(); + readonly List references = new List(); + + public Guid Guid + { + get { return guid; } + } + + public string Name + { + get { return name; } + } + + public string Path + { + get { return path; } + } + + public string FullPath + { + get { return fullpath; } + } + + public IEnumerable References + { + get { return references; } + } + + public override void Parse(XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + path = Helper.AttributeValue(node, "path", name); + + try + { + fullpath = Helper.ResolvePath(path); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + + try + { + Helper.SetCurrentDir(fullpath); + + if (node == null) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + + if (dataNode == null) + continue; + + if (dataNode is AuthorNode) + authors.Add((AuthorNode)dataNode); + else if (dataNode is DatabaseReferenceNode) + references.Add((DatabaseReferenceNode)dataNode); + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base new file mode 100644 index 0000000000..97c3964b8e --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base @@ -0,0 +1,63 @@ +using System; +using Prebuild.Core.Attributes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseReference")] + public class DatabaseReferenceNode : DataNode + { + string name; + Guid providerId; + string connectionString; + + public string Name + { + get { return name; } + } + + public Guid ProviderId + { + get { return providerId; } + } + + public string ConnectionString + { + get { return connectionString; } + } + + public override void Parse(System.Xml.XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + + string providerName = Helper.AttributeValue(node, "providerName", string.Empty); + if (providerName != null) + { + switch (providerName) + { + // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* + // Not sure if these will help other operating systems, or if there's a better way. + case "Microsoft.SqlServerCe.Client.3.5": + providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; + case "System.Data.OleDb": + providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; + case "System.Data.OracleClient": + providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; + case "System.Data.SqlClient": + providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; + case "System.Data.Odbc": + providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; + + default: + throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); + } + } + else + providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); + + connectionString = Helper.AttributeValue(node, "connectionString", connectionString); + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base new file mode 100644 index 0000000000..d1293a0c80 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base @@ -0,0 +1,87 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// The object representing the /Prebuild/Solution/Project/Description element + /// + [DataNode("Description")] + public class DescriptionNode : DataNode + { + #region Fields + + private string m_Value; + + #endregion + + #region Properties + + /// + /// Gets the description Value. + /// + /// The description Value. + public string Value + { + get + { + return m_Value; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Value = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Value == null) + { + m_Value = ""; + } + + m_Value = m_Value.Trim(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base new file mode 100644 index 0000000000..7f04cba72f --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base @@ -0,0 +1,89 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Exclude")] + public class ExcludeNode : DataNode + { + #region Fields + + private string m_Pattern = ""; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Pattern; + } + } + + /// + /// Gets the pattern. + /// + /// The pattern. + public string Pattern + { + get + { + return m_Pattern; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); + m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base new file mode 100644 index 0000000000..01cea1ebdb --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base @@ -0,0 +1,285 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; +using Prebuild.Core.Targets; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + public enum BuildAction + { + /// + /// + /// + None, + /// + /// + /// + Compile, + /// + /// + /// + Content, + /// + /// + /// + EmbeddedResource, + /// + /// + /// + ApplicationDefinition, + /// + /// + /// + Page + } + + /// + /// + /// + public enum SubType + { + /// + /// + /// + Code, + /// + /// + /// + Component, + /// + /// + /// + Designer, + /// + /// + /// + Form, + /// + /// + /// + Settings, + /// + /// + /// + UserControl, + /// + /// + /// + CodeBehind, + } + + public enum CopyToOutput + { + Never, + Always, + PreserveNewest + } + + /// + /// + /// + [DataNode("File")] + public class FileNode : DataNode + { + #region Fields + + private string m_Path; + private string m_ResourceName = ""; + private BuildAction? m_BuildAction; + private bool m_Valid; + private SubType? m_SubType; + private CopyToOutput m_CopyToOutput = CopyToOutput.Never; + private bool m_Link = false; + private string m_LinkPath = string.Empty; + private bool m_PreservePath = false; + + + #endregion + + #region Properties + + /// + /// + /// + public string Path + { + get + { + return m_Path; + } + } + + /// + /// + /// + public string ResourceName + { + get + { + return m_ResourceName; + } + } + + /// + /// + /// + public BuildAction BuildAction + { + get + { + if (m_BuildAction != null) + return m_BuildAction.Value; + else + return GetBuildActionByFileName(this.Path); + + } + } + + public CopyToOutput CopyToOutput + { + get + { + return this.m_CopyToOutput; + } + } + + public bool IsLink + { + get + { + return this.m_Link; + } + } + + public string LinkPath + { + get + { + return this.m_LinkPath; + } + } + /// + /// + /// + public SubType SubType + { + get + { + if (m_SubType != null) + return m_SubType.Value; + else + return GetSubTypeByFileName(this.Path); + } + } + + /// + /// + /// + public bool IsValid + { + get + { + return m_Valid; + } + } + + /// + /// + /// + /// + /// + public bool PreservePath + { + get + { + return m_PreservePath; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + string subType = Helper.AttributeValue(node, "subType", string.Empty); + if (subType != String.Empty) + m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); + this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); + if ( this.m_Link == true ) + { + this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); + } + this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); + this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + m_Path = m_Path.Trim(); + m_Valid = true; + if(!File.Exists(m_Path)) + { + m_Valid = false; + Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); + } + + if (System.IO.Path.GetExtension(m_Path) == ".settings") + { + m_SubType = SubType.Settings; + m_BuildAction = BuildAction.None; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base new file mode 100644 index 0000000000..23a716cfde --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base @@ -0,0 +1,204 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using System.IO; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Files")] + public class FilesNode : DataNode + { + #region Fields + + private readonly List m_Files = new List(); + private readonly Dictionary m_BuildActions = new Dictionary(); + private readonly Dictionary m_SubTypes = new Dictionary(); + private readonly Dictionary m_ResourceNames = new Dictionary(); + private readonly Dictionary m_CopyToOutputs = new Dictionary(); + private readonly Dictionary m_Links = new Dictionary(); + private readonly Dictionary m_LinkPaths = new Dictionary(); + private readonly Dictionary m_PreservePaths = new Dictionary(); + + #endregion + + #region Properties + + public int Count + { + get + { + return m_Files.Count; + } + } + + #endregion + + #region Public Methods + + public BuildAction GetBuildAction(string file) + { + if(!m_BuildActions.ContainsKey(file)) + { + return BuildAction.Compile; + } + + return m_BuildActions[file]; + } + + public CopyToOutput GetCopyToOutput(string file) + { + if (!m_CopyToOutputs.ContainsKey(file)) + { + return CopyToOutput.Never; + } + return m_CopyToOutputs[file]; + } + + public bool GetIsLink(string file) + { + if (!m_Links.ContainsKey(file)) + { + return false; + } + return m_Links[file]; + } + + public bool Contains(string file) + { + return m_Files.Contains(file); + } + + public string GetLinkPath( string file ) + { + if ( !m_LinkPaths.ContainsKey( file ) ) + { + return string.Empty; + } + return m_LinkPaths[ file ]; + } + + public SubType GetSubType(string file) + { + if(!m_SubTypes.ContainsKey(file)) + { + return SubType.Code; + } + + return m_SubTypes[file]; + } + + public string GetResourceName(string file) + { + if(!m_ResourceNames.ContainsKey(file)) + { + return string.Empty; + } + + return m_ResourceNames[file]; + } + + public bool GetPreservePath( string file ) + { + if ( !m_PreservePaths.ContainsKey( file ) ) + { + return false; + } + + return m_PreservePaths[ file ]; + } + + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is FileNode) + { + FileNode fileNode = (FileNode)dataNode; + if(fileNode.IsValid) + { + if (!m_Files.Contains(fileNode.Path)) + { + m_Files.Add(fileNode.Path); + m_BuildActions[fileNode.Path] = fileNode.BuildAction; + m_SubTypes[fileNode.Path] = fileNode.SubType; + m_ResourceNames[fileNode.Path] = fileNode.ResourceName; + m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; + m_Links[ fileNode.Path ] = fileNode.IsLink; + m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; + m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; + + } + } + } + else if(dataNode is MatchNode) + { + foreach(string file in ((MatchNode)dataNode).Files) + { + MatchNode matchNode = (MatchNode)dataNode; + if (!m_Files.Contains(file)) + { + m_Files.Add(file); + if (matchNode.BuildAction == null) + m_BuildActions[file] = GetBuildActionByFileName(file); + else + m_BuildActions[file] = matchNode.BuildAction.Value; + m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; + m_ResourceNames[ file ] = matchNode.ResourceName; + m_PreservePaths[ file ] = matchNode.PreservePath; + m_Links[ file ] = matchNode.IsLink; + m_LinkPaths[ file ] = matchNode.LinkPath; + m_CopyToOutputs[ file ] = matchNode.CopyToOutput; + + } + } + } + } + } + + // TODO: Check in to why StringCollection's enumerator doesn't implement + // IEnumerator? + public IEnumerator GetEnumerator() + { + return m_Files.GetEnumerator(); + } + + #endregion + + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base new file mode 100644 index 0000000000..9735265f05 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base @@ -0,0 +1,367 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Match")] + public class MatchNode : DataNode + { + #region Fields + + private readonly List m_Files = new List(); + private Regex m_Regex; + private BuildAction? m_BuildAction; + private SubType? m_SubType; + string m_ResourceName = ""; + private CopyToOutput m_CopyToOutput; + private bool m_Link; + private string m_LinkPath; + private bool m_PreservePath; + private readonly List m_Exclusions = new List(); + + #endregion + + #region Properties + + /// + /// + /// + public IEnumerable Files + { + get + { + return m_Files; + } + } + + /// + /// + /// + public BuildAction? BuildAction + { + get + { + return m_BuildAction; + } + } + + /// + /// + /// + public SubType? SubType + { + get + { + return m_SubType; + } + } + + public CopyToOutput CopyToOutput + { + get + { + return m_CopyToOutput; + } + } + + public bool IsLink + { + get + { + return m_Link; + } + } + + public string LinkPath + { + get + { + return m_LinkPath; + } + } + /// + /// + /// + public string ResourceName + { + get + { + return m_ResourceName; + } + } + + public bool PreservePath + { + get + { + return m_PreservePath; + } + } + + #endregion + + #region Private Methods + + /// + /// Recurses the directories. + /// + /// The path. + /// The pattern. + /// if set to true [recurse]. + /// if set to true [use regex]. + private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List exclusions) + { + Match match; + try + { + string[] files; + + Boolean excludeFile; + if(!useRegex) + { + try + { + files = Directory.GetFiles(path, pattern); + } + catch (IOException) + { + // swallow weird IOException error when running in a virtual box + // guest OS on a network share when the host OS is not Windows. + // This seems to happen on network shares + // when no files match, and may be related to this report: + // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=254546 + + files = null; + } + + if(files != null) + { + foreach (string file in files) + { + excludeFile = false; + string fileTemp; + if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") + { + fileTemp = file.Substring(2); + } + else + { + fileTemp = file; + } + + // Check all excludions and set flag if there are any hits. + foreach ( ExcludeNode exclude in exclusions ) + { + Regex exRegEx = new Regex( exclude.Pattern ); + match = exRegEx.Match( file ); + excludeFile |= match.Success; + } + + if ( !excludeFile ) + { + m_Files.Add( fileTemp ); + } + + } + } + + // don't call return here, because we may need to recursively search directories below + // this one, even if no matches were found in this directory. + } + else + { + try + { + files = Directory.GetFiles(path); + } + catch (IOException) + { + // swallow weird IOException error when running in a virtual box + // guest OS on a network share. + files = null; + } + + if (files != null) + { + foreach (string file in files) + { + excludeFile = false; + + match = m_Regex.Match(file); + if (match.Success) + { + // Check all excludions and set flag if there are any hits. + foreach (ExcludeNode exclude in exclusions) + { + Regex exRegEx = new Regex(exclude.Pattern); + match = exRegEx.Match(file); + excludeFile |= !match.Success; + } + + if (!excludeFile) + { + m_Files.Add(file); + } + } + } + } + } + + if(recurse) + { + string[] dirs = Directory.GetDirectories(path); + if(dirs != null && dirs.Length > 0) + { + foreach (string str in dirs) + { + // hack to skip subversion folders. Not having this can cause + // a significant performance hit when running on a network drive. + if (str.EndsWith(".svn")) + continue; + + RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); + } + } + } + } + catch(DirectoryNotFoundException) + { + return; + } + catch(ArgumentException) + { + return; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + string path = Helper.AttributeValue(node, "path", "."); + string pattern = Helper.AttributeValue(node, "pattern", "*"); + bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); + bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + + //TODO: Figure out where the subtype node is being assigned + //string subType = Helper.AttributeValue(node, "subType", string.Empty); + //if (subType != String.Empty) + // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName); + m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", m_CopyToOutput.ToString())); + m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); + if ( m_Link ) + { + m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); + } + m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + + + if(path != null && path.Length == 0) + { + path = ".";//use current directory + } + //throw new WarningException("Match must have a 'path' attribute"); + + if(pattern == null) + { + throw new WarningException("Match must have a 'pattern' attribute"); + } + + path = Helper.NormalizePath(path); + if(!Directory.Exists(path)) + { + throw new WarningException("Match path does not exist: {0}", path); + } + + try + { + if(useRegex) + { + m_Regex = new Regex(pattern); + } + } + catch(ArgumentException ex) + { + throw new WarningException("Could not compile regex pattern: {0}", ex.Message); + } + + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is ExcludeNode) + { + ExcludeNode excludeNode = (ExcludeNode)dataNode; + m_Exclusions.Add( excludeNode ); + } + } + + RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); + + if (m_Files.Count < 1) + { + // Include the project name when the match node returns no matches to provide extra + // debug info. + ProjectNode project = Parent.Parent as ProjectNode; + string projectName = ""; + + if (project != null) + projectName = " in project " + project.AssemblyName; + + throw new WarningException("Match" + projectName + " returned no files: {0}{1}", Helper.EndPath(path), pattern); + } + m_Regex = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base new file mode 100644 index 0000000000..577de710ed --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base @@ -0,0 +1,634 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Options")] + public class OptionsNode : DataNode + { + #region Fields + + private static readonly Dictionary m_OptionFields = new Dictionary(); + + [OptionNode("CompilerDefines")] + private string m_CompilerDefines = ""; + + /// + /// + /// + public string CompilerDefines + { + get + { + return m_CompilerDefines; + } + set + { + m_CompilerDefines = value; + } + } + + [OptionNode("OptimizeCode")] + private bool m_OptimizeCode; + + /// + /// + /// + public bool OptimizeCode + { + get + { + return m_OptimizeCode; + } + set + { + m_OptimizeCode = value; + } + } + + [OptionNode("CheckUnderflowOverflow")] + private bool m_CheckUnderflowOverflow; + + /// + /// + /// + public bool CheckUnderflowOverflow + { + get + { + return m_CheckUnderflowOverflow; + } + set + { + m_CheckUnderflowOverflow = value; + } + } + + [OptionNode("AllowUnsafe")] + private bool m_AllowUnsafe; + + /// + /// + /// + public bool AllowUnsafe + { + get + { + return m_AllowUnsafe; + } + set + { + m_AllowUnsafe = value; + } + } + + [OptionNode("PreBuildEvent")] + private string m_PreBuildEvent; + + /// + /// + /// + public string PreBuildEvent + { + get + { + return m_PreBuildEvent; + } + set + { + m_PreBuildEvent = value; + } + } + + [OptionNode("PostBuildEvent")] + private string m_PostBuildEvent; + + /// + /// + /// + public string PostBuildEvent + { + get + { + return m_PostBuildEvent; + } + set + { + m_PostBuildEvent = value; + } + } + + [OptionNode("PreBuildEventArgs")] + private string m_PreBuildEventArgs; + + /// + /// + /// + public string PreBuildEventArgs + { + get + { + return m_PreBuildEventArgs; + } + set + { + m_PreBuildEventArgs = value; + } + } + + [OptionNode("PostBuildEventArgs")] + private string m_PostBuildEventArgs; + + /// + /// + /// + public string PostBuildEventArgs + { + get + { + return m_PostBuildEventArgs; + } + set + { + m_PostBuildEventArgs = value; + } + } + + [OptionNode("RunPostBuildEvent")] + private string m_RunPostBuildEvent; + + /// + /// + /// + public string RunPostBuildEvent + { + get + { + return m_RunPostBuildEvent; + } + set + { + m_RunPostBuildEvent = value; + } + } + + [OptionNode("RunScript")] + private string m_RunScript; + + /// + /// + /// + public string RunScript + { + get + { + return m_RunScript; + } + set + { + m_RunScript = value; + } + } + + [OptionNode("WarningLevel")] + private int m_WarningLevel = 4; + + /// + /// + /// + public int WarningLevel + { + get + { + return m_WarningLevel; + } + set + { + m_WarningLevel = value; + } + } + + [OptionNode("WarningsAsErrors")] + private bool m_WarningsAsErrors; + + /// + /// + /// + public bool WarningsAsErrors + { + get + { + return m_WarningsAsErrors; + } + set + { + m_WarningsAsErrors = value; + } + } + + [OptionNode("SuppressWarnings")] + private string m_SuppressWarnings = ""; + + /// + /// + /// + public string SuppressWarnings + { + get + { + return m_SuppressWarnings; + } + set + { + m_SuppressWarnings = value; + } + } + + [OptionNode("OutputPath")] + private string m_OutputPath = "bin/"; + + /// + /// + /// + public string OutputPath + { + get + { + return m_OutputPath; + } + set + { + m_OutputPath = value; + } + } + + [OptionNode("GenerateDocumentation")] + private bool m_GenerateDocumentation; + + /// + /// + /// + public bool GenerateDocumentation + { + get + { + return m_GenerateDocumentation; + } + set + { + m_GenerateDocumentation = value; + } + } + + [OptionNode("GenerateXmlDocFile")] + private bool m_GenerateXmlDocFile; + + /// + /// + /// + public bool GenerateXmlDocFile + { + get + { + return m_GenerateXmlDocFile; + } + set + { + m_GenerateXmlDocFile = value; + } + } + + [OptionNode("XmlDocFile")] + private string m_XmlDocFile = ""; + + /// + /// + /// + public string XmlDocFile + { + get + { + return m_XmlDocFile; + } + set + { + m_XmlDocFile = value; + } + } + + [OptionNode("KeyFile")] + private string m_KeyFile = ""; + + /// + /// + /// + public string KeyFile + { + get + { + return m_KeyFile; + } + set + { + m_KeyFile = value; + } + } + + [OptionNode("DebugInformation")] + private bool m_DebugInformation; + + /// + /// + /// + public bool DebugInformation + { + get + { + return m_DebugInformation; + } + set + { + m_DebugInformation = value; + } + } + + [OptionNode("RegisterComInterop")] + private bool m_RegisterComInterop; + + /// + /// + /// + public bool RegisterComInterop + { + get + { + return m_RegisterComInterop; + } + set + { + m_RegisterComInterop = value; + } + } + + [OptionNode("RemoveIntegerChecks")] + private bool m_RemoveIntegerChecks; + + /// + /// + /// + public bool RemoveIntegerChecks + { + get + { + return m_RemoveIntegerChecks; + } + set + { + m_RemoveIntegerChecks = value; + } + } + + [OptionNode("IncrementalBuild")] + private bool m_IncrementalBuild; + + /// + /// + /// + public bool IncrementalBuild + { + get + { + return m_IncrementalBuild; + } + set + { + m_IncrementalBuild = value; + } + } + + [OptionNode("BaseAddress")] + private string m_BaseAddress = "285212672"; + + /// + /// + /// + public string BaseAddress + { + get + { + return m_BaseAddress; + } + set + { + m_BaseAddress = value; + } + } + + [OptionNode("FileAlignment")] + private int m_FileAlignment = 4096; + + /// + /// + /// + public int FileAlignment + { + get + { + return m_FileAlignment; + } + set + { + m_FileAlignment = value; + } + } + + [OptionNode("NoStdLib")] + private bool m_NoStdLib; + + /// + /// + /// + public bool NoStdLib + { + get + { + return m_NoStdLib; + } + set + { + m_NoStdLib = value; + } + } + + private readonly List m_FieldsDefined = new List(); + + #endregion + + #region Constructors + + /// + /// Initializes the class. + /// + static OptionsNode() + { + Type t = typeof(OptionsNode); + + foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) + { + object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); + if(attrs == null || attrs.Length < 1) + { + continue; + } + + OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; + m_OptionFields[ona.NodeName] = f; + } + } + + #endregion + + #region Properties + + /// + /// Gets the at the specified index. + /// + /// + public object this[string index] + { + get + { + if(!m_OptionFields.ContainsKey(index)) + { + return null; + } + + FieldInfo f = m_OptionFields[index]; + return f.GetValue(this); + } + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[string index, object defaultValue] + { + get + { + object valueObject = this[index]; + if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) + { + return defaultValue; + } + return valueObject; + } + } + + + #endregion + + #region Private Methods + + private void FlagDefined(string name) + { + if(!m_FieldsDefined.Contains(name)) + { + m_FieldsDefined.Add(name); + } + } + + private void SetOption(string nodeName, string val) + { + lock(m_OptionFields) + { + if(!m_OptionFields.ContainsKey(nodeName)) + { + return; + } + + FieldInfo f = m_OptionFields[nodeName]; + f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); + FlagDefined(f.Name); + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); + } + } + + /// + /// Copies to. + /// + /// The opt. + public void CopyTo(OptionsNode opt) + { + if(opt == null) + { + return; + } + + foreach(FieldInfo f in m_OptionFields.Values) + { + if(m_FieldsDefined.Contains(f.Name)) + { + f.SetValue(opt, f.GetValue(this)); + opt.m_FieldsDefined.Add(f.Name); + } + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base new file mode 100644 index 0000000000..8ca8e493d2 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base @@ -0,0 +1,108 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Process")] + public class ProcessNode : DataNode + { + #region Fields + + private string m_Path; + private bool m_IsValid = true; + + #endregion + + #region Properties + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets a value indicating whether this instance is valid. + /// + /// true if this instance is valid; otherwise, false. + public bool IsValid + { + get + { + return m_IsValid; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + try + { + m_Path = Helper.ResolvePath(m_Path); + } + catch(ArgumentException) + { + Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); + m_IsValid = false; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base new file mode 100644 index 0000000000..fb92b32e73 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base @@ -0,0 +1,579 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// A set of values that the Project's type can be + /// + public enum ProjectType + { + /// + /// The project is a console executable + /// + Exe, + /// + /// The project is a windows executable + /// + WinExe, + /// + /// The project is a library + /// + Library, + /// + /// The project is a website + /// + Web, + } + + /// + /// + /// + public enum ClrRuntime + { + /// + /// + /// + Microsoft, + /// + /// + /// + Mono + } + /// + /// The version of the .NET framework to use (Required for VS2008) + /// We don't need .NET 1.1 in here, it'll default when using vs2003. + /// + public enum FrameworkVersion + { + /// + /// .NET 2.0 + /// + v2_0, + /// + /// .NET 3.0 + /// + v3_0, + /// + /// .NET 3.5 + /// + v3_5, + /// + /// .NET 4.0 + /// + v4_0, + } + /// + /// The Node object representing /Prebuild/Solution/Project elements + /// + [DataNode("Project")] + public class ProjectNode : DataNode, IComparable + { + #region Fields + + private string m_Name = "unknown"; + private string m_Path = ""; + private string m_FullPath = ""; + private string m_AssemblyName; + private string m_AppIcon = ""; + private string m_ConfigFile = ""; + private string m_DesignerFolder = ""; + private string m_Language = "C#"; + private ProjectType m_Type = ProjectType.Exe; + private ClrRuntime m_Runtime = ClrRuntime.Microsoft; + private FrameworkVersion m_Framework = FrameworkVersion.v2_0; + private string m_StartupObject = ""; + private string m_RootNamespace; + private string m_FilterGroups = ""; + private string m_Version = ""; + private Guid m_Guid; + private string m_DebugStartParameters; + + private readonly Dictionary m_Configurations = new Dictionary(); + private readonly List m_ReferencePaths = new List(); + private readonly List m_References = new List(); + private readonly List m_Authors = new List(); + private FilesNode m_Files; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + /// + /// The version of the .NET Framework to compile under + /// + public FrameworkVersion FrameworkVersion + { + get + { + return m_Framework; + } + } + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets the filter groups. + /// + /// The filter groups. + public string FilterGroups + { + get + { + return m_FilterGroups; + } + } + + /// + /// Gets the project's version + /// + /// The project's version. + public string Version + { + get + { + return m_Version; + } + } + + /// + /// Gets the full path. + /// + /// The full path. + public string FullPath + { + get + { + return m_FullPath; + } + } + + /// + /// Gets the name of the assembly. + /// + /// The name of the assembly. + public string AssemblyName + { + get + { + return m_AssemblyName; + } + } + + /// + /// Gets the app icon. + /// + /// The app icon. + public string AppIcon + { + get + { + return m_AppIcon; + } + } + + /// + /// Gets the app icon. + /// + /// The app icon. + public string ConfigFile + { + get + { + return m_ConfigFile; + } + } + + /// + /// + /// + public string DesignerFolder + { + get + { + return m_DesignerFolder; + } + } + + /// + /// Gets the language. + /// + /// The language. + public string Language + { + get + { + return m_Language; + } + } + + /// + /// Gets the type. + /// + /// The type. + public ProjectType Type + { + get + { + return m_Type; + } + } + + /// + /// Gets the runtime. + /// + /// The runtime. + public ClrRuntime Runtime + { + get + { + return m_Runtime; + } + } + + private bool m_GenerateAssemblyInfoFile; + + /// + /// + /// + public bool GenerateAssemblyInfoFile + { + get + { + return m_GenerateAssemblyInfoFile; + } + set + { + m_GenerateAssemblyInfoFile = value; + } + } + + /// + /// Gets the startup object. + /// + /// The startup object. + public string StartupObject + { + get + { + return m_StartupObject; + } + } + + /// + /// Gets the root namespace. + /// + /// The root namespace. + public string RootNamespace + { + get + { + return m_RootNamespace; + } + } + + /// + /// Gets the configurations. + /// + /// The configurations. + public List Configurations + { + get + { + List tmp = new List(ConfigurationsTable.Values); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the configurations table. + /// + /// The configurations table. + public Dictionary ConfigurationsTable + { + get + { + return m_Configurations; + } + } + + /// + /// Gets the reference paths. + /// + /// The reference paths. + public List ReferencePaths + { + get + { + List tmp = new List(m_ReferencePaths); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the references. + /// + /// The references. + public List References + { + get + { + List tmp = new List(m_References); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the Authors list. + /// + /// The list of the project's authors. + public List Authors + { + get + { + return m_Authors; + } + } + + /// + /// Gets the files. + /// + /// The files. + public FilesNode Files + { + get + { + return m_Files; + } + } + + /// + /// Gets or sets the parent. + /// + /// The parent. + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + base.Parent = value; + if(base.Parent is SolutionNode && m_Configurations.Count < 1) + { + SolutionNode parent = (SolutionNode)base.Parent; + foreach(ConfigurationNode conf in parent.Configurations) + { + m_Configurations[conf.NameAndPlatform] = (ConfigurationNode) conf.Clone(); + } + } + } + } + + /// + /// Gets the GUID. + /// + /// The GUID. + public Guid Guid + { + get + { + return m_Guid; + } + } + + public string DebugStartParameters + { + get + { + return m_DebugStartParameters; + } + } + + #endregion + + #region Private Methods + + private void HandleConfiguration(ConfigurationNode conf) + { + if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, + //so it *may* override changes to the same properties for configurations defines at the project level + { + foreach(ConfigurationNode confNode in m_Configurations.Values) + { + conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides + } + } + if(m_Configurations.ContainsKey(conf.NameAndPlatform)) + { + ConfigurationNode parentConf = m_Configurations[conf.NameAndPlatform]; + conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides + } + else + { + m_Configurations[conf.NameAndPlatform] = conf; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); + m_Version = Helper.AttributeValue(node, "version", m_Version); + m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); + m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); + m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); + m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); + m_Language = Helper.AttributeValue(node, "language", m_Language); + m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); + m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); + m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); + m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); + m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); + + int hash = m_Name.GetHashCode(); + Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString()); + m_Guid = new Guid(guid); + + m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); + m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty); + + if(string.IsNullOrEmpty(m_AssemblyName)) + { + m_AssemblyName = m_Name; + } + + if(string.IsNullOrEmpty(m_RootNamespace)) + { + m_RootNamespace = m_Name; + } + + m_FullPath = m_Path; + try + { + m_FullPath = Helper.ResolvePath(m_FullPath); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", m_Path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + try + { + Helper.SetCurrentDir(m_FullPath); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is ConfigurationNode) + { + HandleConfiguration((ConfigurationNode)dataNode); + } + else if(dataNode is ReferencePathNode) + { + m_ReferencePaths.Add((ReferencePathNode)dataNode); + } + else if(dataNode is ReferenceNode) + { + m_References.Add((ReferenceNode)dataNode); + } + else if(dataNode is AuthorNode) + { + m_Authors.Add((AuthorNode)dataNode); + } + else if(dataNode is FilesNode) + { + m_Files = (FilesNode)dataNode; + } + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ProjectNode that = (ProjectNode)obj; + return m_Name.CompareTo(that.m_Name); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base new file mode 100644 index 0000000000..9c5d1a3491 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base @@ -0,0 +1,144 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Reference")] + public class ReferenceNode : DataNode, IComparable + { + #region Fields + + private string m_Name = "unknown"; + private string m_Path; + private string m_LocalCopy; + private string m_Version; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets a value indicating whether [local copy specified]. + /// + /// true if [local copy specified]; otherwise, false. + public bool LocalCopySpecified + { + get + { + return ( m_LocalCopy != null && m_LocalCopy.Length == 0); + } + } + + /// + /// Gets a value indicating whether [local copy]. + /// + /// true if [local copy]; otherwise, false. + public bool LocalCopy + { + get + { + if( m_LocalCopy == null) + { + return false; + } + return bool.Parse(m_LocalCopy); + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return m_Version; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); + m_Version = Helper.AttributeValue(node, "version", m_Version); + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ReferenceNode that = (ReferenceNode)obj; + return this.m_Name.CompareTo(that.m_Name); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base new file mode 100644 index 0000000000..7331cd7b58 --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base @@ -0,0 +1,97 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("ReferencePath")] + public class ReferencePathNode : DataNode, IComparable + { + #region Fields + + private string m_Path; + + #endregion + + #region Properties + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + m_Path = m_Path.Trim(); + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ReferencePathNode that = (ReferencePathNode)obj; + return this.m_Path.CompareTo(that.m_Path); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base new file mode 100644 index 0000000000..10c02234da --- /dev/null +++ b/Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base @@ -0,0 +1,382 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Solution")] + [DataNode("EmbeddedSolution")] + [DebuggerDisplay("{Name}")] + public class SolutionNode : DataNode + { + #region Fields + + private Guid m_Guid = Guid.NewGuid(); + private string m_Name = "unknown"; + private string m_Path = ""; + private string m_FullPath = ""; + private string m_ActiveConfig; + private string m_Version = "1.0.0"; + + private OptionsNode m_Options; + private FilesNode m_Files; + private readonly ConfigurationNodeCollection m_Configurations = new ConfigurationNodeCollection(); + private readonly Dictionary m_Projects = new Dictionary(); + private readonly Dictionary m_DatabaseProjects = new Dictionary(); + private readonly List m_ProjectsOrder = new List(); + private readonly Dictionary m_Solutions = new Dictionary(); + private CleanupNode m_Cleanup; + + #endregion + + #region Properties + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + if (value is SolutionNode) + { + SolutionNode solution = (SolutionNode)value; + foreach (ConfigurationNode conf in solution.Configurations) + { + m_Configurations[conf.Name] = (ConfigurationNode) conf.Clone(); + } + } + + base.Parent = value; + } + } + + public CleanupNode Cleanup + { + get + { + return m_Cleanup; + } + set + { + m_Cleanup = value; + } + } + + public Guid Guid + { + get + { + return m_Guid; + } + set + { + m_Guid = value; + } + } + /// + /// Gets or sets the active config. + /// + /// The active config. + public string ActiveConfig + { + get + { + return m_ActiveConfig; + } + set + { + m_ActiveConfig = value; + } + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets the full path. + /// + /// The full path. + public string FullPath + { + get + { + return m_FullPath; + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return m_Version; + } + } + + /// + /// Gets the options. + /// + /// The options. + public OptionsNode Options + { + get + { + return m_Options; + } + } + + /// + /// Gets the files. + /// + /// The files. + public FilesNode Files + { + get + { + return m_Files; + } + } + + /// + /// Gets the configurations. + /// + /// The configurations. + public ConfigurationNodeCollection Configurations + { + get + { + ConfigurationNodeCollection tmp = new ConfigurationNodeCollection(); + tmp.AddRange(ConfigurationsTable); + return tmp; + } + } + + /// + /// Gets the configurations table. + /// + /// The configurations table. + public ConfigurationNodeCollection ConfigurationsTable + { + get + { + return m_Configurations; + } + } + /// + /// Gets the database projects. + /// + public ICollection DatabaseProjects + { + get + { + return m_DatabaseProjects.Values; + } + } + /// + /// Gets the nested solutions. + /// + public ICollection Solutions + { + get + { + return m_Solutions.Values; + } + } + /// + /// Gets the nested solutions hash table. + /// + public Dictionary SolutionsTable + { + get + { + return m_Solutions; + } + } + /// + /// Gets the projects. + /// + /// The projects. + public ICollection Projects + { + get + { + List tmp = new List(m_Projects.Values); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the projects table. + /// + /// The projects table. + public Dictionary ProjectsTable + { + get + { + return m_Projects; + } + } + + /// + /// Gets the projects table. + /// + /// The projects table. + public List ProjectsTableOrder + { + get + { + return m_ProjectsOrder; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_Version = Helper.AttributeValue(node, "version", m_Version); + + m_FullPath = m_Path; + try + { + m_FullPath = Helper.ResolvePath(m_FullPath); + } + catch + { + throw new WarningException("Could not resolve solution path: {0}", m_Path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + try + { + Helper.SetCurrentDir(m_FullPath); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is OptionsNode) + { + m_Options = (OptionsNode)dataNode; + } + else if(dataNode is FilesNode) + { + m_Files = (FilesNode)dataNode; + } + else if(dataNode is ConfigurationNode) + { + ConfigurationNode configurationNode = (ConfigurationNode) dataNode; + m_Configurations[configurationNode.NameAndPlatform] = configurationNode; + + // If the active configuration is null, then we populate it. + if (ActiveConfig == null) + { + ActiveConfig = configurationNode.Name; + } + } + else if(dataNode is ProjectNode) + { + m_Projects[((ProjectNode)dataNode).Name] = (ProjectNode) dataNode; + m_ProjectsOrder.Add((ProjectNode)dataNode); + } + else if(dataNode is SolutionNode) + { + m_Solutions[((SolutionNode)dataNode).Name] = (SolutionNode) dataNode; + } + else if (dataNode is ProcessNode) + { + ProcessNode p = (ProcessNode)dataNode; + Kernel.Instance.ProcessFile(p, this); + } + else if (dataNode is DatabaseProjectNode) + { + m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = (DatabaseProjectNode) dataNode; + } + else if(dataNode is CleanupNode) + { + if(m_Cleanup != null) + throw new WarningException("There can only be one Cleanup node."); + m_Cleanup = (CleanupNode)dataNode; + } + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/AuthorNode.cs b/Prebuild/src/Core/Nodes/AuthorNode.cs new file mode 100644 index 0000000000..4c415bb6b1 --- /dev/null +++ b/Prebuild/src/Core/Nodes/AuthorNode.cs @@ -0,0 +1,87 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Author")] + public class AuthorNode : DataNode + { + #region Fields + + private string m_Signature; + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public string Signature + { + get + { + return m_Signature; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Signature = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Signature == null) + { + m_Signature = ""; + } + + m_Signature = m_Signature.Trim(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/CleanFilesNode.cs b/Prebuild/src/Core/Nodes/CleanFilesNode.cs new file mode 100644 index 0000000000..dc2da9a3d4 --- /dev/null +++ b/Prebuild/src/Core/Nodes/CleanFilesNode.cs @@ -0,0 +1,80 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("CleanFiles")] + public class CleanFilesNode : DataNode + { + #region Fields + + private string m_Pattern; + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public string Pattern + { + get + { + return m_Pattern; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if (node == null) + { + throw new ArgumentNullException("node"); + } + + m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; + m_Pattern = m_Pattern.Trim(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/CleanupNode.cs b/Prebuild/src/Core/Nodes/CleanupNode.cs new file mode 100644 index 0000000000..a9b77eb105 --- /dev/null +++ b/Prebuild/src/Core/Nodes/CleanupNode.cs @@ -0,0 +1,85 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; + +namespace Prebuild.Core.Nodes +{ + [DataNode("Cleanup")] + public class CleanupNode : DataNode + { + #region Fields + + private List m_CleanFiles = new List(); + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public List CleanFiles + { + get + { + return m_CleanFiles; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if (dataNode is CleanFilesNode) + { + m_CleanFiles.Add((CleanFilesNode)dataNode); + } + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/ConfigurationNode.cs b/Prebuild/src/Core/Nodes/ConfigurationNode.cs new file mode 100644 index 0000000000..cd2f740ae7 --- /dev/null +++ b/Prebuild/src/Core/Nodes/ConfigurationNode.cs @@ -0,0 +1,225 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Configuration")] + public class ConfigurationNode : DataNode, ICloneable, IComparable + { + #region Fields + + private string m_Name = "unknown"; + private string m_Platform = "AnyCPU"; + private OptionsNode m_Options; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public ConfigurationNode() + { + m_Options = new OptionsNode(); + } + + #endregion + + #region Properties + + /// + /// Gets or sets the parent. + /// + /// The parent. + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + base.Parent = value; + if(base.Parent is SolutionNode) + { + SolutionNode node = (SolutionNode)base.Parent; + if(node != null && node.Options != null) + { + node.Options.CopyTo(m_Options); + } + } + } + } + + /// + /// Identifies the platform for this specific configuration. + /// + public string Platform + { + get + { + return m_Platform; + } + set + { + switch ((value + "").ToLower()) + { + case "x86": + case "x64": + m_Platform = value; + break; + case "itanium": + m_Platform = "Itanium"; + break; + default: + m_Platform = "AnyCPU"; + break; + } + } + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the name and platform for the configuration. + /// + /// The name and platform. + public string NameAndPlatform + { + get + { + string platform = m_Platform; + if (platform == "AnyCPU") + platform = "Any CPU"; + + return String.Format("{0}|{1}", m_Name, platform); + } + } + + /// + /// Gets or sets the options. + /// + /// The options. + public OptionsNode Options + { + get + { + return m_Options; + } + set + { + m_Options = value; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + Platform = Helper.AttributeValue(node, "platform", m_Platform); + + if (node == null) + { + throw new ArgumentNullException("node"); + } + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is OptionsNode) + { + ((OptionsNode)dataNode).CopyTo(m_Options); + } + } + } + + /// + /// Copies to. + /// + /// The conf. + public void CopyTo(ConfigurationNode conf) + { + m_Options.CopyTo(conf.m_Options); + } + + #endregion + + #region ICloneable Members + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + ConfigurationNode ret = new ConfigurationNode(); + ret.m_Name = m_Name; + ret.m_Platform = m_Platform; + m_Options.CopyTo(ret.m_Options); + return ret; + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ConfigurationNode that = (ConfigurationNode) obj; + return this.m_Name.CompareTo(that.m_Name); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs new file mode 100644 index 0000000000..7c59ac5050 --- /dev/null +++ b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs @@ -0,0 +1,71 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System.Collections.Generic; + +namespace Prebuild.Core.Nodes +{ + /// + /// Implements a specialized list of configuration nodes which allows for lookup via + /// configuration name and platform. + /// + public class ConfigurationNodeCollection : List + { + #region Properties + + public ConfigurationNode this[string nameAndPlatform] + { + get + { + foreach (ConfigurationNode configurationNode in this) + { + if (configurationNode.NameAndPlatform == nameAndPlatform) + { + return configurationNode; + } + } + + return null; + } + + set + { + // See if the node + ConfigurationNode configurationNode = this[nameAndPlatform]; + + if (configurationNode != null) + { + this[IndexOf(configurationNode)] = value; + } + else + { + Add(value); + } + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/DataNode.cs b/Prebuild/src/Core/Nodes/DataNode.cs new file mode 100644 index 0000000000..318b13ccb9 --- /dev/null +++ b/Prebuild/src/Core/Nodes/DataNode.cs @@ -0,0 +1,117 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using System.IO; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + public abstract class DataNode : IDataNode + { + #region Fields + + private IDataNode parent; + string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; + + #endregion + + #region IDataNode Members + + /// + /// Gets or sets the parent. + /// + /// The parent. + public virtual IDataNode Parent + { + get + { + return parent; + } + set + { + parent = value; + } + } + public string[] WebTypes + { + get { return m_WebTypes; } + } + /// + /// Parses the specified node. + /// + /// The node. + public virtual void Parse(XmlNode node) + { + } + public BuildAction GetBuildActionByFileName(string fileName) + { + string extension = Path.GetExtension(fileName).ToLower(); + foreach (string type in WebTypes) + { + if (extension == type) + return BuildAction.Content; + } + return BuildAction.Compile; + } + /// + /// Parses the file type to figure out what type it is + /// + /// + public SubType GetSubTypeByFileName(string fileName) + { + string extension = System.IO.Path.GetExtension(fileName).ToLower(); + string designer = String.Format(".designer{0}", extension); + string path = fileName.ToLower(); + if (extension == ".resx") + { + return SubType.Designer; + } + else if (path.EndsWith(".settings")) + { + return SubType.Settings; + } + else + { + + foreach (string type in WebTypes) + { + if (path.EndsWith(type)) + { + return SubType.CodeBehind; + } + } + } + return SubType.Code; + } + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs new file mode 100644 index 0000000000..20095c36de --- /dev/null +++ b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseProject")] + public class DatabaseProjectNode : DataNode + { + string name; + string path; + string fullpath; + Guid guid = Guid.NewGuid(); + readonly List authors = new List(); + readonly List references = new List(); + + public Guid Guid + { + get { return guid; } + } + + public string Name + { + get { return name; } + } + + public string Path + { + get { return path; } + } + + public string FullPath + { + get { return fullpath; } + } + + public IEnumerable References + { + get { return references; } + } + + public override void Parse(XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + path = Helper.AttributeValue(node, "path", name); + + try + { + fullpath = Helper.ResolvePath(path); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + + try + { + Helper.SetCurrentDir(fullpath); + + if (node == null) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + + if (dataNode == null) + continue; + + if (dataNode is AuthorNode) + authors.Add((AuthorNode)dataNode); + else if (dataNode is DatabaseReferenceNode) + references.Add((DatabaseReferenceNode)dataNode); + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs new file mode 100644 index 0000000000..97c3964b8e --- /dev/null +++ b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs @@ -0,0 +1,63 @@ +using System; +using Prebuild.Core.Attributes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseReference")] + public class DatabaseReferenceNode : DataNode + { + string name; + Guid providerId; + string connectionString; + + public string Name + { + get { return name; } + } + + public Guid ProviderId + { + get { return providerId; } + } + + public string ConnectionString + { + get { return connectionString; } + } + + public override void Parse(System.Xml.XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + + string providerName = Helper.AttributeValue(node, "providerName", string.Empty); + if (providerName != null) + { + switch (providerName) + { + // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* + // Not sure if these will help other operating systems, or if there's a better way. + case "Microsoft.SqlServerCe.Client.3.5": + providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; + case "System.Data.OleDb": + providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; + case "System.Data.OracleClient": + providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; + case "System.Data.SqlClient": + providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; + case "System.Data.Odbc": + providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; + + default: + throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); + } + } + else + providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); + + connectionString = Helper.AttributeValue(node, "connectionString", connectionString); + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/DescriptionNode.cs b/Prebuild/src/Core/Nodes/DescriptionNode.cs new file mode 100644 index 0000000000..d1293a0c80 --- /dev/null +++ b/Prebuild/src/Core/Nodes/DescriptionNode.cs @@ -0,0 +1,87 @@ +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// The object representing the /Prebuild/Solution/Project/Description element + /// + [DataNode("Description")] + public class DescriptionNode : DataNode + { + #region Fields + + private string m_Value; + + #endregion + + #region Properties + + /// + /// Gets the description Value. + /// + /// The description Value. + public string Value + { + get + { + return m_Value; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Value = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Value == null) + { + m_Value = ""; + } + + m_Value = m_Value.Trim(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/ExcludeNode.cs b/Prebuild/src/Core/Nodes/ExcludeNode.cs new file mode 100644 index 0000000000..7f04cba72f --- /dev/null +++ b/Prebuild/src/Core/Nodes/ExcludeNode.cs @@ -0,0 +1,89 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Exclude")] + public class ExcludeNode : DataNode + { + #region Fields + + private string m_Pattern = ""; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Pattern; + } + } + + /// + /// Gets the pattern. + /// + /// The pattern. + public string Pattern + { + get + { + return m_Pattern; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); + m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/FileNode.cs b/Prebuild/src/Core/Nodes/FileNode.cs new file mode 100644 index 0000000000..01cea1ebdb --- /dev/null +++ b/Prebuild/src/Core/Nodes/FileNode.cs @@ -0,0 +1,285 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; +using Prebuild.Core.Targets; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + public enum BuildAction + { + /// + /// + /// + None, + /// + /// + /// + Compile, + /// + /// + /// + Content, + /// + /// + /// + EmbeddedResource, + /// + /// + /// + ApplicationDefinition, + /// + /// + /// + Page + } + + /// + /// + /// + public enum SubType + { + /// + /// + /// + Code, + /// + /// + /// + Component, + /// + /// + /// + Designer, + /// + /// + /// + Form, + /// + /// + /// + Settings, + /// + /// + /// + UserControl, + /// + /// + /// + CodeBehind, + } + + public enum CopyToOutput + { + Never, + Always, + PreserveNewest + } + + /// + /// + /// + [DataNode("File")] + public class FileNode : DataNode + { + #region Fields + + private string m_Path; + private string m_ResourceName = ""; + private BuildAction? m_BuildAction; + private bool m_Valid; + private SubType? m_SubType; + private CopyToOutput m_CopyToOutput = CopyToOutput.Never; + private bool m_Link = false; + private string m_LinkPath = string.Empty; + private bool m_PreservePath = false; + + + #endregion + + #region Properties + + /// + /// + /// + public string Path + { + get + { + return m_Path; + } + } + + /// + /// + /// + public string ResourceName + { + get + { + return m_ResourceName; + } + } + + /// + /// + /// + public BuildAction BuildAction + { + get + { + if (m_BuildAction != null) + return m_BuildAction.Value; + else + return GetBuildActionByFileName(this.Path); + + } + } + + public CopyToOutput CopyToOutput + { + get + { + return this.m_CopyToOutput; + } + } + + public bool IsLink + { + get + { + return this.m_Link; + } + } + + public string LinkPath + { + get + { + return this.m_LinkPath; + } + } + /// + /// + /// + public SubType SubType + { + get + { + if (m_SubType != null) + return m_SubType.Value; + else + return GetSubTypeByFileName(this.Path); + } + } + + /// + /// + /// + public bool IsValid + { + get + { + return m_Valid; + } + } + + /// + /// + /// + /// + /// + public bool PreservePath + { + get + { + return m_PreservePath; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + string subType = Helper.AttributeValue(node, "subType", string.Empty); + if (subType != String.Empty) + m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); + this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); + if ( this.m_Link == true ) + { + this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); + } + this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); + this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + m_Path = m_Path.Trim(); + m_Valid = true; + if(!File.Exists(m_Path)) + { + m_Valid = false; + Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); + } + + if (System.IO.Path.GetExtension(m_Path) == ".settings") + { + m_SubType = SubType.Settings; + m_BuildAction = BuildAction.None; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/FilesNode.cs b/Prebuild/src/Core/Nodes/FilesNode.cs new file mode 100644 index 0000000000..23a716cfde --- /dev/null +++ b/Prebuild/src/Core/Nodes/FilesNode.cs @@ -0,0 +1,204 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using System.IO; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Files")] + public class FilesNode : DataNode + { + #region Fields + + private readonly List m_Files = new List(); + private readonly Dictionary m_BuildActions = new Dictionary(); + private readonly Dictionary m_SubTypes = new Dictionary(); + private readonly Dictionary m_ResourceNames = new Dictionary(); + private readonly Dictionary m_CopyToOutputs = new Dictionary(); + private readonly Dictionary m_Links = new Dictionary(); + private readonly Dictionary m_LinkPaths = new Dictionary(); + private readonly Dictionary m_PreservePaths = new Dictionary(); + + #endregion + + #region Properties + + public int Count + { + get + { + return m_Files.Count; + } + } + + #endregion + + #region Public Methods + + public BuildAction GetBuildAction(string file) + { + if(!m_BuildActions.ContainsKey(file)) + { + return BuildAction.Compile; + } + + return m_BuildActions[file]; + } + + public CopyToOutput GetCopyToOutput(string file) + { + if (!m_CopyToOutputs.ContainsKey(file)) + { + return CopyToOutput.Never; + } + return m_CopyToOutputs[file]; + } + + public bool GetIsLink(string file) + { + if (!m_Links.ContainsKey(file)) + { + return false; + } + return m_Links[file]; + } + + public bool Contains(string file) + { + return m_Files.Contains(file); + } + + public string GetLinkPath( string file ) + { + if ( !m_LinkPaths.ContainsKey( file ) ) + { + return string.Empty; + } + return m_LinkPaths[ file ]; + } + + public SubType GetSubType(string file) + { + if(!m_SubTypes.ContainsKey(file)) + { + return SubType.Code; + } + + return m_SubTypes[file]; + } + + public string GetResourceName(string file) + { + if(!m_ResourceNames.ContainsKey(file)) + { + return string.Empty; + } + + return m_ResourceNames[file]; + } + + public bool GetPreservePath( string file ) + { + if ( !m_PreservePaths.ContainsKey( file ) ) + { + return false; + } + + return m_PreservePaths[ file ]; + } + + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is FileNode) + { + FileNode fileNode = (FileNode)dataNode; + if(fileNode.IsValid) + { + if (!m_Files.Contains(fileNode.Path)) + { + m_Files.Add(fileNode.Path); + m_BuildActions[fileNode.Path] = fileNode.BuildAction; + m_SubTypes[fileNode.Path] = fileNode.SubType; + m_ResourceNames[fileNode.Path] = fileNode.ResourceName; + m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; + m_Links[ fileNode.Path ] = fileNode.IsLink; + m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; + m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; + + } + } + } + else if(dataNode is MatchNode) + { + foreach(string file in ((MatchNode)dataNode).Files) + { + MatchNode matchNode = (MatchNode)dataNode; + if (!m_Files.Contains(file)) + { + m_Files.Add(file); + if (matchNode.BuildAction == null) + m_BuildActions[file] = GetBuildActionByFileName(file); + else + m_BuildActions[file] = matchNode.BuildAction.Value; + m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; + m_ResourceNames[ file ] = matchNode.ResourceName; + m_PreservePaths[ file ] = matchNode.PreservePath; + m_Links[ file ] = matchNode.IsLink; + m_LinkPaths[ file ] = matchNode.LinkPath; + m_CopyToOutputs[ file ] = matchNode.CopyToOutput; + + } + } + } + } + } + + // TODO: Check in to why StringCollection's enumerator doesn't implement + // IEnumerator? + public IEnumerator GetEnumerator() + { + return m_Files.GetEnumerator(); + } + + #endregion + + } +} diff --git a/Prebuild/src/Core/Nodes/MatchNode.cs b/Prebuild/src/Core/Nodes/MatchNode.cs new file mode 100644 index 0000000000..9735265f05 --- /dev/null +++ b/Prebuild/src/Core/Nodes/MatchNode.cs @@ -0,0 +1,367 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Match")] + public class MatchNode : DataNode + { + #region Fields + + private readonly List m_Files = new List(); + private Regex m_Regex; + private BuildAction? m_BuildAction; + private SubType? m_SubType; + string m_ResourceName = ""; + private CopyToOutput m_CopyToOutput; + private bool m_Link; + private string m_LinkPath; + private bool m_PreservePath; + private readonly List m_Exclusions = new List(); + + #endregion + + #region Properties + + /// + /// + /// + public IEnumerable Files + { + get + { + return m_Files; + } + } + + /// + /// + /// + public BuildAction? BuildAction + { + get + { + return m_BuildAction; + } + } + + /// + /// + /// + public SubType? SubType + { + get + { + return m_SubType; + } + } + + public CopyToOutput CopyToOutput + { + get + { + return m_CopyToOutput; + } + } + + public bool IsLink + { + get + { + return m_Link; + } + } + + public string LinkPath + { + get + { + return m_LinkPath; + } + } + /// + /// + /// + public string ResourceName + { + get + { + return m_ResourceName; + } + } + + public bool PreservePath + { + get + { + return m_PreservePath; + } + } + + #endregion + + #region Private Methods + + /// + /// Recurses the directories. + /// + /// The path. + /// The pattern. + /// if set to true [recurse]. + /// if set to true [use regex]. + private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List exclusions) + { + Match match; + try + { + string[] files; + + Boolean excludeFile; + if(!useRegex) + { + try + { + files = Directory.GetFiles(path, pattern); + } + catch (IOException) + { + // swallow weird IOException error when running in a virtual box + // guest OS on a network share when the host OS is not Windows. + // This seems to happen on network shares + // when no files match, and may be related to this report: + // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=254546 + + files = null; + } + + if(files != null) + { + foreach (string file in files) + { + excludeFile = false; + string fileTemp; + if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") + { + fileTemp = file.Substring(2); + } + else + { + fileTemp = file; + } + + // Check all excludions and set flag if there are any hits. + foreach ( ExcludeNode exclude in exclusions ) + { + Regex exRegEx = new Regex( exclude.Pattern ); + match = exRegEx.Match( file ); + excludeFile |= match.Success; + } + + if ( !excludeFile ) + { + m_Files.Add( fileTemp ); + } + + } + } + + // don't call return here, because we may need to recursively search directories below + // this one, even if no matches were found in this directory. + } + else + { + try + { + files = Directory.GetFiles(path); + } + catch (IOException) + { + // swallow weird IOException error when running in a virtual box + // guest OS on a network share. + files = null; + } + + if (files != null) + { + foreach (string file in files) + { + excludeFile = false; + + match = m_Regex.Match(file); + if (match.Success) + { + // Check all excludions and set flag if there are any hits. + foreach (ExcludeNode exclude in exclusions) + { + Regex exRegEx = new Regex(exclude.Pattern); + match = exRegEx.Match(file); + excludeFile |= !match.Success; + } + + if (!excludeFile) + { + m_Files.Add(file); + } + } + } + } + } + + if(recurse) + { + string[] dirs = Directory.GetDirectories(path); + if(dirs != null && dirs.Length > 0) + { + foreach (string str in dirs) + { + // hack to skip subversion folders. Not having this can cause + // a significant performance hit when running on a network drive. + if (str.EndsWith(".svn")) + continue; + + RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); + } + } + } + } + catch(DirectoryNotFoundException) + { + return; + } + catch(ArgumentException) + { + return; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + string path = Helper.AttributeValue(node, "path", "."); + string pattern = Helper.AttributeValue(node, "pattern", "*"); + bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); + bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + + //TODO: Figure out where the subtype node is being assigned + //string subType = Helper.AttributeValue(node, "subType", string.Empty); + //if (subType != String.Empty) + // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName); + m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", m_CopyToOutput.ToString())); + m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); + if ( m_Link ) + { + m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); + } + m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + + + if(path != null && path.Length == 0) + { + path = ".";//use current directory + } + //throw new WarningException("Match must have a 'path' attribute"); + + if(pattern == null) + { + throw new WarningException("Match must have a 'pattern' attribute"); + } + + path = Helper.NormalizePath(path); + if(!Directory.Exists(path)) + { + throw new WarningException("Match path does not exist: {0}", path); + } + + try + { + if(useRegex) + { + m_Regex = new Regex(pattern); + } + } + catch(ArgumentException ex) + { + throw new WarningException("Could not compile regex pattern: {0}", ex.Message); + } + + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is ExcludeNode) + { + ExcludeNode excludeNode = (ExcludeNode)dataNode; + m_Exclusions.Add( excludeNode ); + } + } + + RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); + + if (m_Files.Count < 1) + { + // Include the project name when the match node returns no matches to provide extra + // debug info. + ProjectNode project = Parent.Parent as ProjectNode; + string projectName = ""; + + if (project != null) + projectName = " in project " + project.AssemblyName; + + throw new WarningException("Match" + projectName + " returned no files: {0}{1}", Helper.EndPath(path), pattern); + } + m_Regex = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/OptionsNode.cs b/Prebuild/src/Core/Nodes/OptionsNode.cs new file mode 100644 index 0000000000..577de710ed --- /dev/null +++ b/Prebuild/src/Core/Nodes/OptionsNode.cs @@ -0,0 +1,634 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Options")] + public class OptionsNode : DataNode + { + #region Fields + + private static readonly Dictionary m_OptionFields = new Dictionary(); + + [OptionNode("CompilerDefines")] + private string m_CompilerDefines = ""; + + /// + /// + /// + public string CompilerDefines + { + get + { + return m_CompilerDefines; + } + set + { + m_CompilerDefines = value; + } + } + + [OptionNode("OptimizeCode")] + private bool m_OptimizeCode; + + /// + /// + /// + public bool OptimizeCode + { + get + { + return m_OptimizeCode; + } + set + { + m_OptimizeCode = value; + } + } + + [OptionNode("CheckUnderflowOverflow")] + private bool m_CheckUnderflowOverflow; + + /// + /// + /// + public bool CheckUnderflowOverflow + { + get + { + return m_CheckUnderflowOverflow; + } + set + { + m_CheckUnderflowOverflow = value; + } + } + + [OptionNode("AllowUnsafe")] + private bool m_AllowUnsafe; + + /// + /// + /// + public bool AllowUnsafe + { + get + { + return m_AllowUnsafe; + } + set + { + m_AllowUnsafe = value; + } + } + + [OptionNode("PreBuildEvent")] + private string m_PreBuildEvent; + + /// + /// + /// + public string PreBuildEvent + { + get + { + return m_PreBuildEvent; + } + set + { + m_PreBuildEvent = value; + } + } + + [OptionNode("PostBuildEvent")] + private string m_PostBuildEvent; + + /// + /// + /// + public string PostBuildEvent + { + get + { + return m_PostBuildEvent; + } + set + { + m_PostBuildEvent = value; + } + } + + [OptionNode("PreBuildEventArgs")] + private string m_PreBuildEventArgs; + + /// + /// + /// + public string PreBuildEventArgs + { + get + { + return m_PreBuildEventArgs; + } + set + { + m_PreBuildEventArgs = value; + } + } + + [OptionNode("PostBuildEventArgs")] + private string m_PostBuildEventArgs; + + /// + /// + /// + public string PostBuildEventArgs + { + get + { + return m_PostBuildEventArgs; + } + set + { + m_PostBuildEventArgs = value; + } + } + + [OptionNode("RunPostBuildEvent")] + private string m_RunPostBuildEvent; + + /// + /// + /// + public string RunPostBuildEvent + { + get + { + return m_RunPostBuildEvent; + } + set + { + m_RunPostBuildEvent = value; + } + } + + [OptionNode("RunScript")] + private string m_RunScript; + + /// + /// + /// + public string RunScript + { + get + { + return m_RunScript; + } + set + { + m_RunScript = value; + } + } + + [OptionNode("WarningLevel")] + private int m_WarningLevel = 4; + + /// + /// + /// + public int WarningLevel + { + get + { + return m_WarningLevel; + } + set + { + m_WarningLevel = value; + } + } + + [OptionNode("WarningsAsErrors")] + private bool m_WarningsAsErrors; + + /// + /// + /// + public bool WarningsAsErrors + { + get + { + return m_WarningsAsErrors; + } + set + { + m_WarningsAsErrors = value; + } + } + + [OptionNode("SuppressWarnings")] + private string m_SuppressWarnings = ""; + + /// + /// + /// + public string SuppressWarnings + { + get + { + return m_SuppressWarnings; + } + set + { + m_SuppressWarnings = value; + } + } + + [OptionNode("OutputPath")] + private string m_OutputPath = "bin/"; + + /// + /// + /// + public string OutputPath + { + get + { + return m_OutputPath; + } + set + { + m_OutputPath = value; + } + } + + [OptionNode("GenerateDocumentation")] + private bool m_GenerateDocumentation; + + /// + /// + /// + public bool GenerateDocumentation + { + get + { + return m_GenerateDocumentation; + } + set + { + m_GenerateDocumentation = value; + } + } + + [OptionNode("GenerateXmlDocFile")] + private bool m_GenerateXmlDocFile; + + /// + /// + /// + public bool GenerateXmlDocFile + { + get + { + return m_GenerateXmlDocFile; + } + set + { + m_GenerateXmlDocFile = value; + } + } + + [OptionNode("XmlDocFile")] + private string m_XmlDocFile = ""; + + /// + /// + /// + public string XmlDocFile + { + get + { + return m_XmlDocFile; + } + set + { + m_XmlDocFile = value; + } + } + + [OptionNode("KeyFile")] + private string m_KeyFile = ""; + + /// + /// + /// + public string KeyFile + { + get + { + return m_KeyFile; + } + set + { + m_KeyFile = value; + } + } + + [OptionNode("DebugInformation")] + private bool m_DebugInformation; + + /// + /// + /// + public bool DebugInformation + { + get + { + return m_DebugInformation; + } + set + { + m_DebugInformation = value; + } + } + + [OptionNode("RegisterComInterop")] + private bool m_RegisterComInterop; + + /// + /// + /// + public bool RegisterComInterop + { + get + { + return m_RegisterComInterop; + } + set + { + m_RegisterComInterop = value; + } + } + + [OptionNode("RemoveIntegerChecks")] + private bool m_RemoveIntegerChecks; + + /// + /// + /// + public bool RemoveIntegerChecks + { + get + { + return m_RemoveIntegerChecks; + } + set + { + m_RemoveIntegerChecks = value; + } + } + + [OptionNode("IncrementalBuild")] + private bool m_IncrementalBuild; + + /// + /// + /// + public bool IncrementalBuild + { + get + { + return m_IncrementalBuild; + } + set + { + m_IncrementalBuild = value; + } + } + + [OptionNode("BaseAddress")] + private string m_BaseAddress = "285212672"; + + /// + /// + /// + public string BaseAddress + { + get + { + return m_BaseAddress; + } + set + { + m_BaseAddress = value; + } + } + + [OptionNode("FileAlignment")] + private int m_FileAlignment = 4096; + + /// + /// + /// + public int FileAlignment + { + get + { + return m_FileAlignment; + } + set + { + m_FileAlignment = value; + } + } + + [OptionNode("NoStdLib")] + private bool m_NoStdLib; + + /// + /// + /// + public bool NoStdLib + { + get + { + return m_NoStdLib; + } + set + { + m_NoStdLib = value; + } + } + + private readonly List m_FieldsDefined = new List(); + + #endregion + + #region Constructors + + /// + /// Initializes the class. + /// + static OptionsNode() + { + Type t = typeof(OptionsNode); + + foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) + { + object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); + if(attrs == null || attrs.Length < 1) + { + continue; + } + + OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; + m_OptionFields[ona.NodeName] = f; + } + } + + #endregion + + #region Properties + + /// + /// Gets the at the specified index. + /// + /// + public object this[string index] + { + get + { + if(!m_OptionFields.ContainsKey(index)) + { + return null; + } + + FieldInfo f = m_OptionFields[index]; + return f.GetValue(this); + } + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[string index, object defaultValue] + { + get + { + object valueObject = this[index]; + if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) + { + return defaultValue; + } + return valueObject; + } + } + + + #endregion + + #region Private Methods + + private void FlagDefined(string name) + { + if(!m_FieldsDefined.Contains(name)) + { + m_FieldsDefined.Add(name); + } + } + + private void SetOption(string nodeName, string val) + { + lock(m_OptionFields) + { + if(!m_OptionFields.ContainsKey(nodeName)) + { + return; + } + + FieldInfo f = m_OptionFields[nodeName]; + f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); + FlagDefined(f.Name); + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); + } + } + + /// + /// Copies to. + /// + /// The opt. + public void CopyTo(OptionsNode opt) + { + if(opt == null) + { + return; + } + + foreach(FieldInfo f in m_OptionFields.Values) + { + if(m_FieldsDefined.Contains(f.Name)) + { + f.SetValue(opt, f.GetValue(this)); + opt.m_FieldsDefined.Add(f.Name); + } + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/ProcessNode.cs b/Prebuild/src/Core/Nodes/ProcessNode.cs new file mode 100644 index 0000000000..8ca8e493d2 --- /dev/null +++ b/Prebuild/src/Core/Nodes/ProcessNode.cs @@ -0,0 +1,108 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Process")] + public class ProcessNode : DataNode + { + #region Fields + + private string m_Path; + private bool m_IsValid = true; + + #endregion + + #region Properties + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets a value indicating whether this instance is valid. + /// + /// true if this instance is valid; otherwise, false. + public bool IsValid + { + get + { + return m_IsValid; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + try + { + m_Path = Helper.ResolvePath(m_Path); + } + catch(ArgumentException) + { + Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); + m_IsValid = false; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/ProjectNode.cs b/Prebuild/src/Core/Nodes/ProjectNode.cs new file mode 100644 index 0000000000..fb92b32e73 --- /dev/null +++ b/Prebuild/src/Core/Nodes/ProjectNode.cs @@ -0,0 +1,579 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// A set of values that the Project's type can be + /// + public enum ProjectType + { + /// + /// The project is a console executable + /// + Exe, + /// + /// The project is a windows executable + /// + WinExe, + /// + /// The project is a library + /// + Library, + /// + /// The project is a website + /// + Web, + } + + /// + /// + /// + public enum ClrRuntime + { + /// + /// + /// + Microsoft, + /// + /// + /// + Mono + } + /// + /// The version of the .NET framework to use (Required for VS2008) + /// We don't need .NET 1.1 in here, it'll default when using vs2003. + /// + public enum FrameworkVersion + { + /// + /// .NET 2.0 + /// + v2_0, + /// + /// .NET 3.0 + /// + v3_0, + /// + /// .NET 3.5 + /// + v3_5, + /// + /// .NET 4.0 + /// + v4_0, + } + /// + /// The Node object representing /Prebuild/Solution/Project elements + /// + [DataNode("Project")] + public class ProjectNode : DataNode, IComparable + { + #region Fields + + private string m_Name = "unknown"; + private string m_Path = ""; + private string m_FullPath = ""; + private string m_AssemblyName; + private string m_AppIcon = ""; + private string m_ConfigFile = ""; + private string m_DesignerFolder = ""; + private string m_Language = "C#"; + private ProjectType m_Type = ProjectType.Exe; + private ClrRuntime m_Runtime = ClrRuntime.Microsoft; + private FrameworkVersion m_Framework = FrameworkVersion.v2_0; + private string m_StartupObject = ""; + private string m_RootNamespace; + private string m_FilterGroups = ""; + private string m_Version = ""; + private Guid m_Guid; + private string m_DebugStartParameters; + + private readonly Dictionary m_Configurations = new Dictionary(); + private readonly List m_ReferencePaths = new List(); + private readonly List m_References = new List(); + private readonly List m_Authors = new List(); + private FilesNode m_Files; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + /// + /// The version of the .NET Framework to compile under + /// + public FrameworkVersion FrameworkVersion + { + get + { + return m_Framework; + } + } + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets the filter groups. + /// + /// The filter groups. + public string FilterGroups + { + get + { + return m_FilterGroups; + } + } + + /// + /// Gets the project's version + /// + /// The project's version. + public string Version + { + get + { + return m_Version; + } + } + + /// + /// Gets the full path. + /// + /// The full path. + public string FullPath + { + get + { + return m_FullPath; + } + } + + /// + /// Gets the name of the assembly. + /// + /// The name of the assembly. + public string AssemblyName + { + get + { + return m_AssemblyName; + } + } + + /// + /// Gets the app icon. + /// + /// The app icon. + public string AppIcon + { + get + { + return m_AppIcon; + } + } + + /// + /// Gets the app icon. + /// + /// The app icon. + public string ConfigFile + { + get + { + return m_ConfigFile; + } + } + + /// + /// + /// + public string DesignerFolder + { + get + { + return m_DesignerFolder; + } + } + + /// + /// Gets the language. + /// + /// The language. + public string Language + { + get + { + return m_Language; + } + } + + /// + /// Gets the type. + /// + /// The type. + public ProjectType Type + { + get + { + return m_Type; + } + } + + /// + /// Gets the runtime. + /// + /// The runtime. + public ClrRuntime Runtime + { + get + { + return m_Runtime; + } + } + + private bool m_GenerateAssemblyInfoFile; + + /// + /// + /// + public bool GenerateAssemblyInfoFile + { + get + { + return m_GenerateAssemblyInfoFile; + } + set + { + m_GenerateAssemblyInfoFile = value; + } + } + + /// + /// Gets the startup object. + /// + /// The startup object. + public string StartupObject + { + get + { + return m_StartupObject; + } + } + + /// + /// Gets the root namespace. + /// + /// The root namespace. + public string RootNamespace + { + get + { + return m_RootNamespace; + } + } + + /// + /// Gets the configurations. + /// + /// The configurations. + public List Configurations + { + get + { + List tmp = new List(ConfigurationsTable.Values); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the configurations table. + /// + /// The configurations table. + public Dictionary ConfigurationsTable + { + get + { + return m_Configurations; + } + } + + /// + /// Gets the reference paths. + /// + /// The reference paths. + public List ReferencePaths + { + get + { + List tmp = new List(m_ReferencePaths); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the references. + /// + /// The references. + public List References + { + get + { + List tmp = new List(m_References); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the Authors list. + /// + /// The list of the project's authors. + public List Authors + { + get + { + return m_Authors; + } + } + + /// + /// Gets the files. + /// + /// The files. + public FilesNode Files + { + get + { + return m_Files; + } + } + + /// + /// Gets or sets the parent. + /// + /// The parent. + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + base.Parent = value; + if(base.Parent is SolutionNode && m_Configurations.Count < 1) + { + SolutionNode parent = (SolutionNode)base.Parent; + foreach(ConfigurationNode conf in parent.Configurations) + { + m_Configurations[conf.NameAndPlatform] = (ConfigurationNode) conf.Clone(); + } + } + } + } + + /// + /// Gets the GUID. + /// + /// The GUID. + public Guid Guid + { + get + { + return m_Guid; + } + } + + public string DebugStartParameters + { + get + { + return m_DebugStartParameters; + } + } + + #endregion + + #region Private Methods + + private void HandleConfiguration(ConfigurationNode conf) + { + if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, + //so it *may* override changes to the same properties for configurations defines at the project level + { + foreach(ConfigurationNode confNode in m_Configurations.Values) + { + conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides + } + } + if(m_Configurations.ContainsKey(conf.NameAndPlatform)) + { + ConfigurationNode parentConf = m_Configurations[conf.NameAndPlatform]; + conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides + } + else + { + m_Configurations[conf.NameAndPlatform] = conf; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); + m_Version = Helper.AttributeValue(node, "version", m_Version); + m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); + m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); + m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); + m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); + m_Language = Helper.AttributeValue(node, "language", m_Language); + m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); + m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); + m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); + m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); + m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); + + int hash = m_Name.GetHashCode(); + Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString()); + m_Guid = new Guid(guid); + + m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); + m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty); + + if(string.IsNullOrEmpty(m_AssemblyName)) + { + m_AssemblyName = m_Name; + } + + if(string.IsNullOrEmpty(m_RootNamespace)) + { + m_RootNamespace = m_Name; + } + + m_FullPath = m_Path; + try + { + m_FullPath = Helper.ResolvePath(m_FullPath); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", m_Path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + try + { + Helper.SetCurrentDir(m_FullPath); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is ConfigurationNode) + { + HandleConfiguration((ConfigurationNode)dataNode); + } + else if(dataNode is ReferencePathNode) + { + m_ReferencePaths.Add((ReferencePathNode)dataNode); + } + else if(dataNode is ReferenceNode) + { + m_References.Add((ReferenceNode)dataNode); + } + else if(dataNode is AuthorNode) + { + m_Authors.Add((AuthorNode)dataNode); + } + else if(dataNode is FilesNode) + { + m_Files = (FilesNode)dataNode; + } + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ProjectNode that = (ProjectNode)obj; + return m_Name.CompareTo(that.m_Name); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/ReferenceNode.cs b/Prebuild/src/Core/Nodes/ReferenceNode.cs new file mode 100644 index 0000000000..9c5d1a3491 --- /dev/null +++ b/Prebuild/src/Core/Nodes/ReferenceNode.cs @@ -0,0 +1,144 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Reference")] + public class ReferenceNode : DataNode, IComparable + { + #region Fields + + private string m_Name = "unknown"; + private string m_Path; + private string m_LocalCopy; + private string m_Version; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets a value indicating whether [local copy specified]. + /// + /// true if [local copy specified]; otherwise, false. + public bool LocalCopySpecified + { + get + { + return ( m_LocalCopy != null && m_LocalCopy.Length == 0); + } + } + + /// + /// Gets a value indicating whether [local copy]. + /// + /// true if [local copy]; otherwise, false. + public bool LocalCopy + { + get + { + if( m_LocalCopy == null) + { + return false; + } + return bool.Parse(m_LocalCopy); + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return m_Version; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); + m_Version = Helper.AttributeValue(node, "version", m_Version); + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ReferenceNode that = (ReferenceNode)obj; + return this.m_Name.CompareTo(that.m_Name); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/ReferencePathNode.cs b/Prebuild/src/Core/Nodes/ReferencePathNode.cs new file mode 100644 index 0000000000..7331cd7b58 --- /dev/null +++ b/Prebuild/src/Core/Nodes/ReferencePathNode.cs @@ -0,0 +1,97 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("ReferencePath")] + public class ReferencePathNode : DataNode, IComparable + { + #region Fields + + private string m_Path; + + #endregion + + #region Properties + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + m_Path = m_Path.Trim(); + } + + #endregion + + #region IComparable Members + + public int CompareTo(object obj) + { + ReferencePathNode that = (ReferencePathNode)obj; + return this.m_Path.CompareTo(that.m_Path); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/SolutionNode.cs b/Prebuild/src/Core/Nodes/SolutionNode.cs new file mode 100644 index 0000000000..10c02234da --- /dev/null +++ b/Prebuild/src/Core/Nodes/SolutionNode.cs @@ -0,0 +1,382 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Solution")] + [DataNode("EmbeddedSolution")] + [DebuggerDisplay("{Name}")] + public class SolutionNode : DataNode + { + #region Fields + + private Guid m_Guid = Guid.NewGuid(); + private string m_Name = "unknown"; + private string m_Path = ""; + private string m_FullPath = ""; + private string m_ActiveConfig; + private string m_Version = "1.0.0"; + + private OptionsNode m_Options; + private FilesNode m_Files; + private readonly ConfigurationNodeCollection m_Configurations = new ConfigurationNodeCollection(); + private readonly Dictionary m_Projects = new Dictionary(); + private readonly Dictionary m_DatabaseProjects = new Dictionary(); + private readonly List m_ProjectsOrder = new List(); + private readonly Dictionary m_Solutions = new Dictionary(); + private CleanupNode m_Cleanup; + + #endregion + + #region Properties + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + if (value is SolutionNode) + { + SolutionNode solution = (SolutionNode)value; + foreach (ConfigurationNode conf in solution.Configurations) + { + m_Configurations[conf.Name] = (ConfigurationNode) conf.Clone(); + } + } + + base.Parent = value; + } + } + + public CleanupNode Cleanup + { + get + { + return m_Cleanup; + } + set + { + m_Cleanup = value; + } + } + + public Guid Guid + { + get + { + return m_Guid; + } + set + { + m_Guid = value; + } + } + /// + /// Gets or sets the active config. + /// + /// The active config. + public string ActiveConfig + { + get + { + return m_ActiveConfig; + } + set + { + m_ActiveConfig = value; + } + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets the full path. + /// + /// The full path. + public string FullPath + { + get + { + return m_FullPath; + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return m_Version; + } + } + + /// + /// Gets the options. + /// + /// The options. + public OptionsNode Options + { + get + { + return m_Options; + } + } + + /// + /// Gets the files. + /// + /// The files. + public FilesNode Files + { + get + { + return m_Files; + } + } + + /// + /// Gets the configurations. + /// + /// The configurations. + public ConfigurationNodeCollection Configurations + { + get + { + ConfigurationNodeCollection tmp = new ConfigurationNodeCollection(); + tmp.AddRange(ConfigurationsTable); + return tmp; + } + } + + /// + /// Gets the configurations table. + /// + /// The configurations table. + public ConfigurationNodeCollection ConfigurationsTable + { + get + { + return m_Configurations; + } + } + /// + /// Gets the database projects. + /// + public ICollection DatabaseProjects + { + get + { + return m_DatabaseProjects.Values; + } + } + /// + /// Gets the nested solutions. + /// + public ICollection Solutions + { + get + { + return m_Solutions.Values; + } + } + /// + /// Gets the nested solutions hash table. + /// + public Dictionary SolutionsTable + { + get + { + return m_Solutions; + } + } + /// + /// Gets the projects. + /// + /// The projects. + public ICollection Projects + { + get + { + List tmp = new List(m_Projects.Values); + tmp.Sort(); + return tmp; + } + } + + /// + /// Gets the projects table. + /// + /// The projects table. + public Dictionary ProjectsTable + { + get + { + return m_Projects; + } + } + + /// + /// Gets the projects table. + /// + /// The projects table. + public List ProjectsTableOrder + { + get + { + return m_ProjectsOrder; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_Version = Helper.AttributeValue(node, "version", m_Version); + + m_FullPath = m_Path; + try + { + m_FullPath = Helper.ResolvePath(m_FullPath); + } + catch + { + throw new WarningException("Could not resolve solution path: {0}", m_Path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + try + { + Helper.SetCurrentDir(m_FullPath); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is OptionsNode) + { + m_Options = (OptionsNode)dataNode; + } + else if(dataNode is FilesNode) + { + m_Files = (FilesNode)dataNode; + } + else if(dataNode is ConfigurationNode) + { + ConfigurationNode configurationNode = (ConfigurationNode) dataNode; + m_Configurations[configurationNode.NameAndPlatform] = configurationNode; + + // If the active configuration is null, then we populate it. + if (ActiveConfig == null) + { + ActiveConfig = configurationNode.Name; + } + } + else if(dataNode is ProjectNode) + { + m_Projects[((ProjectNode)dataNode).Name] = (ProjectNode) dataNode; + m_ProjectsOrder.Add((ProjectNode)dataNode); + } + else if(dataNode is SolutionNode) + { + m_Solutions[((SolutionNode)dataNode).Name] = (SolutionNode) dataNode; + } + else if (dataNode is ProcessNode) + { + ProcessNode p = (ProcessNode)dataNode; + Kernel.Instance.ProcessFile(p, this); + } + else if (dataNode is DatabaseProjectNode) + { + m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = (DatabaseProjectNode) dataNode; + } + else if(dataNode is CleanupNode) + { + if(m_Cleanup != null) + throw new WarningException("There can only be one Cleanup node."); + m_Cleanup = (CleanupNode)dataNode; + } + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Parse/.svn/all-wcprops b/Prebuild/src/Core/Parse/.svn/all-wcprops new file mode 100644 index 0000000000..c77d4169e8 --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Core/Parse +END +IfContext.cs +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Parse/IfContext.cs +END +Preprocessor.cs +K 25 +svn:wc:ra_dav:version-url +V 72 +/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Core/Parse/Preprocessor.cs +END diff --git a/Prebuild/src/Core/Parse/.svn/dir-prop-base b/Prebuild/src/Core/Parse/.svn/dir-prop-base new file mode 100644 index 0000000000..a1989a0b6d --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/dir-prop-base @@ -0,0 +1,5 @@ +K 10 +svn:ignore +V 5 +*.swp +END diff --git a/Prebuild/src/Core/Parse/.svn/entries b/Prebuild/src/Core/Parse/.svn/entries new file mode 100644 index 0000000000..2aae71129a --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Parse +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2010-09-10T17:51:36.189738Z +323 +jhurliman +has-props + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +IfContext.cs +file + + + + +2010-09-10T22:51:44.000000Z +859fca08c6a39a48f179d5ffe3d19bd0 +2009-02-19T06:47:52.218324Z +295 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +3653 + +Preprocessor.cs +file + + + + +2010-09-10T22:51:44.000000Z +6ef27f33f41caca9d4ab6c82ead76902 +2010-09-10T17:51:36.189738Z +323 +jhurliman +has-props + + + + + + + + + + + + + + + + + + + + +18590 + diff --git a/Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base b/Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base b/Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base b/Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base new file mode 100644 index 0000000000..3c79d38b06 --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base @@ -0,0 +1,154 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Parse +{ + /// + /// + /// + public enum IfState + { + /// + /// + /// + None, + /// + /// + /// + If, + /// + /// + /// + ElseIf, + /// + /// + /// + Else + } + + /// + /// Summary description for IfContext. + /// + // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) + public class IfContext + { + #region Properties + + bool m_Active; + bool m_Keep; + bool m_EverKept; + IfState m_State = IfState.None; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [active]. + /// if set to true [keep]. + /// The state. + public IfContext(bool active, bool keep, IfState state) + { + m_Active = active; + m_Keep = keep; + m_EverKept = keep; + m_State = state; + } + + #endregion + + #region Properties + + /// + /// Gets or sets a value indicating whether this is active. + /// + /// true if active; otherwise, false. + public bool Active + { + get + { + return m_Active; + } + set + { + m_Active = value; + } + } + + /// + /// Gets or sets a value indicating whether this is keep. + /// + /// true if keep; otherwise, false. + public bool Keep + { + get + { + return m_Keep; + } + set + { + m_Keep = value; + if(m_Keep) + { + m_EverKept = true; + } + } + } + + /// + /// Gets a value indicating whether [ever kept]. + /// + /// true if [ever kept]; otherwise, false. + public bool EverKept + { + get + { + return m_EverKept; + } + } + + /// + /// Gets or sets the state. + /// + /// The state. + public IfState State + { + get + { + return m_State; + } + set + { + m_State = value; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base b/Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base new file mode 100644 index 0000000000..0648fad8d8 --- /dev/null +++ b/Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base @@ -0,0 +1,652 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; + +namespace Prebuild.Core.Parse +{ + /// + /// + /// + public enum OperatorSymbol + { + /// + /// + /// + None, + /// + /// + /// + Equal, + /// + /// + /// + NotEqual, + /// + /// + /// + LessThan, + /// + /// + /// + GreaterThan, + /// + /// + /// + LessThanEqual, + /// + /// + /// + GreaterThanEqual + } + + /// + /// + /// + public class Preprocessor + { + #region Constants + + /// + /// Includes the regex to look for file tags in the processing instruction. + /// + private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); + + #endregion + + #region Fields + + readonly XmlDocument m_OutDoc = new XmlDocument(); + readonly Stack m_IfStack = new Stack(); + readonly Dictionary m_Variables = new Dictionary(); + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public Preprocessor() + { + RegisterVariable("OS", GetOS()); + RegisterVariable("RuntimeVersion", Environment.Version.Major); + RegisterVariable("RuntimeMajor", Environment.Version.Major); + RegisterVariable("RuntimeMinor", Environment.Version.Minor); + RegisterVariable("RuntimeRevision", Environment.Version.Revision); + } + + #endregion + + #region Properties + + /// + /// Gets the processed doc. + /// + /// The processed doc. + public XmlDocument ProcessedDoc + { + get + { + return m_OutDoc; + } + } + + #endregion + + #region Private Methods + + /// + /// Parts of this code were taken from NAnt and is subject to the GPL + /// as per NAnt's license. Thanks to the NAnt guys for this little gem. + /// + /// + public static string GetOS() + { + PlatformID platId = Environment.OSVersion.Platform; + if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) + { + return "Win32"; + } + + if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) + { + return "MACOSX"; + } + + /* + * .NET 1.x, under Mono, the UNIX code is 128. Under + * .NET 2.x, Mono or MS, the UNIX code is 4 + */ + if(Environment.Version.Major == 1) + { + if((int)platId == 128) + { + return "UNIX"; + } + } + else if((int)platId == 4) + { + return "UNIX"; + } + + return "Unknown"; + } + + private static bool CompareNum(OperatorSymbol oper, int val1, int val2) + { + switch(oper) + { + case OperatorSymbol.Equal: + return (val1 == val2); + case OperatorSymbol.NotEqual: + return (val1 != val2); + case OperatorSymbol.LessThan: + return (val1 < val2); + case OperatorSymbol.LessThanEqual: + return (val1 <= val2); + case OperatorSymbol.GreaterThan: + return (val1 > val2); + case OperatorSymbol.GreaterThanEqual: + return (val1 >= val2); + } + + throw new WarningException("Unknown operator type"); + } + + private static bool CompareStr(OperatorSymbol oper, string val1, string val2) + { + switch(oper) + { + case OperatorSymbol.Equal: + return (val1 == val2); + case OperatorSymbol.NotEqual: + return (val1 != val2); + case OperatorSymbol.LessThan: + return (val1.CompareTo(val2) < 0); + case OperatorSymbol.LessThanEqual: + return (val1.CompareTo(val2) <= 0); + case OperatorSymbol.GreaterThan: + return (val1.CompareTo(val2) > 0); + case OperatorSymbol.GreaterThanEqual: + return (val1.CompareTo(val2) >= 0); + } + + throw new WarningException("Unknown operator type"); + } + + private static char NextChar(int idx, string str) + { + if((idx + 1) >= str.Length) + { + return Char.MaxValue; + } + + return str[idx + 1]; + } + // Very very simple expression parser. Can only match expressions of the form + // : + // OS = Windows + // OS != Linux + // RuntimeMinor > 0 + private bool ParseExpression(string exp) + { + if(exp == null) + { + throw new ArgumentException("Invalid expression, cannot be null"); + } + + exp = exp.Trim(); + if(exp.Length < 1) + { + throw new ArgumentException("Invalid expression, cannot be 0 length"); + } + + string id = ""; + string str = ""; + OperatorSymbol oper = OperatorSymbol.None; + bool inStr = false; + + for(int i = 0; i < exp.Length; i++) + { + char c = exp[i]; + if(Char.IsWhiteSpace(c)) + { + continue; + } + + if(Char.IsLetterOrDigit(c) || c == '_') + { + if(inStr) + { + str += c; + } + else + { + id += c; + } + } + else if(c == '\"') + { + inStr = !inStr; + if(inStr) + { + str = ""; + } + } + else + { + if(inStr) + { + str += c; + } + else + { + switch(c) + { + case '=': + oper = OperatorSymbol.Equal; + break; + + case '!': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.NotEqual; + } + + break; + + case '<': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.LessThanEqual; + } + else + { + oper = OperatorSymbol.LessThan; + } + + break; + + case '>': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.GreaterThanEqual; + } + else + { + oper = OperatorSymbol.GreaterThan; + } + + break; + } + } + } + } + + + if(inStr) + { + throw new WarningException("Expected end of string in expression"); + } + + if(oper == OperatorSymbol.None) + { + throw new WarningException("Expected operator in expression"); + } + if(id.Length < 1) + { + throw new WarningException("Expected identifier in expression"); + } + if(str.Length < 1) + { + throw new WarningException("Expected value in expression"); + } + + bool ret; + try + { + object val = m_Variables[id.ToLower()]; + if(val == null) + { + throw new WarningException("Unknown identifier '{0}'", id); + } + + Type t = val.GetType(); + if(t.IsAssignableFrom(typeof(int))) + { + int numVal = (int)val; + int numVal2 = Int32.Parse(str); + ret = CompareNum(oper, numVal, numVal2); + } + else + { + string strVal = val.ToString(); + string strVal2 = str; + ret = CompareStr(oper, strVal, strVal2); + } + } + catch(ArgumentException ex) + { + ex.ToString(); + throw new WarningException("Invalid value type for system variable '{0}', expected int", id); + } + + return ret; + } + + /// + /// Taken from current Prebuild included in OpenSim 0.7.x + /// + /// + /// A + /// + /// + /// A + /// + private static void WildCardInclude (Stack readerStack, string include) + { + if (!include.Contains ("*")) { + return; + } + + // Console.WriteLine("Processing {0}", include); + + // Break up the include into pre and post wildcard sections + string preWildcard = include.Substring (0, include.IndexOf ("*")); + string postWildcard = include.Substring (include.IndexOf ("*") + 2); + + // If preWildcard is a directory, recurse + if (Directory.Exists (preWildcard)) { + string[] directories = Directory.GetDirectories (preWildcard); + Array.Sort (directories); + Array.Reverse (directories); + foreach (string dirPath in directories) { + //Console.WriteLine ("Scanning : {0}", dirPath); + + string includeFile = Path.Combine (dirPath, postWildcard); + if (includeFile.Contains ("*")) { + // postWildcard included another wildcard, recurse. + WildCardInclude (readerStack, includeFile); + } else { + FileInfo file = new FileInfo (includeFile); + if (file.Exists) { + //Console.WriteLine ("Including File: {0}", includeFile); + XmlReader newReader = new XmlTextReader (file.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); + readerStack.Push (newReader); + } + } + } + } else { + // preWildcard is not a path to a directory, so the wildcard is in the filename + string searchFilename = Path.GetFileName (preWildcard.Substring (preWildcard.IndexOf ("/") + 1) + "*" + postWildcard); + Console.WriteLine ("searchFilename: {0}", searchFilename); + + string searchDirectory = Path.GetDirectoryName (preWildcard); + Console.WriteLine ("searchDirectory: {0}", searchDirectory); + + string[] files = Directory.GetFiles (searchDirectory, searchFilename); + Array.Sort (files); + Array.Reverse (files); + foreach (string includeFile in files) { + FileInfo file = new FileInfo (includeFile); + if (file.Exists) { + // Console.WriteLine ("Including File: {0}", includeFile); + XmlReader newReader = new XmlTextReader (file.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); + readerStack.Push (newReader); + } + } + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + /// + public void RegisterVariable(string name, object variableValue) + { + if(name == null || variableValue == null) + { + return; + } + + m_Variables[name.ToLower()] = variableValue; + } + + /// + /// Performs validation on the xml source as well as evaluates conditional and flow expresions + /// + /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml + /// + /// the output xml + public string Process(XmlReader initialReader) + { + if(initialReader == null) + { + throw new ArgumentException("Invalid XML reader to pre-process"); + } + + IfContext context = new IfContext(true, true, IfState.None); + StringWriter xmlText = new StringWriter(); + XmlTextWriter writer = new XmlTextWriter(xmlText); + writer.Formatting = Formatting.Indented; + + // Create a queue of XML readers and add the initial + // reader to it. Then we process until we run out of + // readers which lets the operation add more + // readers to generate a multi-file parser and not require + // XML fragments that a recursive version would use. + Stack readerStack = new Stack(); + readerStack.Push(initialReader); + + while(readerStack.Count > 0) + { + // Pop off the next reader. + XmlReader reader = readerStack.Pop(); + + // Process through this XML reader until it is + // completed (or it is replaced by the include + // operation). + while(reader.Read()) + { + // The prebuild file has a series of processing + // instructions which allow for specific + // inclusions based on operating system or to + // include additional files. + if(reader.NodeType == XmlNodeType.ProcessingInstruction) + { + bool ignore = false; + + switch(reader.LocalName) + { + case "include": + // use regular expressions to parse out the attributes. + MatchCollection matches = includeFileRegex.Matches(reader.Value); + + // make sure there is only one file attribute. + if(matches.Count > 1) + { + throw new WarningException("An node was found, but it specified more than one file."); + } + + if(matches.Count == 0) + { + throw new WarningException("An node was found, but it did not specify the file attribute."); + } + + // ***** Adding for wildcard handling + // Push current reader back onto the stack. + readerStack.Push (reader); + + // Pull the file out from the regex and make sure it is a valid file before using it. + string filename = matches[0].Groups[1].Value; + + filename = String.Join (Path.DirectorySeparatorChar.ToString (), filename.Split (new char[] { '/', '\\' })); + + if (!filename.Contains ("*")) { + + FileInfo includeFile = new FileInfo (filename); + if (!includeFile.Exists) { + throw new WarningException ("Cannot include file: " + includeFile.FullName); + } + + // Create a new reader object for this file. Then put the old reader back on the stack and start + // processing using this new XML reader. + + XmlReader newReader = new XmlTextReader (includeFile.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); + reader = newReader; + readerStack.Push (reader); + + } else { + WildCardInclude (readerStack, filename); + } + + reader = (XmlReader)readerStack.Pop (); + ignore = true; + break; + + case "if": + m_IfStack.Push(context); + context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); + ignore = true; + break; + + case "elseif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + + context.State = IfState.ElseIf; + if(!context.EverKept) + { + context.Keep = ParseExpression(reader.Value); + } + else + { + context.Keep = false; + } + + ignore = true; + break; + + case "else": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + + context.State = IfState.Else; + context.Keep = !context.EverKept; + ignore = true; + break; + + case "endif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'endif' outside of 'if'"); + } + + context = m_IfStack.Pop(); + ignore = true; + break; + } + + if(ignore) + { + continue; + } + }//end pre-proc instruction + + if(!context.Active || !context.Keep) + { + continue; + } + + switch(reader.NodeType) + { + case XmlNodeType.Element: + bool empty = reader.IsEmptyElement; + writer.WriteStartElement(reader.Name); + + while (reader.MoveToNextAttribute()) + { + writer.WriteAttributeString(reader.Name, reader.Value); + } + + if(empty) + { + writer.WriteEndElement(); + } + + break; + + case XmlNodeType.EndElement: + writer.WriteEndElement(); + break; + + case XmlNodeType.Text: + writer.WriteString(reader.Value); + break; + + case XmlNodeType.CDATA: + writer.WriteCData(reader.Value); + break; + + default: + break; + } + } + + if(m_IfStack.Count != 0) + { + throw new WarningException("Mismatched 'if', 'endif' pair"); + } + } + + return xmlText.ToString(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Parse/IfContext.cs b/Prebuild/src/Core/Parse/IfContext.cs new file mode 100644 index 0000000000..3c79d38b06 --- /dev/null +++ b/Prebuild/src/Core/Parse/IfContext.cs @@ -0,0 +1,154 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +namespace Prebuild.Core.Parse +{ + /// + /// + /// + public enum IfState + { + /// + /// + /// + None, + /// + /// + /// + If, + /// + /// + /// + ElseIf, + /// + /// + /// + Else + } + + /// + /// Summary description for IfContext. + /// + // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) + public class IfContext + { + #region Properties + + bool m_Active; + bool m_Keep; + bool m_EverKept; + IfState m_State = IfState.None; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [active]. + /// if set to true [keep]. + /// The state. + public IfContext(bool active, bool keep, IfState state) + { + m_Active = active; + m_Keep = keep; + m_EverKept = keep; + m_State = state; + } + + #endregion + + #region Properties + + /// + /// Gets or sets a value indicating whether this is active. + /// + /// true if active; otherwise, false. + public bool Active + { + get + { + return m_Active; + } + set + { + m_Active = value; + } + } + + /// + /// Gets or sets a value indicating whether this is keep. + /// + /// true if keep; otherwise, false. + public bool Keep + { + get + { + return m_Keep; + } + set + { + m_Keep = value; + if(m_Keep) + { + m_EverKept = true; + } + } + } + + /// + /// Gets a value indicating whether [ever kept]. + /// + /// true if [ever kept]; otherwise, false. + public bool EverKept + { + get + { + return m_EverKept; + } + } + + /// + /// Gets or sets the state. + /// + /// The state. + public IfState State + { + get + { + return m_State; + } + set + { + m_State = value; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Parse/Preprocessor.cs b/Prebuild/src/Core/Parse/Preprocessor.cs new file mode 100644 index 0000000000..0648fad8d8 --- /dev/null +++ b/Prebuild/src/Core/Parse/Preprocessor.cs @@ -0,0 +1,652 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; + +namespace Prebuild.Core.Parse +{ + /// + /// + /// + public enum OperatorSymbol + { + /// + /// + /// + None, + /// + /// + /// + Equal, + /// + /// + /// + NotEqual, + /// + /// + /// + LessThan, + /// + /// + /// + GreaterThan, + /// + /// + /// + LessThanEqual, + /// + /// + /// + GreaterThanEqual + } + + /// + /// + /// + public class Preprocessor + { + #region Constants + + /// + /// Includes the regex to look for file tags in the processing instruction. + /// + private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); + + #endregion + + #region Fields + + readonly XmlDocument m_OutDoc = new XmlDocument(); + readonly Stack m_IfStack = new Stack(); + readonly Dictionary m_Variables = new Dictionary(); + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public Preprocessor() + { + RegisterVariable("OS", GetOS()); + RegisterVariable("RuntimeVersion", Environment.Version.Major); + RegisterVariable("RuntimeMajor", Environment.Version.Major); + RegisterVariable("RuntimeMinor", Environment.Version.Minor); + RegisterVariable("RuntimeRevision", Environment.Version.Revision); + } + + #endregion + + #region Properties + + /// + /// Gets the processed doc. + /// + /// The processed doc. + public XmlDocument ProcessedDoc + { + get + { + return m_OutDoc; + } + } + + #endregion + + #region Private Methods + + /// + /// Parts of this code were taken from NAnt and is subject to the GPL + /// as per NAnt's license. Thanks to the NAnt guys for this little gem. + /// + /// + public static string GetOS() + { + PlatformID platId = Environment.OSVersion.Platform; + if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) + { + return "Win32"; + } + + if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) + { + return "MACOSX"; + } + + /* + * .NET 1.x, under Mono, the UNIX code is 128. Under + * .NET 2.x, Mono or MS, the UNIX code is 4 + */ + if(Environment.Version.Major == 1) + { + if((int)platId == 128) + { + return "UNIX"; + } + } + else if((int)platId == 4) + { + return "UNIX"; + } + + return "Unknown"; + } + + private static bool CompareNum(OperatorSymbol oper, int val1, int val2) + { + switch(oper) + { + case OperatorSymbol.Equal: + return (val1 == val2); + case OperatorSymbol.NotEqual: + return (val1 != val2); + case OperatorSymbol.LessThan: + return (val1 < val2); + case OperatorSymbol.LessThanEqual: + return (val1 <= val2); + case OperatorSymbol.GreaterThan: + return (val1 > val2); + case OperatorSymbol.GreaterThanEqual: + return (val1 >= val2); + } + + throw new WarningException("Unknown operator type"); + } + + private static bool CompareStr(OperatorSymbol oper, string val1, string val2) + { + switch(oper) + { + case OperatorSymbol.Equal: + return (val1 == val2); + case OperatorSymbol.NotEqual: + return (val1 != val2); + case OperatorSymbol.LessThan: + return (val1.CompareTo(val2) < 0); + case OperatorSymbol.LessThanEqual: + return (val1.CompareTo(val2) <= 0); + case OperatorSymbol.GreaterThan: + return (val1.CompareTo(val2) > 0); + case OperatorSymbol.GreaterThanEqual: + return (val1.CompareTo(val2) >= 0); + } + + throw new WarningException("Unknown operator type"); + } + + private static char NextChar(int idx, string str) + { + if((idx + 1) >= str.Length) + { + return Char.MaxValue; + } + + return str[idx + 1]; + } + // Very very simple expression parser. Can only match expressions of the form + // : + // OS = Windows + // OS != Linux + // RuntimeMinor > 0 + private bool ParseExpression(string exp) + { + if(exp == null) + { + throw new ArgumentException("Invalid expression, cannot be null"); + } + + exp = exp.Trim(); + if(exp.Length < 1) + { + throw new ArgumentException("Invalid expression, cannot be 0 length"); + } + + string id = ""; + string str = ""; + OperatorSymbol oper = OperatorSymbol.None; + bool inStr = false; + + for(int i = 0; i < exp.Length; i++) + { + char c = exp[i]; + if(Char.IsWhiteSpace(c)) + { + continue; + } + + if(Char.IsLetterOrDigit(c) || c == '_') + { + if(inStr) + { + str += c; + } + else + { + id += c; + } + } + else if(c == '\"') + { + inStr = !inStr; + if(inStr) + { + str = ""; + } + } + else + { + if(inStr) + { + str += c; + } + else + { + switch(c) + { + case '=': + oper = OperatorSymbol.Equal; + break; + + case '!': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.NotEqual; + } + + break; + + case '<': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.LessThanEqual; + } + else + { + oper = OperatorSymbol.LessThan; + } + + break; + + case '>': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.GreaterThanEqual; + } + else + { + oper = OperatorSymbol.GreaterThan; + } + + break; + } + } + } + } + + + if(inStr) + { + throw new WarningException("Expected end of string in expression"); + } + + if(oper == OperatorSymbol.None) + { + throw new WarningException("Expected operator in expression"); + } + if(id.Length < 1) + { + throw new WarningException("Expected identifier in expression"); + } + if(str.Length < 1) + { + throw new WarningException("Expected value in expression"); + } + + bool ret; + try + { + object val = m_Variables[id.ToLower()]; + if(val == null) + { + throw new WarningException("Unknown identifier '{0}'", id); + } + + Type t = val.GetType(); + if(t.IsAssignableFrom(typeof(int))) + { + int numVal = (int)val; + int numVal2 = Int32.Parse(str); + ret = CompareNum(oper, numVal, numVal2); + } + else + { + string strVal = val.ToString(); + string strVal2 = str; + ret = CompareStr(oper, strVal, strVal2); + } + } + catch(ArgumentException ex) + { + ex.ToString(); + throw new WarningException("Invalid value type for system variable '{0}', expected int", id); + } + + return ret; + } + + /// + /// Taken from current Prebuild included in OpenSim 0.7.x + /// + /// + /// A + /// + /// + /// A + /// + private static void WildCardInclude (Stack readerStack, string include) + { + if (!include.Contains ("*")) { + return; + } + + // Console.WriteLine("Processing {0}", include); + + // Break up the include into pre and post wildcard sections + string preWildcard = include.Substring (0, include.IndexOf ("*")); + string postWildcard = include.Substring (include.IndexOf ("*") + 2); + + // If preWildcard is a directory, recurse + if (Directory.Exists (preWildcard)) { + string[] directories = Directory.GetDirectories (preWildcard); + Array.Sort (directories); + Array.Reverse (directories); + foreach (string dirPath in directories) { + //Console.WriteLine ("Scanning : {0}", dirPath); + + string includeFile = Path.Combine (dirPath, postWildcard); + if (includeFile.Contains ("*")) { + // postWildcard included another wildcard, recurse. + WildCardInclude (readerStack, includeFile); + } else { + FileInfo file = new FileInfo (includeFile); + if (file.Exists) { + //Console.WriteLine ("Including File: {0}", includeFile); + XmlReader newReader = new XmlTextReader (file.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); + readerStack.Push (newReader); + } + } + } + } else { + // preWildcard is not a path to a directory, so the wildcard is in the filename + string searchFilename = Path.GetFileName (preWildcard.Substring (preWildcard.IndexOf ("/") + 1) + "*" + postWildcard); + Console.WriteLine ("searchFilename: {0}", searchFilename); + + string searchDirectory = Path.GetDirectoryName (preWildcard); + Console.WriteLine ("searchDirectory: {0}", searchDirectory); + + string[] files = Directory.GetFiles (searchDirectory, searchFilename); + Array.Sort (files); + Array.Reverse (files); + foreach (string includeFile in files) { + FileInfo file = new FileInfo (includeFile); + if (file.Exists) { + // Console.WriteLine ("Including File: {0}", includeFile); + XmlReader newReader = new XmlTextReader (file.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); + readerStack.Push (newReader); + } + } + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + /// + public void RegisterVariable(string name, object variableValue) + { + if(name == null || variableValue == null) + { + return; + } + + m_Variables[name.ToLower()] = variableValue; + } + + /// + /// Performs validation on the xml source as well as evaluates conditional and flow expresions + /// + /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml + /// + /// the output xml + public string Process(XmlReader initialReader) + { + if(initialReader == null) + { + throw new ArgumentException("Invalid XML reader to pre-process"); + } + + IfContext context = new IfContext(true, true, IfState.None); + StringWriter xmlText = new StringWriter(); + XmlTextWriter writer = new XmlTextWriter(xmlText); + writer.Formatting = Formatting.Indented; + + // Create a queue of XML readers and add the initial + // reader to it. Then we process until we run out of + // readers which lets the operation add more + // readers to generate a multi-file parser and not require + // XML fragments that a recursive version would use. + Stack readerStack = new Stack(); + readerStack.Push(initialReader); + + while(readerStack.Count > 0) + { + // Pop off the next reader. + XmlReader reader = readerStack.Pop(); + + // Process through this XML reader until it is + // completed (or it is replaced by the include + // operation). + while(reader.Read()) + { + // The prebuild file has a series of processing + // instructions which allow for specific + // inclusions based on operating system or to + // include additional files. + if(reader.NodeType == XmlNodeType.ProcessingInstruction) + { + bool ignore = false; + + switch(reader.LocalName) + { + case "include": + // use regular expressions to parse out the attributes. + MatchCollection matches = includeFileRegex.Matches(reader.Value); + + // make sure there is only one file attribute. + if(matches.Count > 1) + { + throw new WarningException("An node was found, but it specified more than one file."); + } + + if(matches.Count == 0) + { + throw new WarningException("An node was found, but it did not specify the file attribute."); + } + + // ***** Adding for wildcard handling + // Push current reader back onto the stack. + readerStack.Push (reader); + + // Pull the file out from the regex and make sure it is a valid file before using it. + string filename = matches[0].Groups[1].Value; + + filename = String.Join (Path.DirectorySeparatorChar.ToString (), filename.Split (new char[] { '/', '\\' })); + + if (!filename.Contains ("*")) { + + FileInfo includeFile = new FileInfo (filename); + if (!includeFile.Exists) { + throw new WarningException ("Cannot include file: " + includeFile.FullName); + } + + // Create a new reader object for this file. Then put the old reader back on the stack and start + // processing using this new XML reader. + + XmlReader newReader = new XmlTextReader (includeFile.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); + reader = newReader; + readerStack.Push (reader); + + } else { + WildCardInclude (readerStack, filename); + } + + reader = (XmlReader)readerStack.Pop (); + ignore = true; + break; + + case "if": + m_IfStack.Push(context); + context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); + ignore = true; + break; + + case "elseif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + + context.State = IfState.ElseIf; + if(!context.EverKept) + { + context.Keep = ParseExpression(reader.Value); + } + else + { + context.Keep = false; + } + + ignore = true; + break; + + case "else": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + + context.State = IfState.Else; + context.Keep = !context.EverKept; + ignore = true; + break; + + case "endif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'endif' outside of 'if'"); + } + + context = m_IfStack.Pop(); + ignore = true; + break; + } + + if(ignore) + { + continue; + } + }//end pre-proc instruction + + if(!context.Active || !context.Keep) + { + continue; + } + + switch(reader.NodeType) + { + case XmlNodeType.Element: + bool empty = reader.IsEmptyElement; + writer.WriteStartElement(reader.Name); + + while (reader.MoveToNextAttribute()) + { + writer.WriteAttributeString(reader.Name, reader.Value); + } + + if(empty) + { + writer.WriteEndElement(); + } + + break; + + case XmlNodeType.EndElement: + writer.WriteEndElement(); + break; + + case XmlNodeType.Text: + writer.WriteString(reader.Value); + break; + + case XmlNodeType.CDATA: + writer.WriteCData(reader.Value); + break; + + default: + break; + } + } + + if(m_IfStack.Count != 0) + { + throw new WarningException("Mismatched 'if', 'endif' pair"); + } + } + + return xmlText.ToString(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.NAntTarget.cs.swp b/Prebuild/src/Core/Targets/.NAntTarget.cs.swp new file mode 100644 index 0000000000000000000000000000000000000000..afec61c43b04d6ac69560f541a6604494c9ed4a9 GIT binary patch literal 49152 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�{2lc8o?P?JQqvB(m^OHa8ArB1D#s(Cfl%wk&Z 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�gA0`GCJ*hl*_ z*#C|^yLtAJUD!3U)|ePyB4MI$spRI9!vE%Zmo5dV-EZ(iD%uq91@zXnHfRh+dch22ye_hCh=UurkjfPV(gD`Sy-3izz7$I6^7BkveuHN8fBsHz6v+tr=_ zh+|t0oth>IqmDW!r;Rk$o+Vx|(VkN{F148?xx-wUE_v--qvD>NT}bj~9v#-3BIA>o zu~eliwLP8I^LsiSRQLCYajM5dijB;g%amPEyrjnHZW>U0JMs+=z1m>hn4$fCECV-J zHg*1=sH|i1ANqfmKkq}&e*^d>unSxPE(4FD=idVkf}aNB=NJF}esD2(5s-NP{{_AQ z9s_>>J^=0quLb`Gd=)+a0dN}_1z$(c|5Gpvt^$_;ITzqhz(>JdK+X=l7W_x_{Jr2C z=<@PzK8de?7(MAiDN@R$HYRV>UizASiRehhNjy@cnA#dtBV-{WjfNz zNOY(Q6Vl5>UQD7_lB!)tQ>Y$C3bpZ^aAKcgk8MIz>n0tPQm8VE@K%mCZ%WaMwCSBT zZuOv!U1lm!X9dt{iz;?JXw2(jR`C!eJY~37?=kaT-E#Vgr5x7VL$gmzG2@uGdCawV zvrC!tVFJ|8lE)@dvrl!G3EM9*Bb z0qS}6w#X-p{G1$T@Ptv%yS#Jk_!CCHpx$Z5>&F5u@63gt>9m`+ZKJ$0P4dnpyoG^G zHru?VUJq714x6~K#KB-^fg)~J&Os~AP6lZ4Rog^1&`Aos>9Y-)U@14<8OF^Jx~FuaDF?`&75?|N>or-0%D}m1F*d`rHqjK- zDYu~vD$R0APh+PyPuJg|5+WU{f;D_4u+hg~vKCiNay)EiPCL!*FHFq@6ph~bCG^yw z`BtWRU(XS3I*?eu{L-!+&9CUs-n?aMizuOi1*PO+UEh|ZUI62#Q~gUv3X&}7`u1 zq>bn;8_W!YR%E>uA7sBz2aqjA*0>ZuzCzZ|{%n@XY(BDu(oR&XK!uluI`%9$3z!zr z-?yvntU3%W=E0z{H_*2ml8H9+Y)Z~H;4HR&yP`Nt0)|D=3HtaGiCUa*dgA$FEfCzx z*~1)k(2EB&IubfJFvFkT;W#lbe9|A)xJiztKBzm2g_Ej!$xl}Z-T z?;NPqGx7K6`kw-C1g`~$K^{B@d>g(0&%mSL%Ru)1 z*TDqX1)c-GfF0oT;1l3M@FuVah)v+L;4|PgAOrrv*aABIy#UC21MWrtzX{BN@1pZR z0v-l;gExVn27ieS;QiotfW+%hfL-99gL|+E$oYT^;8yT5unl}1`#>E$j&0y|;5ax4 ztndG?u@k%zEQ2H97Vu;21#bhlgC(#C&Ij+tcJS{&8_0VFUI2a%8NLy`5{Nu+2ZKM- zJVRA!rrXf9(RDU}Xq%R3>l9H_D%3t@UbMY{%Hv83UfRx9q?} z;pRp3$y_F+KAmgvBtX{(@?0fhbi+*5J_Pp%=csp_2J(W3#| zcTcEjqMGtb;|YI)pfC8e|2oNY(FuBB86AGQRI35z~z()4UJu=TDGI|fbXa=H!?@4RudkKwOsm?D{uml zFN5`zRe~{N3p-zHmXF)QjktArJ9Y(YQMcq?iYQJUBRxQvl7U2fvQ38|5|Ji{gv+Z? zhJA^lVVSA>rIyrY>)bIhJoIbd`L4)By5ed!3T`C1Je5v;2 zw+DG&wCgPLCL5>ZEb#_yr{L8^E~!bDfn-m|1i7NAFW+m-BUUW{A`s z5chq+XfO6Tt-}{d zH|)p1q$iZn!Aib^HG0M`V}_o5%@iCuxW`iTPX;owABiI;XST}b4{0K%YWtkoDg%`s zzGa5;X{miqbLPw-Lm`FOdG*lVRG?@L>5uy+y&Cb&GoeA>+}E)6dw~abfHe3iFakb{PJbtm_XCcC@1V#3K6o1_gBOAy zpu@i%{5qHh63c%Nkn{Amg3qJN{|?B35%3uL`!9nUxCT5MJdW=E5RiBP(d&N^$bS2O z1^xgXehPdRS$qbFOb&@$Ht`9DUCDQ*uIMK`V3@m6bNpI!ih7$vsw}P_J*Fq3*{nNf ziH*TruyL#6rgM~cZ~)0z50SD!PpQ*JWr1otsCrLf;HL={pu27==ZJ|e?r>A%u!$kx zQ)zyMskMYDN=l}XG|S{tEoJ;Geg#E|mSxYnb1Eh@G(MCt{;E*ze`oEx>r1izRFX0z ztC-r7G;yE7<%m8J%EfD?@@|P;!5r}~^I0@;zu&!)k^NG##N@1oBpJ=Q?(w8L31j<} z-P2q8J!h|n*d3kNvVA)vy4p-w(E<3Z6rAnbrTr)I>DI^833g^_V2KR+yS}2B!vG8F z6h09duYvMfW+fiHnp}{XX;6l8Z+)4rMa6NL5Z%HO+Z)OQkLOWY_2!YuBbZ45R3tY$MUdPOa3+o<5Yh>ga@124~qZpLl|R_HdBeH<0yEQ(qhMTwmZ$^30E%c@7o94=MtyXFht^f + /// + /// + [Target("autotools")] + public class AutotoolsTarget : ITarget + { + #region Fields + + Kernel m_Kernel; + XmlDocument autotoolsDoc; + XmlUrlResolver xr; + System.Security.Policy.Evidence e; + readonly Dictionary assemblyPathToPackage = new Dictionary(); + readonly Dictionary assemblyFullNameToPath = new Dictionary(); + readonly Dictionary packagesHash = new Dictionary(); + readonly List packages = new List(); + + #endregion + + #region Private Methods + + private static void mkdirDashP(string dirName) + { + DirectoryInfo di = new DirectoryInfo(dirName); + if (di.Exists) + return; + + string parentDirName = System.IO.Path.GetDirectoryName(dirName); + DirectoryInfo parentDi = new DirectoryInfo(parentDirName); + if (!parentDi.Exists) + mkdirDashP(parentDirName); + + di.Create(); + } + + private static void chkMkDir(string dirName) + { + System.IO.DirectoryInfo di = + new System.IO.DirectoryInfo(dirName); + + if (!di.Exists) + di.Create(); + } + + private void transformToFile(string filename, XsltArgumentList argList, string nodeName) + { + // Create an XslTransform for this file + XslTransform templateTransformer = + new XslTransform(); + + // Load up the template + XmlNode templateNode = + autotoolsDoc.SelectSingleNode(nodeName + "/*"); + templateTransformer.Load(templateNode.CreateNavigator(), xr, e); + + // Create a writer for the transformed template + XmlTextWriter templateWriter = + new XmlTextWriter(filename, null); + + // Perform transformation, writing the file + templateTransformer.Transform + (m_Kernel.CurrentDoc, argList, templateWriter, xr); + } + + static string NormalizeAsmName(string name) + { + int i = name.IndexOf(", PublicKeyToken=null"); + if (i != -1) + return name.Substring(0, i).Trim(); + return name; + } + + private void AddAssembly(string assemblyfile, SystemPackage package) + { + if (!File.Exists(assemblyfile)) + return; + + try + { + System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); + assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; + assemblyPathToPackage[assemblyfile] = package; + } + catch + { + } + } + + private static List GetAssembliesWithLibInfo(string line, string file) + { + List references = new List(); + List libdirs = new List(); + List retval = new List(); + foreach (string piece in line.Split(' ')) + { + if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) + { + references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); + } + else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) + { + libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); + } + } + + foreach (string refrnc in references) + { + foreach (string libdir in libdirs) + { + if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) + { + retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); + } + } + } + + return retval; + } + + private static List GetAssembliesWithoutLibInfo(string line, string file) + { + List references = new List(); + foreach (string reference in line.Split(' ')) + { + if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) + { + string final_ref = reference.Substring(3).Trim(); + references.Add(ProcessPiece(final_ref, file)); + } + } + return references; + } + + private static string ProcessPiece(string piece, string pcfile) + { + int start = piece.IndexOf("${"); + if (start == -1) + return piece; + + int end = piece.IndexOf("}"); + if (end == -1) + return piece; + + string variable = piece.Substring(start + 2, end - start - 2); + string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); + return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); + } + + private static string GetVariableFromPkgConfig(string var, string pcfile) + { + ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); + psi.RedirectStandardOutput = true; + psi.UseShellExecute = false; + psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); + Process p = new Process(); + p.StartInfo = psi; + p.Start(); + string ret = p.StandardOutput.ReadToEnd().Trim(); + p.WaitForExit(); + if (String.IsNullOrEmpty(ret)) + return String.Empty; + return ret; + } + + private void ParsePCFile(string pcfile) + { + // Don't register the package twice + string pname = Path.GetFileNameWithoutExtension(pcfile); + if (packagesHash.ContainsKey(pname)) + return; + + List fullassemblies = null; + string version = ""; + string desc = ""; + + SystemPackage package = new SystemPackage(); + + using (StreamReader reader = new StreamReader(pcfile)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + string lowerLine = line.ToLower(); + if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) + { + string choppedLine = line.Substring(5).Trim(); + if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) + { + fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); + } + else + { + fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); + } + } + else if (lowerLine.StartsWith("version:")) + { + // "version:".Length == 8 + version = line.Substring(8).Trim(); + } + else if (lowerLine.StartsWith("description:")) + { + // "description:".Length == 12 + desc = line.Substring(12).Trim(); + } + } + } + + if (fullassemblies == null) + return; + + foreach (string assembly in fullassemblies) + { + AddAssembly(assembly, package); + } + + package.Initialize(pname, + version, + desc, + fullassemblies.ToArray(), + ClrVersion.Default, + false); + packages.Add(package); + packagesHash[pname] = package; + } + + void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) + { + SystemPackage package = new SystemPackage(); + List list = new List(); + + string dir = Path.Combine(prefix, version); + if (!Directory.Exists(dir)) + { + return; + } + + foreach (string assembly in Directory.GetFiles(dir, "*.dll")) + { + AddAssembly(assembly, package); + list.Add(assembly); + } + + package.Initialize("mono", + version, + "The Mono runtime", + list.ToArray(), + ver, + false); + packages.Add(package); + } + + void RunInitialization() + { + string versionDir; + + if (Environment.Version.Major == 1) + { + versionDir = "1.0"; + } + else + { + versionDir = "2.0"; + } + + //Pull up assemblies from the installed mono system. + string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); + + if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) + prefix = Path.Combine(prefix, "mono"); + else + prefix = Path.GetDirectoryName(prefix); + + RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); + RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); + + string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); + string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); + + if (String.IsNullOrEmpty(libpath)) + { + string path_dirs = Environment.GetEnvironmentVariable("PATH"); + foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) + { + if (pathdir == null) + continue; + if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) + { + libpath = Path.Combine(pathdir, ".."); + libpath = Path.Combine(libpath, "lib"); + libpath = Path.Combine(libpath, "pkgconfig"); + break; + } + } + } + search_dirs += Path.PathSeparator + libpath; + if (!string.IsNullOrEmpty(search_dirs)) + { + List scanDirs = new List(); + foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) + { + if (!scanDirs.Contains(potentialDir)) + scanDirs.Add(potentialDir); + } + foreach (string pcdir in scanDirs) + { + if (pcdir == null) + continue; + + if (Directory.Exists(pcdir)) + { + foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) + { + ParsePCFile(pcfile); + } + } + } + } + } + + private void WriteCombine(SolutionNode solution) + { + #region "Create Solution directory if it doesn't exist" + string solutionDir = Path.Combine(solution.FullPath, + Path.Combine("autotools", + solution.Name)); + chkMkDir(solutionDir); + #endregion + + #region "Write Solution-level files" + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("solutionName", "", solution.Name); + // $solutionDir is $rootDir/$solutionName/ + transformToFile(Path.Combine(solutionDir, "configure.ac"), + argList, "/Autotools/SolutionConfigureAc"); + transformToFile(Path.Combine(solutionDir, "Makefile.am"), + argList, "/Autotools/SolutionMakefileAm"); + transformToFile(Path.Combine(solutionDir, "autogen.sh"), + argList, "/Autotools/SolutionAutogenSh"); + #endregion + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + m_Kernel.Log.Write(String.Format("Writing project: {0}", + project.Name)); + WriteProject(solution, project); + } + } + + private static string FindFileReference(string refName, + ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = + Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + if (path == null) + { + return ""; + } + + StringBuilder tmpPath; + + if (Core.Parse.Preprocessor.GetOS() == "Win32") + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath.Replace("/", @"\\"); + } + else + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); + } + return tmpPath.ToString(); + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); + string projectDir = Path.Combine(solutionDir, project.Name); + string projectVersion = project.Version; + bool hasAssemblyConfig = false; + chkMkDir(projectDir); + + List + compiledFiles = new List(), + contentFiles = new List(), + embeddedFiles = new List(), + + binaryLibs = new List(), + pkgLibs = new List(), + systemLibs = new List(), + runtimeLibs = new List(), + + extraDistFiles = new List(), + localCopyTargets = new List(); + + // If there exists a .config file for this assembly, copy + // it to the project folder + + // TODO: Support copying .config.osx files + // TODO: support processing the .config file for native library deps + string projectAssemblyName = project.Name; + if (project.AssemblyName != null) + projectAssemblyName = project.AssemblyName; + + if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) + { + hasAssemblyConfig = true; + System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); + extraDistFiles.Add(project.AssemblyName + ".dll.config"); + } + + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != string.Empty) + { + // Copy snk file into the project's directory + // Use the snk from the project directory directly + string source = Path.Combine(project.FullPath, conf.Options.KeyFile); + string keyFile = conf.Options.KeyFile; + Regex re = new Regex(".*/"); + keyFile = re.Replace(keyFile, ""); + + string dest = Path.Combine(projectDir, keyFile); + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + } + } + + // Copy compiled, embedded and content files into the project's directory + foreach (string filename in project.Files) + { + string source = Path.Combine(project.FullPath, filename); + string dest = Path.Combine(projectDir, filename); + + if (filename.Contains("AssemblyInfo.cs")) + { + // If we've got an AssemblyInfo.cs, pull the version number from it + string[] sources = { source }; + string[] args = { "" }; + Microsoft.CSharp.CSharpCodeProvider cscp = + new Microsoft.CSharp.CSharpCodeProvider(); + + string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); + System.CodeDom.Compiler.CompilerParameters cparam = + new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); + + System.CodeDom.Compiler.CompilerResults cr = + cscp.CompileAssemblyFromFile(cparam, sources); + + foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) + Console.WriteLine("Error! '{0}'", error.ErrorText); + + try { + string projectFullName = cr.CompiledAssembly.FullName; + Regex verRegex = new Regex("Version=([\\d\\.]+)"); + Match verMatch = verRegex.Match(projectFullName); + if (verMatch.Success) + projectVersion = verMatch.Groups[1].Value; + }catch{ + Console.WriteLine("Couldn't compile AssemblyInfo.cs"); + } + + // Clean up the temp file + try + { + if (File.Exists(tempAssemblyFile)) + File.Delete(tempAssemblyFile); + } + catch + { + Console.WriteLine("Error! '{0}'", e); + } + + } + + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + + switch (project.Files.GetBuildAction(filename)) + { + case BuildAction.Compile: + compiledFiles.Add(filename); + break; + case BuildAction.Content: + contentFiles.Add(filename); + extraDistFiles.Add(filename); + break; + case BuildAction.EmbeddedResource: + embeddedFiles.Add(filename); + break; + } + } + + // Set up references + for (int refNum = 0; refNum < project.References.Count; refNum++) + { + ReferenceNode refr = project.References[refNum]; + Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); + + /* Determine which pkg-config (.pc) file refers to + this assembly */ + + SystemPackage package = null; + + if (packagesHash.ContainsKey(refr.Name)) + { + package = packagesHash[refr.Name]; + + } + else + { + string assemblyFullName = string.Empty; + if (refAssembly != null) + assemblyFullName = refAssembly.FullName; + + string assemblyFileName = string.Empty; + if (assemblyFullName != string.Empty && + assemblyFullNameToPath.ContainsKey(assemblyFullName) + ) + assemblyFileName = + assemblyFullNameToPath[assemblyFullName]; + + if (assemblyFileName != string.Empty && + assemblyPathToPackage.ContainsKey(assemblyFileName) + ) + package = assemblyPathToPackage[assemblyFileName]; + + } + + /* If we know the .pc file and it is not "mono" + (already in the path), add a -pkg: argument */ + + if (package != null && + package.Name != "mono" && + !pkgLibs.Contains(package.Name) + ) + pkgLibs.Add(package.Name); + + string fileRef = + FindFileReference(refr.Name, (ProjectNode)refr.Parent); + + if (refr.LocalCopy || + solution.ProjectsTable.ContainsKey(refr.Name) || + fileRef != null || + refr.Path != null + ) + { + + /* Attempt to copy the referenced lib to the + project's directory */ + + string filename = refr.Name + ".dll"; + string source = filename; + if (refr.Path != null) + source = Path.Combine(refr.Path, source); + source = Path.Combine(project.FullPath, source); + string dest = Path.Combine(projectDir, filename); + + /* Since we depend on this binary dll to build, we + * will add a compile- time dependency on the + * copied dll, and add the dll to the list of + * files distributed with this package + */ + + binaryLibs.Add(refr.Name + ".dll"); + extraDistFiles.Add(refr.Name + ".dll"); + + // TODO: Support copying .config.osx files + // TODO: Support for determining native dependencies + if (File.Exists(source + ".config")) + { + System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); + extraDistFiles.Add(refr.Name + ".dll.config"); + } + + try + { + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException) + { + if (solution.ProjectsTable.ContainsKey(refr.Name)){ + + /* If an assembly is referenced, marked for + * local copy, in the list of projects for + * this solution, but does not exist, put a + * target into the Makefile.am to build the + * assembly and copy it to this project's + * directory + */ + + ProjectNode sourcePrj = + ((solution.ProjectsTable[refr.Name])); + + string target = + String.Format("{0}:\n" + + "\t$(MAKE) -C ../{1}\n" + + "\tln ../{2}/$@ $@\n", + filename, + sourcePrj.Name, + sourcePrj.Name ); + + localCopyTargets.Add(target); + } + } + } + else if( !pkgLibs.Contains(refr.Name) ) + { + // Else, let's assume it's in the GAC or the lib path + string assemName = string.Empty; + int index = refr.Name.IndexOf(","); + + if (index > 0) + assemName = refr.Name.Substring(0, index); + else + assemName = refr.Name; + + m_Kernel.Log.Write(String.Format( + "Warning: Couldn't find an appropriate assembly " + + "for reference:\n'{0}'", refr.Name + )); + systemLibs.Add(assemName); + } + } + + const string lineSep = " \\\n\t"; + string compiledFilesString = string.Empty; + if (compiledFiles.Count > 0) + compiledFilesString = + lineSep + string.Join(lineSep, compiledFiles.ToArray()); + + string embeddedFilesString = ""; + if (embeddedFiles.Count > 0) + embeddedFilesString = + lineSep + string.Join(lineSep, embeddedFiles.ToArray()); + + string contentFilesString = ""; + if (contentFiles.Count > 0) + contentFilesString = + lineSep + string.Join(lineSep, contentFiles.ToArray()); + + string extraDistFilesString = ""; + if (extraDistFiles.Count > 0) + extraDistFilesString = + lineSep + string.Join(lineSep, extraDistFiles.ToArray()); + + string pkgLibsString = ""; + if (pkgLibs.Count > 0) + pkgLibsString = + lineSep + string.Join(lineSep, pkgLibs.ToArray()); + + string binaryLibsString = ""; + if (binaryLibs.Count > 0) + binaryLibsString = + lineSep + string.Join(lineSep, binaryLibs.ToArray()); + + string systemLibsString = ""; + if (systemLibs.Count > 0) + systemLibsString = + lineSep + string.Join(lineSep, systemLibs.ToArray()); + + string localCopyTargetsString = ""; + if (localCopyTargets.Count > 0) + localCopyTargetsString = + string.Join("\n", localCopyTargets.ToArray()); + + string monoPath = ""; + foreach (string runtimeLib in runtimeLibs) + { + monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; + } + + // Add the project name to the list of transformation + // parameters + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("projectName", "", project.Name); + argList.AddParam("solutionName", "", solution.Name); + argList.AddParam("assemblyName", "", projectAssemblyName); + argList.AddParam("compiledFiles", "", compiledFilesString); + argList.AddParam("embeddedFiles", "", embeddedFilesString); + argList.AddParam("contentFiles", "", contentFilesString); + argList.AddParam("extraDistFiles", "", extraDistFilesString); + argList.AddParam("pkgLibs", "", pkgLibsString); + argList.AddParam("binaryLibs", "", binaryLibsString); + argList.AddParam("systemLibs", "", systemLibsString); + argList.AddParam("monoPath", "", monoPath); + argList.AddParam("localCopyTargets", "", localCopyTargetsString); + argList.AddParam("projectVersion", "", projectVersion); + argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); + + // Transform the templates + transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); + transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); + transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); + + if (project.Type == Core.Nodes.ProjectType.Library) + transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); + if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) + transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + m_Kernel.Log.Write("Parsing system pkg-config files"); + RunInitialization(); + + const string streamName = "autotools.xml"; + string fqStreamName = String.Format("Prebuild.data.{0}", + streamName + ); + + // Retrieve stream for the autotools template XML + Stream autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(fqStreamName); + + if(autotoolsStream == null) { + + /* + * try without the default namespace prepended, in + * case prebuild.exe assembly was compiled with + * something other than Visual Studio .NET + */ + + autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(streamName); + if(autotoolsStream == null){ + string errStr = + String.Format("Could not find embedded resource file:\n" + + "'{0}' or '{1}'", + streamName, fqStreamName + ); + + m_Kernel.Log.Write(errStr); + + throw new System.Reflection.TargetException(errStr); + } + } + + // Create an XML URL Resolver with default credentials + xr = new System.Xml.XmlUrlResolver(); + xr.Credentials = CredentialCache.DefaultCredentials; + + // Create a default evidence - no need to limit access + e = new System.Security.Policy.Evidence(); + + // Load the autotools XML + autotoolsDoc = new XmlDocument(); + autotoolsDoc.Load(autotoolsStream); + + /* rootDir is the filesystem location where the Autotools + * build tree will be created - for now we'll make it + * $PWD/autotools + */ + + string pwd = Directory.GetCurrentDirectory(); + //string pwd = System.Environment.GetEnvironmentVariable("PWD"); + //if (pwd.Length != 0) + //{ + string rootDir = Path.Combine(pwd, "autotools"); + //} + //else + //{ + // pwd = Assembly.GetExecutingAssembly() + //} + chkMkDir(rootDir); + + foreach (SolutionNode solution in kern.Solutions) + { + m_Kernel.Log.Write(String.Format("Writing solution: {0}", + solution.Name)); + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "autotools"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base new file mode 100644 index 0000000000..3494c303d4 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base @@ -0,0 +1,102 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author$ + * $Date$ + * $Revision$ + */ +#endregion + +using System; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; + +#if (DEBUG && _DEBUG_TARGET) +namespace Prebuild.Core.Targets +{ + [Target("debug")] + public class DebugTarget : ITarget + { +#region Fields + + private Kernel m_Kernel = null; + +#endregion + +#region ITarget Members + + public void Write() + { + foreach(SolutionNode s in m_Kernel.Solutions) + { + Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); + foreach(string file in s.Files) +{ + Console.WriteLine("\tFile [ {0} ]", file); +} + + foreach(ProjectNode proj in s.Projects) + { + Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); + foreach(string file in proj.Files) + Console.WriteLine("\t\tFile [ {0} ]", file); + } + } + } + + public void Clean() + { + Console.WriteLine("Not implemented"); + } + + public string Name + { + get + { + return "debug"; + } + } + + public Kernel Kernel + { + get + { + return m_Kernel; + } + set + { + m_Kernel = value; + } + } + +#endregion + } +} +#endif diff --git a/Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base new file mode 100644 index 0000000000..54046dd9bb --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base @@ -0,0 +1,469 @@ +#region BSD License +/* +Copyright (c) 2004 Crestez Leonard (cleonard@go.ro) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + [Target("makefile")] + public class MakefileTarget : ITarget + { + #region Fields + + private Kernel m_Kernel = null; + + #endregion + + #region Private Methods + + // This converts a path relative to the path of a project to + // a path relative to the solution path. + private string NicePath(ProjectNode proj, string path) + { + string res; + SolutionNode solution = (SolutionNode)proj.Parent; + res = Path.Combine(Helper.NormalizePath(proj.FullPath, '/'), Helper.NormalizePath(path, '/')); + res = Helper.NormalizePath(res, '/'); + res = res.Replace("/./", "/"); + while (res.IndexOf("/../") >= 0) + { + int a = res.IndexOf("/../"); + int b = res.LastIndexOf("/", a - 1); + res = res.Remove(b, a - b + 3); + } + res = Helper.MakePathRelativeTo(solution.FullPath, res); + if (res.StartsWith("./")) + res = res.Substring(2, res.Length - 2); + res = Helper.NormalizePath(res, '/'); + return res; + } + + private void WriteProjectFiles(StreamWriter f, SolutionNode solution, ProjectNode project) + { + // Write list of source code files + f.WriteLine("SOURCES_{0} = \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.Compile) + f.WriteLine("\t{0} \\", NicePath(project, file)); + f.WriteLine(); + + // Write list of resource files + f.WriteLine("RESOURCES_{0} = \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) + { + string path = NicePath(project, file); + f.WriteLine("\t-resource:{0},{1} \\", path, Path.GetFileName(path)); + } + f.WriteLine(); + + // There's also Content and None in BuildAction. + // What am I supposed to do with that? + } + + private string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = NicePath(project, Helper.MakeFilePath(refPath.Path, refName, "dll")); + if (File.Exists(fullPath)) + return fullPath; + } + return null; + } + + private void WriteProjectReferences(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("REFERENCES_{0} = \\", project.Name); + foreach (ReferenceNode refr in project.References) + { + string path; + // Project references change with configurations. + if (solution.ProjectsTable.ContainsKey(refr.Name)) + continue; + path = FindFileReference(refr.Name, project); + if (path != null) + f.WriteLine("\t-r:{0} \\", path); + else + f.WriteLine("\t-r:{0} \\", refr.Name); + } + f.WriteLine(); + } + + private void WriteProjectDependencies(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("DEPENDENCIES_{0} = \\", project.Name); + f.WriteLine("\t$(SOURCES_{0}) \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) + f.WriteLine("\t{0} \\", NicePath(project, file)); + f.WriteLine(); + } + + private string ProjectTypeToExtension(ProjectType t) + { + if (t == ProjectType.Exe || t == ProjectType.WinExe) + { + return "exe"; + } + else if (t == ProjectType.Library) + { + return "dll"; + } + else + { + throw new FatalException("Bad ProjectType: {0}", t); + } + } + + private string ProjectTypeToTarget(ProjectType t) + { + if (t == ProjectType.Exe) + { + return "exe"; + } + else if (t == ProjectType.WinExe) + { + return "winexe"; + } + else if (t == ProjectType.Library) + { + return "library"; + } + else + { + throw new FatalException("Bad ProjectType: {0}", t); + } + } + + private string ProjectOutput(ProjectNode project, ConfigurationNode config) + { + string filepath; + filepath = Helper.MakeFilePath((string)config.Options["OutputPath"], + project.AssemblyName, ProjectTypeToExtension(project.Type)); + return NicePath(project, filepath); + } + + // Returns true if two configs in one project have the same output. + private bool ProjectClashes(ProjectNode project) + { + foreach (ConfigurationNode conf1 in project.Configurations) + foreach (ConfigurationNode conf2 in project.Configurations) + if (ProjectOutput(project, conf1) == ProjectOutput(project, conf2) && conf1 != conf2) + { + m_Kernel.Log.Write("Warning: Configurations {0} and {1} for project {2} output the same file", + conf1.Name, conf2.Name, project.Name); + m_Kernel.Log.Write("Warning: I'm going to use some timestamps(extra empty files)."); + return true; + } + return false; + } + + private void WriteProject(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("# This is for project {0}", project.Name); + f.WriteLine(); + + WriteProjectFiles(f, solution, project); + WriteProjectReferences(f, solution, project); + WriteProjectDependencies(f, solution, project); + + bool clash = ProjectClashes(project); + + foreach (ConfigurationNode conf in project.Configurations) + { + string outpath = ProjectOutput(project, conf); + string filesToClean = outpath; + + if (clash) + { + f.WriteLine("{0}-{1}: .{0}-{1}-timestamp", project.Name, conf.Name); + f.WriteLine(); + f.Write(".{0}-{1}-timestamp: $(DEPENDENCIES_{0})", project.Name, conf.Name); + } + else + { + f.WriteLine("{0}-{1}: {2}", project.Name, conf.Name, outpath); + f.WriteLine(); + f.Write("{2}: $(DEPENDENCIES_{0})", project.Name, conf.Name, outpath); + } + // Dependencies on other projects. + foreach (ReferenceNode refr in project.References) + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + if (ProjectClashes(refProj)) + f.Write(" .{0}-{1}-timestamp", refProj.Name, conf.Name); + else + f.Write(" {0}", ProjectOutput(refProj, conf)); + } + f.WriteLine(); + + // make directory for output. + if (Path.GetDirectoryName(outpath) != "") + { + f.WriteLine("\tmkdir -p {0}", Path.GetDirectoryName(outpath)); + } + // mcs command line. + f.Write("\tgmcs", project.Name); + f.Write(" -warn:{0}", conf.Options["WarningLevel"]); + if ((bool)conf.Options["DebugInformation"]) + f.Write(" -debug"); + if ((bool)conf.Options["AllowUnsafe"]) + f.Write(" -unsafe"); + if ((bool)conf.Options["CheckUnderflowOverflow"]) + f.Write(" -checked"); + if (project.StartupObject != "") + f.Write(" -main:{0}", project.StartupObject); + if ((string)conf.Options["CompilerDefines"] != "") + { + f.Write(" -define:\"{0}\"", conf.Options["CompilerDefines"]); + } + + f.Write(" -target:{0} -out:{1}", ProjectTypeToTarget(project.Type), outpath); + + // Build references to other projects. Now that sux. + // We have to reference the other project in the same conf. + foreach (ReferenceNode refr in project.References) + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProj; + refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + f.Write(" -r:{0}", ProjectOutput(refProj, conf)); + } + + f.Write(" $(REFERENCES_{0})", project.Name); + f.Write(" $(RESOURCES_{0})", project.Name); + f.Write(" $(SOURCES_{0})", project.Name); + f.WriteLine(); + + // Copy references with localcopy. + foreach (ReferenceNode refr in project.References) + if (refr.LocalCopy) + { + string outPath, srcPath, destPath; + outPath = Helper.NormalizePath((string)conf.Options["OutputPath"]); + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProj; + refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + srcPath = ProjectOutput(refProj, conf); + destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); + destPath = NicePath(project, destPath); + if (srcPath != destPath) + { + f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); + filesToClean += " " + destPath; + } + continue; + } + srcPath = FindFileReference(refr.Name, project); + if (srcPath != null) + { + destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); + destPath = NicePath(project, destPath); + f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); + filesToClean += " " + destPath; + } + } + + if (clash) + { + filesToClean += String.Format(" .{0}-{1}-timestamp", project.Name, conf.Name); + f.WriteLine("\ttouch .{0}-{1}-timestamp", project.Name, conf.Name); + f.Write("\trm -rf"); + foreach (ConfigurationNode otherConf in project.Configurations) + if (otherConf != conf) + f.WriteLine(" .{0}-{1}-timestamp", project.Name, otherConf.Name); + f.WriteLine(); + } + f.WriteLine(); + f.WriteLine("{0}-{1}-clean:", project.Name, conf.Name); + f.WriteLine("\trm -rf {0}", filesToClean); + f.WriteLine(); + } + } + + private void WriteIntro(StreamWriter f, SolutionNode solution) + { + f.WriteLine("# Makefile for {0} generated by Prebuild ( http://dnpb.sf.net )", solution.Name); + f.WriteLine("# Do not edit."); + f.WriteLine("#"); + + f.Write("# Configurations:"); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}", conf.Name); + f.WriteLine(); + + f.WriteLine("# Projects:"); + foreach (ProjectNode proj in solution.Projects) + f.WriteLine("#\t{0}", proj.Name); + + f.WriteLine("#"); + f.WriteLine("# Building:"); + f.WriteLine("#\t\"make\" to build everything under the default(first) configuration"); + f.WriteLine("#\t\"make CONF\" to build every project under configuration CONF"); + f.WriteLine("#\t\"make PROJ\" to build project PROJ under the default(first) configuration"); + f.WriteLine("#\t\"make PROJ-CONF\" to build project PROJ under configuration CONF"); + f.WriteLine("#"); + f.WriteLine("# Cleaning (removing results of build):"); + f.WriteLine("#\t\"make clean\" to clean everything, that's what you probably want"); + f.WriteLine("#\t\"make CONF\" to clean everything for a configuration"); + f.WriteLine("#\t\"make PROJ\" to clean everything for a project"); + f.WriteLine("#\t\"make PROJ-CONF\" to clea project PROJ under configuration CONF"); + f.WriteLine(); + } + + private void WritePhony(StreamWriter f, SolutionNode solution) + { + string defconf = ""; + foreach (ConfigurationNode conf in solution.Configurations) + { + defconf = conf.Name; + break; + } + + f.Write(".PHONY: all"); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0} {0}-clean", proj.Name); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0} {0}-clean", conf.Name); + foreach (ProjectNode proj in solution.Projects) + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}-{1} {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + + f.WriteLine("all: {0}", defconf); + f.WriteLine(); + + f.Write("clean:"); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}-clean", conf.Name); + f.WriteLine(); + f.WriteLine(); + + foreach (ConfigurationNode conf in solution.Configurations) + { + f.Write("{0}: ", conf.Name); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0}-{1}", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + + f.Write("{0}-clean: ", conf.Name); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + } + + foreach (ProjectNode proj in solution.Projects) + { + f.WriteLine("{0}: {0}-{1}", proj.Name, defconf); + f.WriteLine(); + + f.Write("{0}-clean:", proj.Name); + foreach (ConfigurationNode conf in proj.Configurations) + f.Write(" {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + } + } + + private void WriteSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Creating makefile for {0}", solution.Name); + m_Kernel.CurrentWorkingDirectory.Push(); + + string file = "Makefile";// Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); + StreamWriter f = new StreamWriter(file); + + Helper.SetCurrentDir(Path.GetDirectoryName(file)); + + using (f) + { + WriteIntro(f, solution); + WritePhony(f, solution); + + foreach (ProjectNode project in solution.Projects) + { + m_Kernel.Log.Write("...Creating Project: {0}", project.Name); + WriteProject(f, solution, project); + } + } + + m_Kernel.Log.Write(""); + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning makefile for {0}", solution.Name); + + string file = Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); + Helper.DeleteIfExists(file); + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + public void Write(Kernel kern) + { + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + WriteSolution(solution); + m_Kernel = null; + } + + public virtual void Clean(Kernel kern) + { + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + CleanSolution(sol); + m_Kernel = null; + } + + public string Name + { + get + { + return "makefile"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base new file mode 100644 index 0000000000..ea6d2c2233 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base @@ -0,0 +1,515 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("monodev")] + public class MonoDevelopTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + { + tmpPath = Helper.NormalizePath(tmpPath); + } + else + { + tmpPath = Helper.NormalizePath("./" + tmpPath); + } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if(refr.Path != null || fileRef != null) + { + ret += "Assembly\" refto=\""; + + string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; + + ret += finalPath; + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + return ret; + } + + ret += "Gac\""; + ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; + ret += " refto=\""; + try + { + /* + Day changed to 28 Mar 2007 + ... + 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? + 08:09 < jonp> no + 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the + ability to load any assembly version by-name was an inherently + bad idea + 08:11 < cj> I'm thinking of a bunch of four-letter words right now... + 08:11 < cj> security through making it difficult for the developer!!! + 08:12 < jonp> just use the Obsolete API + 08:12 < jonp> it should still work + 08:12 < cj> alrighty. + 08:12 < jonp> you just get warnings when using it + */ + Assembly assem = Assembly.LoadWithPartialName(refr.Name); + ret += assem.FullName; + //ret += refr.Name; + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name; + } + ret += "\" />"; + } + + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if(File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + { + return "False"; + } + return "True"; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string csComp = "Mcs"; + string netRuntime = "Mono"; + if(project.Runtime == ClrRuntime.Microsoft) + { + csComp = "Csc"; + netRuntime = "MsNet"; + } + + string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + + using(ss) + { + ss.WriteLine( + "", + project.Name, + project.RootNamespace + ); + + int count = 0; + + ss.WriteLine(" ", solution.ActiveConfig); + + foreach(ConfigurationNode conf in project.Configurations) + { + ss.WriteLine(" ", conf.Name); + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + + ss.Write(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(string file in project.Files) + { + string buildAction; + string dependson = ""; + string resource_id = ""; + string copyToOutput = ""; + + switch(project.Files.GetBuildAction(file)) + { + case BuildAction.None: + buildAction = "Nothing"; + break; + + case BuildAction.Content: + buildAction = "Exclude"; + break; + + case BuildAction.EmbeddedResource: + buildAction = "EmbedAsResource"; + break; + + default: + buildAction = "Compile"; + break; + } + + if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) + buildAction = "FileCopy"; + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string extension = Path.GetExtension(file); + string designer_format = string.Format(".Designer{0}", extension); + + if (file.EndsWith(designer_format)) + { + string basename = file.Substring(0, file.LastIndexOf(designer_format)); + string[] extensions = new string[] { ".cs", ".resx", ".settings" }; + + foreach(string ext in extensions) + { + if (project.Files.Contains(basename + ext)) + { + dependson = string.Format(" dependson=\"{0}{1}\"", basename, ext); + break; + } + } + } + if (extension == ".resx") + { + buildAction = "EmbedAsResource"; + string basename = file.Substring(0, file.LastIndexOf(".resx")); + + // Visual Studio type resx + form dependency + if (project.Files.Contains(basename + ".cs")) + { + dependson = string.Format(" dependson=\"{0}{1}\"", basename, ".cs"); + } + + // We need to specify a resources file name to avoid MissingManifestResourceExceptions + // in libraries that are built. + resource_id = string.Format(" resource_id=\"{0}.{1}.resources\"", + project.AssemblyName, basename.Replace("/", ".")); + } + + switch(project.Files.GetCopyToOutput(file)) + { + case CopyToOutput.Always: + copyToOutput = string.Format(" copyToOutputDirectory=\"Always\""); + break; + case CopyToOutput.PreserveNewest: + copyToOutput = string.Format(" copyToOutputDirectory=\"PreserveNewest\""); + break; + } + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string filePath = PrependPath(file); + ss.WriteLine(" ", + filePath, buildAction, dependson, resource_id, copyToOutput); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ss.WriteLine(" {0}", BuildReference(solution, refr)); + } + ss.WriteLine(" "); + + + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + int count = 0; + + using(ss) + { + ss.WriteLine("", solution.Name); + + count = 0; + foreach(ConfigurationNode conf in solution.Configurations) + { + if(count == 0) + { + ss.WriteLine(" ", conf.Name); + } + + ss.WriteLine(" ", conf.Name); + foreach(ProjectNode project in solution.Projects) + { + ss.WriteLine(" ", project.Name, conf.Name); + } + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + + count = 0; + + foreach(ProjectNode project in solution.Projects) + { + if(count == 0) + ss.WriteLine(" ", project.Name); + + ss.WriteLine(" ", project.Name); + count++; + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine(" ", + Helper.MakeFilePath(path, project.Name, "mdp")); + } + ss.WriteLine(" "); + + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); + Helper.DeleteIfExists(slnFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "sharpdev"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base new file mode 100644 index 0000000000..1efc16da5c --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base @@ -0,0 +1,776 @@ +#region BSD License +/* +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +C.J. Adams-Collier (cjac@colliertech.org), + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("nant")] + public class NAntTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr) + { + + if (!String.IsNullOrEmpty(refr.Path)) + { + return refr.Path; + } + + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name]; + string finalPath = + Helper.NormalizePath(refr.Name + GetProjectExtension(projectRef), '/'); + return finalPath; + } + + ProjectNode project = (ProjectNode) refr.Parent; + + // Do we have an explicit file reference? + string fileRef = FindFileReference(refr.Name, project); + if (fileRef != null) + { + return fileRef; + } + + // Is there an explicit path in the project ref? + if (refr.Path != null) + { + return Helper.NormalizePath(refr.Path + "/" + refr.Name + GetProjectExtension(project), '/'); + } + + // No, it's an extensionless GAC ref, but nant needs the .dll extension anyway + return refr.Name + ".dll"; + } + + public static string GetRefFileName(string refName) + { + if (ExtensionSpecified(refName)) + { + return refName; + } + else + { + return refName + ".dll"; + } + } + + private static bool ExtensionSpecified(string refName) + { + return refName.EndsWith(".dll") || refName.EndsWith(".exe"); + } + + private static string GetProjectExtension(ProjectNode project) + { + string extension = ".dll"; + if (project.Type == ProjectType.Exe || project.Type == ProjectType.WinExe) + { + extension = ".exe"; + } + return extension; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName); + + if (File.Exists(fullPath)) + { + return fullPath; + } + + fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + + fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + if (project.ConfigFile != null && project.ConfigFile.Length!=0) + { + ss.Write(" "); + } + + // Add the content files to just be copied + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + foreach (string file in project.Files) + { + // Ignore if we aren't content + if (project.Files.GetBuildAction(file) != BuildAction.Content) + continue; + + // Create a include tag + ss.WriteLine(" {0}", ""); + } + + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + ss.Write(" "); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + ss.WriteLine(" "); + } + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); + if (refr.Path != null) { + if (ExtensionSpecified(refr.Name)) + { + ss.WriteLine (" "); + } + else + { + ss.WriteLine (" "); + } + } + else + { + ss.WriteLine (" "); + } + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + if (!String.IsNullOrEmpty(conf.Options.OutputPath)) + { + string targetDir = Helper.NormalizePath(conf.Options.OutputPath, '/'); + + ss.WriteLine(" "); + + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + break; + } + } + + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating NAnt build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); + + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + // Use the active configuration, which is the first configuration name in the prebuild file. + Dictionary emittedConfigurations = new Dictionary(); + + ss.WriteLine(" ", solution.ActiveConfig); + ss.WriteLine(); + + foreach (ConfigurationNode conf in solution.Configurations) + { + // If the name isn't in the emitted configurations, we give a high level target to the + // platform specific on. This lets "Debug" point to "Debug-AnyCPU". + if (!emittedConfigurations.ContainsKey(conf.Name)) + { + // Add it to the dictionary so we only emit one. + emittedConfigurations.Add(conf.Name, conf.Platform); + + // Write out the target block. + ss.WriteLine(" ", conf.Name, conf.Platform); + ss.WriteLine(" "); + ss.WriteLine(); + } + + // Write out the target for the configuration. + ss.WriteLine(" ", conf.Name, conf.Platform); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine("\t\t ", conf.Platform); + ss.WriteLine(" "); + ss.WriteLine(); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + + // sdague - ok, this is an ugly hack, but what it lets + // us do is native include of files into the nant + // created files from all .nant/*include files. This + // lets us keep using prebuild, but allows for + // extended nant targets to do build and the like. + + try + { + Regex re = new Regex(".include$"); + DirectoryInfo nantdir = new DirectoryInfo(".nant"); + foreach (FileSystemInfo item in nantdir.GetFileSystemInfos()) + { + if (item is DirectoryInfo) { } + else if (item is FileInfo) + { + if (re.Match(item.FullName) != + System.Text.RegularExpressions.Match.Empty) + { + Console.WriteLine("Including file: " + item.FullName); + + using (FileStream fs = new FileStream(item.FullName, + FileMode.Open, + FileAccess.Read, + FileShare.None)) + { + using (StreamReader sr = new StreamReader(fs)) + { + ss.WriteLine("", (item).FullName); + while (sr.Peek() != -1) + { + ss.WriteLine(sr.ReadLine()); + } + ss.WriteLine(); + } + } + } + } + } + } + catch { } + // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" ", solution.Name, solution.Version); + // ss.WriteLine(" "); + + // ss.WriteLine(" "); + // // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" "); + ss.WriteLine(); + + + ss.WriteLine(" "); + ss.WriteLine(" "); + //ss.WriteLine(" "); + if (solution.Cleanup != null && solution.Cleanup.CleanFiles.Count > 0) + { + foreach (CleanFilesNode cleanFile in solution.Cleanup.CleanFiles) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" ", cleanFile.Pattern); + ss.WriteLine(" ", cleanFile.Pattern); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + } + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning NAnt build files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "nant"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base new file mode 100644 index 0000000000..66dd1bc6f6 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base @@ -0,0 +1,82 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +using Prebuild.Core.Attributes; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("sharpdev2")] + public class SharpDevelop2Target : VS2005Target + { + #region Properties + public override string VersionName + { + get + { + return "SharpDevelop2"; + } + } + #endregion + + #region Public Methods + + /// + /// Writes the specified kern. + /// + /// The kern. + public override void Write(Kernel kern) + { + base.Write(kern); + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public override void Clean(Kernel kern) + { + base.Clean(kern); + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return "sharpdev2"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base new file mode 100644 index 0000000000..8e3205025f --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base @@ -0,0 +1,425 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("sharpdev")] + public class SharpDevelopTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + { + tmpPath = Helper.NormalizePath(tmpPath); + } + else + { + tmpPath = Helper.NormalizePath("./" + tmpPath); + } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if(refr.Path != null || fileRef != null) + { + ret += "Assembly\" refto=\""; + + string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; + + ret += finalPath; + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + return ret; + } + + ret += "Gac\" refto=\""; + try + { + //Assembly assem = Assembly.Load(refr.Name); + ret += refr.Name;// assem.FullName; + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name; + } + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + } + + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if(File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + { + return "False"; + } + return "True"; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string csComp = "Csc"; + string netRuntime = "MsNet"; + if(project.Runtime == ClrRuntime.Mono) + { + csComp = "Mcs"; + netRuntime = "Mono"; + } + + string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + + using(ss) + { + ss.WriteLine( + "", + project.Name, + project.RootNamespace + ); + + ss.WriteLine(" "); + foreach(string file in project.Files) + { + string buildAction = "Compile"; + switch(project.Files.GetBuildAction(file)) + { + case BuildAction.None: + buildAction = "Nothing"; + break; + + case BuildAction.Content: + buildAction = "Exclude"; + break; + + case BuildAction.EmbeddedResource: + buildAction = "EmbedAsResource"; + break; + + default: + buildAction = "Compile"; + break; + } + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string filePath = PrependPath(file); + ss.WriteLine(" ", filePath, buildAction); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ss.WriteLine(" {0}", BuildReference(solution, refr)); + } + ss.WriteLine(" "); + + ss.Write(" "); + + int count = 0; + + ss.WriteLine(" ", solution.ActiveConfig); + + foreach(ConfigurationNode conf in project.Configurations) + { + ss.Write(" "); + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using(ss) + { + ss.WriteLine("", solution.Name); + + int count = 0; + foreach(ProjectNode project in solution.Projects) + { + if(count == 0) + ss.WriteLine(" ", project.Name); + + ss.WriteLine(" ", project.Name); + count++; + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine(" ", + Helper.MakeFilePath(path, project.Name, "prjx")); + } + ss.WriteLine(" "); + + count = 0; + foreach(ConfigurationNode conf in solution.Configurations) + { + if(count == 0) + { + ss.WriteLine(" ", conf.Name); + } + + ss.WriteLine(" ", conf.Name); + foreach(ProjectNode project in solution.Projects) + { + ss.WriteLine(" ", project.Name, conf.Name); + } + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); + Helper.DeleteIfExists(slnFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "sharpdev"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base new file mode 100644 index 0000000000..935c6744db --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + public struct ToolInfo + { + string name; + string guid; + string fileExtension; + string xmlTag; + string importProject; + + /// + /// Gets or sets the name. + /// + /// The name. + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + /// + /// Gets or sets the GUID. + /// + /// The GUID. + public string Guid + { + get + { + return guid; + } + set + { + guid = value; + } + } + + /// + /// Gets or sets the file extension. + /// + /// The file extension. + public string FileExtension + { + get + { + return fileExtension; + } + set + { + fileExtension = value; + } + } + public string LanguageExtension + { + get + { + switch (this.Name) + { + case "C#": + return ".cs"; + case "VisualBasic": + return ".vb"; + case "Boo": + return ".boo"; + default: + return ".cs"; + } + } + } + /// + /// Gets or sets the XML tag. + /// + /// The XML tag. + public string XmlTag + { + get + { + return xmlTag; + } + set + { + xmlTag = value; + } + } + + /// + /// Gets or sets the import project property. + /// + /// The ImportProject tag. + public string ImportProject + { + get + { + return importProject; + } + set + { + importProject = value; + } + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The GUID. + /// The file extension. + /// The XML. + /// The import project. + public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) + { + this.name = name; + this.guid = guid; + this.fileExtension = fileExtension; + this.xmlTag = xml; + this.importProject = importProject; + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The GUID. + /// The file extension. + /// The XML. + public ToolInfo(string name, string guid, string fileExtension, string xml) + { + this.name = name; + this.guid = guid; + this.fileExtension = fileExtension; + this.xmlTag = xml; + this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; + } + + /// + /// Equals operator + /// + /// ToolInfo to compare + /// true if toolInfos are equal + public override bool Equals(object obj) + { + if (obj == null) + { + throw new ArgumentNullException("obj"); + } + if (obj.GetType() != typeof(ToolInfo)) + return false; + + ToolInfo c = (ToolInfo)obj; + return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); + } + + /// + /// Equals operator + /// + /// ToolInfo to compare + /// ToolInfo to compare + /// True if toolInfos are equal + public static bool operator ==(ToolInfo c1, ToolInfo c2) + { + return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); + } + + /// + /// Not equals operator + /// + /// ToolInfo to compare + /// ToolInfo to compare + /// True if toolInfos are not equal + public static bool operator !=(ToolInfo c1, ToolInfo c2) + { + return !(c1 == c2); + } + + /// + /// Hash Code + /// + /// Hash code + public override int GetHashCode() + { + return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); + + } + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base new file mode 100644 index 0000000000..2292624473 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base @@ -0,0 +1,87 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +using Prebuild.Core.Attributes; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("vs2002")] + public class VS2002Target : VS2003Target + { + #region Private Methods + + private void SetVS2002() + { + this.SolutionVersion = "7.00"; + this.ProductVersion = "7.0.9254"; + this.SchemaVersion = "1.0"; + this.VersionName = "2002"; + this.Version = VSVersion.VS70; + } + + #endregion + + #region Public Methods + + /// + /// Writes the specified kern. + /// + /// The kern. + public override void Write(Kernel kern) + { + SetVS2002(); + base.Write(kern); + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public override void Clean(Kernel kern) + { + SetVS2002(); + base.Clean(kern); + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return "vs2002"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base new file mode 100644 index 0000000000..10e2dc4a71 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base @@ -0,0 +1,593 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + [Target("vs2003")] + public class VS2003Target : ITarget + { + + #region Fields + + string solutionVersion = "8.00"; + string productVersion = "7.10.3077"; + string schemaVersion = "2.0"; + string versionName = "2003"; + VSVersion version = VSVersion.VS71; + + readonly Dictionary m_Tools = new Dictionary(); + Kernel m_Kernel; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + protected string SolutionVersion + { + get + { + return solutionVersion; + } + set + { + solutionVersion = value; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + protected string ProductVersion + { + get + { + return productVersion; + } + set + { + productVersion = value; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + protected string SchemaVersion + { + get + { + return schemaVersion; + } + set + { + schemaVersion = value; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + protected string VersionName + { + get + { + return versionName; + } + set + { + versionName = value; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + protected VSVersion Version + { + get + { + return version; + } + set + { + version = value; + } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2003Target() + { + m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); + m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach(ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if(ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch(ArgumentException) + { + m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if(!m_Tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = m_Tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using(ps) + { + ps.WriteLine(""); + ps.WriteLine(" <{0}", toolInfo.XmlTag); + ps.WriteLine("\t\t\t\tProjectType = \"Local\""); + ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", ProductVersion); + ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", SchemaVersion); + ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); + ps.WriteLine("\t\t>"); + + ps.WriteLine("\t\t\t\t"); + ps.WriteLine(" "); + + foreach(ConfigurationNode conf in project.Configurations) + { + ps.WriteLine("\t\t\t\t "); + } + + ps.WriteLine(" "); + + ps.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach(string file in project.Files) + { + string fileName = file.Replace(".\\", ""); + ps.WriteLine(" "); + + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ps.WriteLine(" "); + + } + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" ", toolInfo.XmlTag); + ps.WriteLine(""); + } + + ps = new StreamWriter(projectFile + ".user"); + using(ps) + { + ps.WriteLine(""); + ps.WriteLine(" <{0}>", toolInfo.XmlTag); + ps.WriteLine(" "); + + ps.WriteLine(" ", MakeRefPath(project)); + foreach(ConfigurationNode conf in project.Configurations) + { + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" ", toolInfo.XmlTag); + ps.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false + // { + // return string.Empty; + // } + + //default to "AssemblyName.xml" + //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + //return (string)conf.Options["XmlDocFile", defaultValue]; + + //default to no XmlDocFile file + return (string)conf.Options["XmlDocFile", ""]; + } + + private void WriteSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", VersionName); + + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + StreamWriter ss = new StreamWriter(solutionFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + using(ss) + { + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + foreach(ProjectNode project in solution.Projects) + { + if(!m_Tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = m_Tools[project.Language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", + toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, + toolInfo.FileExtension), project.Guid.ToString().ToUpper()); + + ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); + ss.WriteLine("\tEndProjectSection"); + + ss.WriteLine("EndProject"); + } + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); + foreach(ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.Name); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); + foreach(ProjectNode project in solution.Projects) + { + for(int i = 0; i < project.References.Count; i++) + { + ReferenceNode refr = project.References[i]; + if(solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProject = solution.ProjectsTable[refr.Name]; + ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", + project.Guid.ToString().ToUpper() + , i, + refProject.Guid.ToString().ToUpper() + ); + } + } + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); + foreach(ProjectNode project in solution.Projects) + { + foreach(ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", + project.Guid.ToString().ToUpper(), + conf.Name); + + ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", + project.Guid.ToString().ToUpper(), + conf.Name); + } + } + ss.WriteLine("\tEndGlobalSection"); + + if(solution.Files != null) + { + ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); + foreach(string file in solution.Files) + { + ss.WriteLine("\t\t{0} = {0}", file); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); + ss.WriteLine("\tEndGlobalSection"); + ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("EndGlobal"); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = m_Tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in m_Kernel.Solutions) + { + WriteSolution(sol); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in m_Kernel.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public virtual string Name + { + get + { + return "vs2003"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base new file mode 100644 index 0000000000..9c70e26a37 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base @@ -0,0 +1,147 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("vs2005")] + public class VS2005Target : VSGenericTarget + { + #region Inner Classes + + #endregion + + #region Fields + + string solutionVersion = "9.00"; + string productVersion = "8.0.50727"; + string schemaVersion = "2.0"; + string versionName = "Visual C# 2005"; + string name = "vs2005"; + + VSVersion version = VSVersion.VS80; + + public override string SolutionTag + { + get { return "# Visual Studio 2005"; } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + return string.Empty; + } + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2005Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base new file mode 100644 index 0000000000..fee4f7f27f --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base @@ -0,0 +1,127 @@ +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2008")] + public class VS2008Target : VSGenericTarget + { + #region Fields + string solutionVersion = "10.00"; + string productVersion = "9.0.21022"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2008"; + string name = "vs2008"; + VSVersion version = VSVersion.VS90; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v3_5: + return "ToolsVersion=\"3.5\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2008"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2008Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base new file mode 100644 index 0000000000..ea9f736475 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base @@ -0,0 +1,138 @@ +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2010")] + public class VS2010Target : VSGenericTarget + { + #region Fields + + string solutionVersion = "11.00"; + string productVersion = "9.0.30729"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2010"; + string name = "vs2010"; + VSVersion version = VSVersion.VS10; + + #endregion + + #region Properties + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v4_0: + case FrameworkVersion.v3_5: + return "ToolsVersion=\"4.0\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2010"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2010Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base new file mode 100644 index 0000000000..6969dd7323 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base @@ -0,0 +1,922 @@ +#region BSD License +/* +Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + public abstract class VSGenericTarget : ITarget + { + #region Fields + + readonly Dictionary tools = new Dictionary(); + Kernel kernel; + #endregion + + #region Properties + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public abstract string SolutionVersion { get; } + /// + /// Gets or sets the product version. + /// + /// The product version. + public abstract string ProductVersion { get; } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public abstract string SchemaVersion { get; } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public abstract string VersionName { get; } + /// + /// Gets or sets the version. + /// + /// The version. + public abstract VSVersion Version { get; } + /// + /// Gets the name. + /// + /// The name. + public abstract string Name { get; } + + protected abstract string GetToolsVersionXml(FrameworkVersion version); + public abstract string SolutionTag { get; } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + protected VSGenericTarget() + { + tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); + tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); + tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); + tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); + tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach (ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if (ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch (ArgumentException) + { + kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) + { + SolutionNode node = solution; + + while (node.Parent is SolutionNode) + node = node.Parent as SolutionNode; + + return FindProjectInSolutionRecursively(name, node); + } + + private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) + { + if (solution.ProjectsTable.ContainsKey(name)) + return solution.ProjectsTable[name]; + + foreach (SolutionNode child in solution.Solutions) + { + ProjectNode node = FindProjectInSolutionRecursively(name, child); + if (node != null) + return node; + } + + return null; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if (!tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + #region Project File + using (ps) + { + ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); + ps.WriteLine(" "); + ps.WriteLine(" Local"); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" {0}", SchemaVersion); + ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); + + // Visual Studio has a hard coded guid for the project type + if (project.Type == ProjectType.Web) + ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); + ps.WriteLine(" Debug"); + ps.WriteLine(" {0}", project.AppIcon); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", project.AssemblyName); + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != "") + { + ps.WriteLine(" {0}", conf.Options.KeyFile); + ps.WriteLine(" true"); + break; + } + } + ps.WriteLine(" JScript"); + ps.WriteLine(" Grid"); + ps.WriteLine(" IE50"); + ps.WriteLine(" false"); + ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); + + ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); + ps.WriteLine(" {0}", project.DesignerFolder); + ps.WriteLine(" {0}", project.RootNamespace); + ps.WriteLine(" {0}", project.StartupObject); + if (string.IsNullOrEmpty(project.DebugStartParameters)) + { + ps.WriteLine(" {0}", project.DebugStartParameters); + } + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" ", conf.Name, conf.Platform); + ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); + ps.WriteLine(" {0}", conf.Options["BaseAddress"]); + ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); + ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); + ps.WriteLine(" {0}", conf.Options["DebugInformation"]); + ps.WriteLine(" {0}", conf.Options["FileAlignment"]); + ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); + if (project.Type != ProjectType.Web) + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); + else + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath("bin\\"))); + + ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); + ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); + ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); + ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); + ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); + ps.WriteLine(" {0}", conf.Platform); + ps.WriteLine(" "); + } + + //ps.WriteLine(" "); + + Dictionary projectReferences = new Dictionary(); + List otherReferences = new List(); + + foreach (ReferenceNode refr in project.References) + { + ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); + + if (projectNode == null) + otherReferences.Add(refr); + else + projectReferences.Add(refr, projectNode); + } + // Assembly References + ps.WriteLine(" "); + + foreach (ReferenceNode refr in otherReferences) + { + ps.Write(" "); + ps.Write(" "); + ps.Write(refr.Name); + ps.WriteLine(""); + + if(!String.IsNullOrEmpty(refr.Path)) + { + // Use absolute path to assembly (for determining assembly type) + string absolutePath = Path.Combine(project.FullPath, refr.Path); + if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { + // Assembly is an executable (exe) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); + } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { + // Assembly is an library (dll) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } else { + string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); + kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } + } + + ps.WriteLine(" {0}", refr.LocalCopy); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + //Project References + ps.WriteLine(" "); + foreach (KeyValuePair pair in projectReferences) + { + ToolInfo tool = tools[pair.Value.Language]; + if (tools == null) + throw new UnknownLanguageException(); + + string path = + Helper.MakePathRelativeTo(project.FullPath, + Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); + ps.WriteLine(" ", path); + + // TODO: Allow reference to visual basic projects + ps.WriteLine(" {0}", pair.Value.Name); + ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); + ps.WriteLine(" {0}", tool.Guid.ToUpper()); + + //This is the Copy Local flag in VS + ps.WriteLine(" {0}", pair.Key.LocalCopy); + + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + // ps.WriteLine(" "); + ps.WriteLine(" "); + + // ps.WriteLine(" "); + List list = new List(); + + foreach (string path in project.Files) + { + string lower = path.ToLower(); + if (lower.EndsWith(".resx")) + { + string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); + if (!list.Contains(codebehind)) + list.Add(codebehind); + } + + } + + foreach (string filePath in project.Files) + { + // if (file == "Properties\\Bind.Designer.cs") + // { + // Console.WriteLine("Wait a minute!"); + // Console.WriteLine(project.Files.GetSubType(file).ToString()); + // } + SubType subType = project.Files.GetSubType(filePath); + + // Visual Studio chokes on file names if forward slash is used as a path separator + // instead of backslash. So we must make sure that all file paths written to the + // project file use \ as a path separator. + string file = filePath.Replace(@"/", @"\"); + + if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer + && subType != SubType.CodeBehind) + { + ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ps.WriteLine(" {0}", Path.GetFileName(file)); + ps.WriteLine(" Designer"); + ps.WriteLine(" "); + // + } + + if (subType == SubType.Designer) + { + ps.WriteLine(" ", file); + + string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; + string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; + + // Check for a parent .cs file with the same name as this designer file + if (File.Exists(Helper.NormalizePath(dependent_name))) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" ResXFileCodeGenerator"); + ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); + ps.WriteLine(" " + subType + ""); + } + + ps.WriteLine(" "); + if (File.Exists(Helper.NormalizePath(autogen_name))) + { + ps.WriteLine(" ", autogen_name); + //ps.WriteLine(" True"); + + // If a parent .cs file exists, link this autogen file to it. Otherwise link + // to the designer file + if (File.Exists(dependent_name)) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" True"); + ps.WriteLine(" {0}", Path.GetFileName(filePath)); + } + + ps.WriteLine(" "); + } + list.Add(autogen_name); + } + if (subType == SubType.Settings) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + ps.WriteLine("Include=\"{0}\">", file); + string fileName = Path.GetFileName(filePath); + if (project.Files.GetBuildAction(filePath) == BuildAction.None) + { + ps.WriteLine(" SettingsSingleFileGenerator"); + ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); + } + else + { + ps.WriteLine(" Code"); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); + string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); + ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); + } + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + else if (subType != SubType.Designer) + { + string path = Helper.NormalizePath(file); + string path_lower = path.ToLower(); + + if (!list.Contains(filePath)) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + + int startPos = 0; + if (project.Files.GetPreservePath(filePath)) + { + while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) + startPos++; + + } + else + { + startPos = file.LastIndexOf(Path.GetFileName(path)); + } + + // be sure to write out the path with backslashes so VS recognizes + // the file properly. + ps.WriteLine("Include=\"{0}\">", file); + + int last_period_index = file.LastIndexOf('.'); + string short_file_name = file.Substring(0, last_period_index); + string extension = Path.GetExtension(path); + // make this upper case, so that when File.Exists tests for the + // existence of a designer file on a case-sensitive platform, + // it is correctly identified. + string designer_format = string.Format(".Designer{0}", extension); + + if (path_lower.EndsWith(designer_format.ToLowerInvariant())) + { + int designer_index = path.IndexOf(designer_format); + string file_name = path.Substring(0, designer_index); + + // There are two corrections to the next lines: + // 1. Fix the connection between a designer file and a form + // or usercontrol that don't have an associated resx file. + // 2. Connect settings files to associated designer files. + if (File.Exists(file_name + extension)) + ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); + else if (File.Exists(file_name + ".resx")) + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); + else if (File.Exists(file_name + ".settings")) + { + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + } + } + else if (subType == SubType.CodeBehind) + { + ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); + } + if (project.Files.GetIsLink(filePath)) + { + string alias = project.Files.GetLinkPath(filePath); + alias += file.Substring(startPos); + alias = Helper.NormalizePath(alias); + ps.WriteLine(" {0}", alias); + } + else if (project.Files.GetBuildAction(filePath) != BuildAction.None) + { + if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) + { + ps.WriteLine(" {0}", subType); + } + } + + if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) + { + ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); + } + + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + } + } + + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(""); + } + #endregion + + #region User File + + ps = new StreamWriter(projectFile + ".user"); + using (ps) + { + // Get the first configuration from the project. + ConfigurationNode firstConfiguration = null; + + if (project.Configurations.Count > 0) + { + firstConfiguration = project.Configurations[0]; + } + + ps.WriteLine(""); + //ps.WriteLine( "" ); + //ps.WriteLine(" <{0}>", toolInfo.XMLTag); + //ps.WriteLine(" "); + ps.WriteLine(" "); + //ps.WriteLine(" ", MakeRefPath(project)); + + if (firstConfiguration != null) + { + ps.WriteLine(" {0}", firstConfiguration.Name); + ps.WriteLine(" {0}", firstConfiguration.Platform); + } + + ps.WriteLine(" {0}", MakeRefPath(project)); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" ProjectFiles"); + ps.WriteLine(" 0"); + ps.WriteLine(" "); + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" "); + } + ps.WriteLine(""); + } + #endregion + + kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) + { + kernel.Log.Write("Creating {0} solution and project files", VersionName); + + foreach (SolutionNode child in solution.Solutions) + { + kernel.Log.Write("...Creating folder: {0}", child.Name); + WriteSolution(child, false); + } + + foreach (ProjectNode project in solution.Projects) + { + kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + + foreach (DatabaseProjectNode project in solution.DatabaseProjects) + { + kernel.Log.Write("...Creating database project: {0}", project.Name); + WriteDatabaseProject(solution, project); + } + + if (writeSolutionToDisk) // only write main solution + { + kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + + using (StreamWriter ss = new StreamWriter(solutionFile)) + { + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + ss.WriteLine(SolutionTag); + + WriteProjectDeclarations(ss, solution, solution); + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + WriteConfigurationLines(solution.Configurations, solution, ss); + ss.WriteLine("\tEndGlobalSection"); + + if (solution.Solutions.Count > 0) + { + ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); + foreach (SolutionNode embeddedSolution in solution.Solutions) + { + WriteNestedProjectMap(ss, embeddedSolution); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("EndGlobal"); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + } + + private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) + { + foreach (SolutionNode childSolution in embeddedSolution.Solutions) + { + WriteEmbeddedSolution(writer, childSolution); + WriteProjectDeclarations(writer, actualSolution, childSolution); + } + + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteProject(actualSolution, writer, project); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteProject(actualSolution, writer, dbProject); + } + + if (actualSolution.Guid == embeddedSolution.Guid) + { + WriteSolutionFiles(actualSolution, writer); + } + } + + private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) + { + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteNestedProject(writer, embeddedSolution, project.Guid); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteNestedProject(writer, embeddedSolution, dbProject.Guid); + } + + foreach (SolutionNode child in embeddedSolution.Solutions) + { + WriteNestedProject(writer, embeddedSolution, child.Guid); + WriteNestedProjectMap(writer, child); + } + } + + private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) + { + WriteNestedFolder(writer, solution.Guid, projectGuid); + } + + private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) + { + writer.WriteLine("\t\t{0} = {1}", + childGuid.ToString("B").ToUpper(), + parentGuid.ToString("B").ToUpper()); + } + + private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) + { + foreach (ProjectNode project in solution.Projects) + { + foreach (ConfigurationNode conf in configurations) + { + ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + + ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + } + } + + foreach (SolutionNode child in solution.Solutions) + { + WriteConfigurationLines(configurations, child, ss); + } + } + + private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) + { + if(solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); + } + + private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) + { + WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) + { + WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) + { + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + } + + const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; + const string ProjectDeclarationEndFormat = "EndProject"; + + private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); + + path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); + + WriteProject(ss, language, guid, name, path); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) + { + WriteProject(writer, language, projectGuid, name, location, null); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + writer.WriteLine(ProjectDeclarationBeginFormat, + toolInfo.Guid, + name, + location, + projectGuid.ToString("B").ToUpper()); + + if (files != null) + { + writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); + + foreach (string file in files) + writer.WriteLine("\t\t{0} = {0}", file); + + writer.WriteLine("\tEndProjectSection"); + } + + writer.WriteLine(ProjectDeclarationEndFormat); + } + + private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) + { + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); + IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); + + kernel.CurrentWorkingDirectory.Push(); + + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using (ps) + { + ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); + ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); + ps.Indent++; + ps.WriteLine("MSDTVersion = \"80\""); + // TODO: Use the project.Files property + if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) + WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); + + ps.WriteLine("Begin DBRefFolder = \"Database References\""); + ps.Indent++; + foreach (DatabaseReferenceNode reference in project.References) + { + ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); + ps.Indent++; + ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); + ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); + //ps.WriteLine("Colorizer = 5"); + ps.Indent--; + ps.WriteLine("End"); + } + ps.Indent--; + ps.WriteLine("End"); + ps.Indent--; + ps.WriteLine("End"); + + ps.Flush(); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + + private static bool ContainsSqlFiles(string folder) + { + if(Directory.GetFiles(folder, "*.sql").Length > 0) + return true; // if the folder contains 1 .sql file, that's good enough + + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + return true; // if 1 child folder contains a .sql file, still good enough + } + + return false; + } + + private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) + { + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + { + writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); + writer.Indent++; + WriteDatabaseFoldersAndFiles(writer, child); + writer.Indent--; + writer.WriteLine("End"); + } + } + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); + } + } + + private void CleanProject(ProjectNode project) + { + kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + WriteSolution(sol, true); + } + kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + CleanSolution(sol); + } + kernel = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base new file mode 100644 index 0000000000..699b5ca019 --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base @@ -0,0 +1,54 @@ +#region BSD License +/* +Copyright (c) 2008-2009 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + public enum VSVersion + { + /// + /// Visual Studio 2002 + /// + VS70, + /// + /// Visual Studio 2003 + /// + VS71, + /// + /// Visual Studio 2005 + /// + VS80, + /// + /// Visual Studio 2008 + /// + VS90, + /// + /// Visual Studio 2010 + /// + VS10 + } +} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base new file mode 100644 index 0000000000..5393cec05f --- /dev/null +++ b/Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base @@ -0,0 +1,594 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("xcode")] + public class XcodeTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path + "/" + refr.Name + ".dll", '/') : fileRef; + ret += finalPath; + return ret; + } + + try + { + //Assembly assem = Assembly.Load(refr.Name); + //if (assem != null) + //{ + //ret += (refr.Name + ".dll"); + //} + //else + //{ + ret += (refr.Name + ".dll"); + //} + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name + ".dll"; + } + } + return ret; + } + + private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; + ret += finalPath; + return ret; + } + + try + { + Assembly assem = Assembly.Load(refr.Name); + if (assem != null) + { + ret += ""; + } + else + { + ret += ""; + } + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += ""; + } + } + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + ss.WriteLine(" ", '/')); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating Xcode build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj")); + if (!directoryInfo.Exists) + { + directoryInfo.Create(); + } + string combFile = Helper.MakeFilePath(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj"), "project", "pbxproj"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); + + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + foreach (ConfigurationNode conf in solution.Configurations) + { + // Set the project.config to a non-debug configuration + if (conf.Options["DebugInformation"].ToString().ToLower() != "true") + { + ss.WriteLine(" ", conf.Name); + } + ss.WriteLine(); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine(" "); + ss.WriteLine(); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + //foreach(ProjectNode project in solution.Projects) + //{ + // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + // ss.Write(" "); + //} + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Xcode build files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "xcode"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs new file mode 100644 index 0000000000..e46b5a5f36 --- /dev/null +++ b/Prebuild/src/Core/Targets/AutotoolsTarget.cs @@ -0,0 +1,1070 @@ +#region BSD License +/* + +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Dave Hudson (jendave@yahoo.com), +C.J. Adams-Collier (cjac@colliertech.org), + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +#region MIT X11 license + +/* + Portions of this file authored by Lluis Sanchez Gual + + Copyright (C) 2006 Novell, Inc (http://www.novell.com) + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#endregion +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Xsl; +using System.Net; +using System.Diagnostics; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + public enum ClrVersion + { + Default, + Net_1_1, + Net_2_0 + } + + public class SystemPackage + { + string name; + string version; + string description; + string[] assemblies; + bool isInternal; + ClrVersion targetVersion; + + public void Initialize(string name, + string version, + string description, + string[] assemblies, + ClrVersion targetVersion, + bool isInternal) + { + this.isInternal = isInternal; + this.name = name; + this.version = version; + this.assemblies = assemblies; + this.description = description; + this.targetVersion = targetVersion; + } + + public string Name + { + get { return name; } + } + + public string Version + { + get { return version; } + } + + public string Description + { + get { return description; } + } + + public ClrVersion TargetVersion + { + get { return targetVersion; } + } + + // The package is part of the mono SDK + public bool IsCorePackage + { + get { return name == "mono"; } + } + + // The package has been registered by an add-in, and is not installed + // in the system. + public bool IsInternalPackage + { + get { return isInternal; } + } + + public string[] Assemblies + { + get { return assemblies; } + } + + } + + + /// + /// + /// + [Target("autotools")] + public class AutotoolsTarget : ITarget + { + #region Fields + + Kernel m_Kernel; + XmlDocument autotoolsDoc; + XmlUrlResolver xr; + System.Security.Policy.Evidence e; + readonly Dictionary assemblyPathToPackage = new Dictionary(); + readonly Dictionary assemblyFullNameToPath = new Dictionary(); + readonly Dictionary packagesHash = new Dictionary(); + readonly List packages = new List(); + + #endregion + + #region Private Methods + + private static void mkdirDashP(string dirName) + { + DirectoryInfo di = new DirectoryInfo(dirName); + if (di.Exists) + return; + + string parentDirName = System.IO.Path.GetDirectoryName(dirName); + DirectoryInfo parentDi = new DirectoryInfo(parentDirName); + if (!parentDi.Exists) + mkdirDashP(parentDirName); + + di.Create(); + } + + private static void chkMkDir(string dirName) + { + System.IO.DirectoryInfo di = + new System.IO.DirectoryInfo(dirName); + + if (!di.Exists) + di.Create(); + } + + private void transformToFile(string filename, XsltArgumentList argList, string nodeName) + { + // Create an XslTransform for this file + XslTransform templateTransformer = + new XslTransform(); + + // Load up the template + XmlNode templateNode = + autotoolsDoc.SelectSingleNode(nodeName + "/*"); + templateTransformer.Load(templateNode.CreateNavigator(), xr, e); + + // Create a writer for the transformed template + XmlTextWriter templateWriter = + new XmlTextWriter(filename, null); + + // Perform transformation, writing the file + templateTransformer.Transform + (m_Kernel.CurrentDoc, argList, templateWriter, xr); + } + + static string NormalizeAsmName(string name) + { + int i = name.IndexOf(", PublicKeyToken=null"); + if (i != -1) + return name.Substring(0, i).Trim(); + return name; + } + + private void AddAssembly(string assemblyfile, SystemPackage package) + { + if (!File.Exists(assemblyfile)) + return; + + try + { + System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); + assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; + assemblyPathToPackage[assemblyfile] = package; + } + catch + { + } + } + + private static List GetAssembliesWithLibInfo(string line, string file) + { + List references = new List(); + List libdirs = new List(); + List retval = new List(); + foreach (string piece in line.Split(' ')) + { + if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) + { + references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); + } + else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) + { + libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); + } + } + + foreach (string refrnc in references) + { + foreach (string libdir in libdirs) + { + if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) + { + retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); + } + } + } + + return retval; + } + + private static List GetAssembliesWithoutLibInfo(string line, string file) + { + List references = new List(); + foreach (string reference in line.Split(' ')) + { + if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) + { + string final_ref = reference.Substring(3).Trim(); + references.Add(ProcessPiece(final_ref, file)); + } + } + return references; + } + + private static string ProcessPiece(string piece, string pcfile) + { + int start = piece.IndexOf("${"); + if (start == -1) + return piece; + + int end = piece.IndexOf("}"); + if (end == -1) + return piece; + + string variable = piece.Substring(start + 2, end - start - 2); + string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); + return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); + } + + private static string GetVariableFromPkgConfig(string var, string pcfile) + { + ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); + psi.RedirectStandardOutput = true; + psi.UseShellExecute = false; + psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); + Process p = new Process(); + p.StartInfo = psi; + p.Start(); + string ret = p.StandardOutput.ReadToEnd().Trim(); + p.WaitForExit(); + if (String.IsNullOrEmpty(ret)) + return String.Empty; + return ret; + } + + private void ParsePCFile(string pcfile) + { + // Don't register the package twice + string pname = Path.GetFileNameWithoutExtension(pcfile); + if (packagesHash.ContainsKey(pname)) + return; + + List fullassemblies = null; + string version = ""; + string desc = ""; + + SystemPackage package = new SystemPackage(); + + using (StreamReader reader = new StreamReader(pcfile)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + string lowerLine = line.ToLower(); + if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) + { + string choppedLine = line.Substring(5).Trim(); + if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) + { + fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); + } + else + { + fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); + } + } + else if (lowerLine.StartsWith("version:")) + { + // "version:".Length == 8 + version = line.Substring(8).Trim(); + } + else if (lowerLine.StartsWith("description:")) + { + // "description:".Length == 12 + desc = line.Substring(12).Trim(); + } + } + } + + if (fullassemblies == null) + return; + + foreach (string assembly in fullassemblies) + { + AddAssembly(assembly, package); + } + + package.Initialize(pname, + version, + desc, + fullassemblies.ToArray(), + ClrVersion.Default, + false); + packages.Add(package); + packagesHash[pname] = package; + } + + void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) + { + SystemPackage package = new SystemPackage(); + List list = new List(); + + string dir = Path.Combine(prefix, version); + if (!Directory.Exists(dir)) + { + return; + } + + foreach (string assembly in Directory.GetFiles(dir, "*.dll")) + { + AddAssembly(assembly, package); + list.Add(assembly); + } + + package.Initialize("mono", + version, + "The Mono runtime", + list.ToArray(), + ver, + false); + packages.Add(package); + } + + void RunInitialization() + { + string versionDir; + + if (Environment.Version.Major == 1) + { + versionDir = "1.0"; + } + else + { + versionDir = "2.0"; + } + + //Pull up assemblies from the installed mono system. + string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); + + if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) + prefix = Path.Combine(prefix, "mono"); + else + prefix = Path.GetDirectoryName(prefix); + + RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); + RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); + + string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); + string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); + + if (String.IsNullOrEmpty(libpath)) + { + string path_dirs = Environment.GetEnvironmentVariable("PATH"); + foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) + { + if (pathdir == null) + continue; + if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) + { + libpath = Path.Combine(pathdir, ".."); + libpath = Path.Combine(libpath, "lib"); + libpath = Path.Combine(libpath, "pkgconfig"); + break; + } + } + } + search_dirs += Path.PathSeparator + libpath; + if (!string.IsNullOrEmpty(search_dirs)) + { + List scanDirs = new List(); + foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) + { + if (!scanDirs.Contains(potentialDir)) + scanDirs.Add(potentialDir); + } + foreach (string pcdir in scanDirs) + { + if (pcdir == null) + continue; + + if (Directory.Exists(pcdir)) + { + foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) + { + ParsePCFile(pcfile); + } + } + } + } + } + + private void WriteCombine(SolutionNode solution) + { + #region "Create Solution directory if it doesn't exist" + string solutionDir = Path.Combine(solution.FullPath, + Path.Combine("autotools", + solution.Name)); + chkMkDir(solutionDir); + #endregion + + #region "Write Solution-level files" + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("solutionName", "", solution.Name); + // $solutionDir is $rootDir/$solutionName/ + transformToFile(Path.Combine(solutionDir, "configure.ac"), + argList, "/Autotools/SolutionConfigureAc"); + transformToFile(Path.Combine(solutionDir, "Makefile.am"), + argList, "/Autotools/SolutionMakefileAm"); + transformToFile(Path.Combine(solutionDir, "autogen.sh"), + argList, "/Autotools/SolutionAutogenSh"); + #endregion + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + m_Kernel.Log.Write(String.Format("Writing project: {0}", + project.Name)); + WriteProject(solution, project); + } + } + + private static string FindFileReference(string refName, + ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = + Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + if (path == null) + { + return ""; + } + + StringBuilder tmpPath; + + if (Core.Parse.Preprocessor.GetOS() == "Win32") + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath.Replace("/", @"\\"); + } + else + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); + } + return tmpPath.ToString(); + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); + string projectDir = Path.Combine(solutionDir, project.Name); + string projectVersion = project.Version; + bool hasAssemblyConfig = false; + chkMkDir(projectDir); + + List + compiledFiles = new List(), + contentFiles = new List(), + embeddedFiles = new List(), + + binaryLibs = new List(), + pkgLibs = new List(), + systemLibs = new List(), + runtimeLibs = new List(), + + extraDistFiles = new List(), + localCopyTargets = new List(); + + // If there exists a .config file for this assembly, copy + // it to the project folder + + // TODO: Support copying .config.osx files + // TODO: support processing the .config file for native library deps + string projectAssemblyName = project.Name; + if (project.AssemblyName != null) + projectAssemblyName = project.AssemblyName; + + if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) + { + hasAssemblyConfig = true; + System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); + extraDistFiles.Add(project.AssemblyName + ".dll.config"); + } + + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != string.Empty) + { + // Copy snk file into the project's directory + // Use the snk from the project directory directly + string source = Path.Combine(project.FullPath, conf.Options.KeyFile); + string keyFile = conf.Options.KeyFile; + Regex re = new Regex(".*/"); + keyFile = re.Replace(keyFile, ""); + + string dest = Path.Combine(projectDir, keyFile); + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + } + } + + // Copy compiled, embedded and content files into the project's directory + foreach (string filename in project.Files) + { + string source = Path.Combine(project.FullPath, filename); + string dest = Path.Combine(projectDir, filename); + + if (filename.Contains("AssemblyInfo.cs")) + { + // If we've got an AssemblyInfo.cs, pull the version number from it + string[] sources = { source }; + string[] args = { "" }; + Microsoft.CSharp.CSharpCodeProvider cscp = + new Microsoft.CSharp.CSharpCodeProvider(); + + string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); + System.CodeDom.Compiler.CompilerParameters cparam = + new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); + + System.CodeDom.Compiler.CompilerResults cr = + cscp.CompileAssemblyFromFile(cparam, sources); + + foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) + Console.WriteLine("Error! '{0}'", error.ErrorText); + + try { + string projectFullName = cr.CompiledAssembly.FullName; + Regex verRegex = new Regex("Version=([\\d\\.]+)"); + Match verMatch = verRegex.Match(projectFullName); + if (verMatch.Success) + projectVersion = verMatch.Groups[1].Value; + }catch{ + Console.WriteLine("Couldn't compile AssemblyInfo.cs"); + } + + // Clean up the temp file + try + { + if (File.Exists(tempAssemblyFile)) + File.Delete(tempAssemblyFile); + } + catch + { + Console.WriteLine("Error! '{0}'", e); + } + + } + + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + + switch (project.Files.GetBuildAction(filename)) + { + case BuildAction.Compile: + compiledFiles.Add(filename); + break; + case BuildAction.Content: + contentFiles.Add(filename); + extraDistFiles.Add(filename); + break; + case BuildAction.EmbeddedResource: + embeddedFiles.Add(filename); + break; + } + } + + // Set up references + for (int refNum = 0; refNum < project.References.Count; refNum++) + { + ReferenceNode refr = project.References[refNum]; + Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); + + /* Determine which pkg-config (.pc) file refers to + this assembly */ + + SystemPackage package = null; + + if (packagesHash.ContainsKey(refr.Name)) + { + package = packagesHash[refr.Name]; + + } + else + { + string assemblyFullName = string.Empty; + if (refAssembly != null) + assemblyFullName = refAssembly.FullName; + + string assemblyFileName = string.Empty; + if (assemblyFullName != string.Empty && + assemblyFullNameToPath.ContainsKey(assemblyFullName) + ) + assemblyFileName = + assemblyFullNameToPath[assemblyFullName]; + + if (assemblyFileName != string.Empty && + assemblyPathToPackage.ContainsKey(assemblyFileName) + ) + package = assemblyPathToPackage[assemblyFileName]; + + } + + /* If we know the .pc file and it is not "mono" + (already in the path), add a -pkg: argument */ + + if (package != null && + package.Name != "mono" && + !pkgLibs.Contains(package.Name) + ) + pkgLibs.Add(package.Name); + + string fileRef = + FindFileReference(refr.Name, (ProjectNode)refr.Parent); + + if (refr.LocalCopy || + solution.ProjectsTable.ContainsKey(refr.Name) || + fileRef != null || + refr.Path != null + ) + { + + /* Attempt to copy the referenced lib to the + project's directory */ + + string filename = refr.Name + ".dll"; + string source = filename; + if (refr.Path != null) + source = Path.Combine(refr.Path, source); + source = Path.Combine(project.FullPath, source); + string dest = Path.Combine(projectDir, filename); + + /* Since we depend on this binary dll to build, we + * will add a compile- time dependency on the + * copied dll, and add the dll to the list of + * files distributed with this package + */ + + binaryLibs.Add(refr.Name + ".dll"); + extraDistFiles.Add(refr.Name + ".dll"); + + // TODO: Support copying .config.osx files + // TODO: Support for determining native dependencies + if (File.Exists(source + ".config")) + { + System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); + extraDistFiles.Add(refr.Name + ".dll.config"); + } + + try + { + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException) + { + if (solution.ProjectsTable.ContainsKey(refr.Name)){ + + /* If an assembly is referenced, marked for + * local copy, in the list of projects for + * this solution, but does not exist, put a + * target into the Makefile.am to build the + * assembly and copy it to this project's + * directory + */ + + ProjectNode sourcePrj = + ((solution.ProjectsTable[refr.Name])); + + string target = + String.Format("{0}:\n" + + "\t$(MAKE) -C ../{1}\n" + + "\tln ../{2}/$@ $@\n", + filename, + sourcePrj.Name, + sourcePrj.Name ); + + localCopyTargets.Add(target); + } + } + } + else if( !pkgLibs.Contains(refr.Name) ) + { + // Else, let's assume it's in the GAC or the lib path + string assemName = string.Empty; + int index = refr.Name.IndexOf(","); + + if (index > 0) + assemName = refr.Name.Substring(0, index); + else + assemName = refr.Name; + + m_Kernel.Log.Write(String.Format( + "Warning: Couldn't find an appropriate assembly " + + "for reference:\n'{0}'", refr.Name + )); + systemLibs.Add(assemName); + } + } + + const string lineSep = " \\\n\t"; + string compiledFilesString = string.Empty; + if (compiledFiles.Count > 0) + compiledFilesString = + lineSep + string.Join(lineSep, compiledFiles.ToArray()); + + string embeddedFilesString = ""; + if (embeddedFiles.Count > 0) + embeddedFilesString = + lineSep + string.Join(lineSep, embeddedFiles.ToArray()); + + string contentFilesString = ""; + if (contentFiles.Count > 0) + contentFilesString = + lineSep + string.Join(lineSep, contentFiles.ToArray()); + + string extraDistFilesString = ""; + if (extraDistFiles.Count > 0) + extraDistFilesString = + lineSep + string.Join(lineSep, extraDistFiles.ToArray()); + + string pkgLibsString = ""; + if (pkgLibs.Count > 0) + pkgLibsString = + lineSep + string.Join(lineSep, pkgLibs.ToArray()); + + string binaryLibsString = ""; + if (binaryLibs.Count > 0) + binaryLibsString = + lineSep + string.Join(lineSep, binaryLibs.ToArray()); + + string systemLibsString = ""; + if (systemLibs.Count > 0) + systemLibsString = + lineSep + string.Join(lineSep, systemLibs.ToArray()); + + string localCopyTargetsString = ""; + if (localCopyTargets.Count > 0) + localCopyTargetsString = + string.Join("\n", localCopyTargets.ToArray()); + + string monoPath = ""; + foreach (string runtimeLib in runtimeLibs) + { + monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; + } + + // Add the project name to the list of transformation + // parameters + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("projectName", "", project.Name); + argList.AddParam("solutionName", "", solution.Name); + argList.AddParam("assemblyName", "", projectAssemblyName); + argList.AddParam("compiledFiles", "", compiledFilesString); + argList.AddParam("embeddedFiles", "", embeddedFilesString); + argList.AddParam("contentFiles", "", contentFilesString); + argList.AddParam("extraDistFiles", "", extraDistFilesString); + argList.AddParam("pkgLibs", "", pkgLibsString); + argList.AddParam("binaryLibs", "", binaryLibsString); + argList.AddParam("systemLibs", "", systemLibsString); + argList.AddParam("monoPath", "", monoPath); + argList.AddParam("localCopyTargets", "", localCopyTargetsString); + argList.AddParam("projectVersion", "", projectVersion); + argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); + + // Transform the templates + transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); + transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); + transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); + + if (project.Type == Core.Nodes.ProjectType.Library) + transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); + if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) + transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + m_Kernel.Log.Write("Parsing system pkg-config files"); + RunInitialization(); + + const string streamName = "autotools.xml"; + string fqStreamName = String.Format("Prebuild.data.{0}", + streamName + ); + + // Retrieve stream for the autotools template XML + Stream autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(fqStreamName); + + if(autotoolsStream == null) { + + /* + * try without the default namespace prepended, in + * case prebuild.exe assembly was compiled with + * something other than Visual Studio .NET + */ + + autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(streamName); + if(autotoolsStream == null){ + string errStr = + String.Format("Could not find embedded resource file:\n" + + "'{0}' or '{1}'", + streamName, fqStreamName + ); + + m_Kernel.Log.Write(errStr); + + throw new System.Reflection.TargetException(errStr); + } + } + + // Create an XML URL Resolver with default credentials + xr = new System.Xml.XmlUrlResolver(); + xr.Credentials = CredentialCache.DefaultCredentials; + + // Create a default evidence - no need to limit access + e = new System.Security.Policy.Evidence(); + + // Load the autotools XML + autotoolsDoc = new XmlDocument(); + autotoolsDoc.Load(autotoolsStream); + + /* rootDir is the filesystem location where the Autotools + * build tree will be created - for now we'll make it + * $PWD/autotools + */ + + string pwd = Directory.GetCurrentDirectory(); + //string pwd = System.Environment.GetEnvironmentVariable("PWD"); + //if (pwd.Length != 0) + //{ + string rootDir = Path.Combine(pwd, "autotools"); + //} + //else + //{ + // pwd = Assembly.GetExecutingAssembly() + //} + chkMkDir(rootDir); + + foreach (SolutionNode solution in kern.Solutions) + { + m_Kernel.Log.Write(String.Format("Writing solution: {0}", + solution.Name)); + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "autotools"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/DebugTarget.cs b/Prebuild/src/Core/Targets/DebugTarget.cs new file mode 100644 index 0000000000..650007ecc6 --- /dev/null +++ b/Prebuild/src/Core/Targets/DebugTarget.cs @@ -0,0 +1,102 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-09-20 08:42:51 +0100 (Wed, 20 Sep 2006) $ + * $Revision: 164 $ + */ +#endregion + +using System; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; + +#if (DEBUG && _DEBUG_TARGET) +namespace Prebuild.Core.Targets +{ + [Target("debug")] + public class DebugTarget : ITarget + { +#region Fields + + private Kernel m_Kernel = null; + +#endregion + +#region ITarget Members + + public void Write() + { + foreach(SolutionNode s in m_Kernel.Solutions) + { + Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); + foreach(string file in s.Files) +{ + Console.WriteLine("\tFile [ {0} ]", file); +} + + foreach(ProjectNode proj in s.Projects) + { + Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); + foreach(string file in proj.Files) + Console.WriteLine("\t\tFile [ {0} ]", file); + } + } + } + + public void Clean() + { + Console.WriteLine("Not implemented"); + } + + public string Name + { + get + { + return "debug"; + } + } + + public Kernel Kernel + { + get + { + return m_Kernel; + } + set + { + m_Kernel = value; + } + } + +#endregion + } +} +#endif diff --git a/Prebuild/src/Core/Targets/MakefileTarget.cs b/Prebuild/src/Core/Targets/MakefileTarget.cs new file mode 100644 index 0000000000..54046dd9bb --- /dev/null +++ b/Prebuild/src/Core/Targets/MakefileTarget.cs @@ -0,0 +1,469 @@ +#region BSD License +/* +Copyright (c) 2004 Crestez Leonard (cleonard@go.ro) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + [Target("makefile")] + public class MakefileTarget : ITarget + { + #region Fields + + private Kernel m_Kernel = null; + + #endregion + + #region Private Methods + + // This converts a path relative to the path of a project to + // a path relative to the solution path. + private string NicePath(ProjectNode proj, string path) + { + string res; + SolutionNode solution = (SolutionNode)proj.Parent; + res = Path.Combine(Helper.NormalizePath(proj.FullPath, '/'), Helper.NormalizePath(path, '/')); + res = Helper.NormalizePath(res, '/'); + res = res.Replace("/./", "/"); + while (res.IndexOf("/../") >= 0) + { + int a = res.IndexOf("/../"); + int b = res.LastIndexOf("/", a - 1); + res = res.Remove(b, a - b + 3); + } + res = Helper.MakePathRelativeTo(solution.FullPath, res); + if (res.StartsWith("./")) + res = res.Substring(2, res.Length - 2); + res = Helper.NormalizePath(res, '/'); + return res; + } + + private void WriteProjectFiles(StreamWriter f, SolutionNode solution, ProjectNode project) + { + // Write list of source code files + f.WriteLine("SOURCES_{0} = \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.Compile) + f.WriteLine("\t{0} \\", NicePath(project, file)); + f.WriteLine(); + + // Write list of resource files + f.WriteLine("RESOURCES_{0} = \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) + { + string path = NicePath(project, file); + f.WriteLine("\t-resource:{0},{1} \\", path, Path.GetFileName(path)); + } + f.WriteLine(); + + // There's also Content and None in BuildAction. + // What am I supposed to do with that? + } + + private string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = NicePath(project, Helper.MakeFilePath(refPath.Path, refName, "dll")); + if (File.Exists(fullPath)) + return fullPath; + } + return null; + } + + private void WriteProjectReferences(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("REFERENCES_{0} = \\", project.Name); + foreach (ReferenceNode refr in project.References) + { + string path; + // Project references change with configurations. + if (solution.ProjectsTable.ContainsKey(refr.Name)) + continue; + path = FindFileReference(refr.Name, project); + if (path != null) + f.WriteLine("\t-r:{0} \\", path); + else + f.WriteLine("\t-r:{0} \\", refr.Name); + } + f.WriteLine(); + } + + private void WriteProjectDependencies(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("DEPENDENCIES_{0} = \\", project.Name); + f.WriteLine("\t$(SOURCES_{0}) \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) + f.WriteLine("\t{0} \\", NicePath(project, file)); + f.WriteLine(); + } + + private string ProjectTypeToExtension(ProjectType t) + { + if (t == ProjectType.Exe || t == ProjectType.WinExe) + { + return "exe"; + } + else if (t == ProjectType.Library) + { + return "dll"; + } + else + { + throw new FatalException("Bad ProjectType: {0}", t); + } + } + + private string ProjectTypeToTarget(ProjectType t) + { + if (t == ProjectType.Exe) + { + return "exe"; + } + else if (t == ProjectType.WinExe) + { + return "winexe"; + } + else if (t == ProjectType.Library) + { + return "library"; + } + else + { + throw new FatalException("Bad ProjectType: {0}", t); + } + } + + private string ProjectOutput(ProjectNode project, ConfigurationNode config) + { + string filepath; + filepath = Helper.MakeFilePath((string)config.Options["OutputPath"], + project.AssemblyName, ProjectTypeToExtension(project.Type)); + return NicePath(project, filepath); + } + + // Returns true if two configs in one project have the same output. + private bool ProjectClashes(ProjectNode project) + { + foreach (ConfigurationNode conf1 in project.Configurations) + foreach (ConfigurationNode conf2 in project.Configurations) + if (ProjectOutput(project, conf1) == ProjectOutput(project, conf2) && conf1 != conf2) + { + m_Kernel.Log.Write("Warning: Configurations {0} and {1} for project {2} output the same file", + conf1.Name, conf2.Name, project.Name); + m_Kernel.Log.Write("Warning: I'm going to use some timestamps(extra empty files)."); + return true; + } + return false; + } + + private void WriteProject(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("# This is for project {0}", project.Name); + f.WriteLine(); + + WriteProjectFiles(f, solution, project); + WriteProjectReferences(f, solution, project); + WriteProjectDependencies(f, solution, project); + + bool clash = ProjectClashes(project); + + foreach (ConfigurationNode conf in project.Configurations) + { + string outpath = ProjectOutput(project, conf); + string filesToClean = outpath; + + if (clash) + { + f.WriteLine("{0}-{1}: .{0}-{1}-timestamp", project.Name, conf.Name); + f.WriteLine(); + f.Write(".{0}-{1}-timestamp: $(DEPENDENCIES_{0})", project.Name, conf.Name); + } + else + { + f.WriteLine("{0}-{1}: {2}", project.Name, conf.Name, outpath); + f.WriteLine(); + f.Write("{2}: $(DEPENDENCIES_{0})", project.Name, conf.Name, outpath); + } + // Dependencies on other projects. + foreach (ReferenceNode refr in project.References) + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + if (ProjectClashes(refProj)) + f.Write(" .{0}-{1}-timestamp", refProj.Name, conf.Name); + else + f.Write(" {0}", ProjectOutput(refProj, conf)); + } + f.WriteLine(); + + // make directory for output. + if (Path.GetDirectoryName(outpath) != "") + { + f.WriteLine("\tmkdir -p {0}", Path.GetDirectoryName(outpath)); + } + // mcs command line. + f.Write("\tgmcs", project.Name); + f.Write(" -warn:{0}", conf.Options["WarningLevel"]); + if ((bool)conf.Options["DebugInformation"]) + f.Write(" -debug"); + if ((bool)conf.Options["AllowUnsafe"]) + f.Write(" -unsafe"); + if ((bool)conf.Options["CheckUnderflowOverflow"]) + f.Write(" -checked"); + if (project.StartupObject != "") + f.Write(" -main:{0}", project.StartupObject); + if ((string)conf.Options["CompilerDefines"] != "") + { + f.Write(" -define:\"{0}\"", conf.Options["CompilerDefines"]); + } + + f.Write(" -target:{0} -out:{1}", ProjectTypeToTarget(project.Type), outpath); + + // Build references to other projects. Now that sux. + // We have to reference the other project in the same conf. + foreach (ReferenceNode refr in project.References) + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProj; + refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + f.Write(" -r:{0}", ProjectOutput(refProj, conf)); + } + + f.Write(" $(REFERENCES_{0})", project.Name); + f.Write(" $(RESOURCES_{0})", project.Name); + f.Write(" $(SOURCES_{0})", project.Name); + f.WriteLine(); + + // Copy references with localcopy. + foreach (ReferenceNode refr in project.References) + if (refr.LocalCopy) + { + string outPath, srcPath, destPath; + outPath = Helper.NormalizePath((string)conf.Options["OutputPath"]); + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProj; + refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + srcPath = ProjectOutput(refProj, conf); + destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); + destPath = NicePath(project, destPath); + if (srcPath != destPath) + { + f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); + filesToClean += " " + destPath; + } + continue; + } + srcPath = FindFileReference(refr.Name, project); + if (srcPath != null) + { + destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); + destPath = NicePath(project, destPath); + f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); + filesToClean += " " + destPath; + } + } + + if (clash) + { + filesToClean += String.Format(" .{0}-{1}-timestamp", project.Name, conf.Name); + f.WriteLine("\ttouch .{0}-{1}-timestamp", project.Name, conf.Name); + f.Write("\trm -rf"); + foreach (ConfigurationNode otherConf in project.Configurations) + if (otherConf != conf) + f.WriteLine(" .{0}-{1}-timestamp", project.Name, otherConf.Name); + f.WriteLine(); + } + f.WriteLine(); + f.WriteLine("{0}-{1}-clean:", project.Name, conf.Name); + f.WriteLine("\trm -rf {0}", filesToClean); + f.WriteLine(); + } + } + + private void WriteIntro(StreamWriter f, SolutionNode solution) + { + f.WriteLine("# Makefile for {0} generated by Prebuild ( http://dnpb.sf.net )", solution.Name); + f.WriteLine("# Do not edit."); + f.WriteLine("#"); + + f.Write("# Configurations:"); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}", conf.Name); + f.WriteLine(); + + f.WriteLine("# Projects:"); + foreach (ProjectNode proj in solution.Projects) + f.WriteLine("#\t{0}", proj.Name); + + f.WriteLine("#"); + f.WriteLine("# Building:"); + f.WriteLine("#\t\"make\" to build everything under the default(first) configuration"); + f.WriteLine("#\t\"make CONF\" to build every project under configuration CONF"); + f.WriteLine("#\t\"make PROJ\" to build project PROJ under the default(first) configuration"); + f.WriteLine("#\t\"make PROJ-CONF\" to build project PROJ under configuration CONF"); + f.WriteLine("#"); + f.WriteLine("# Cleaning (removing results of build):"); + f.WriteLine("#\t\"make clean\" to clean everything, that's what you probably want"); + f.WriteLine("#\t\"make CONF\" to clean everything for a configuration"); + f.WriteLine("#\t\"make PROJ\" to clean everything for a project"); + f.WriteLine("#\t\"make PROJ-CONF\" to clea project PROJ under configuration CONF"); + f.WriteLine(); + } + + private void WritePhony(StreamWriter f, SolutionNode solution) + { + string defconf = ""; + foreach (ConfigurationNode conf in solution.Configurations) + { + defconf = conf.Name; + break; + } + + f.Write(".PHONY: all"); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0} {0}-clean", proj.Name); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0} {0}-clean", conf.Name); + foreach (ProjectNode proj in solution.Projects) + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}-{1} {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + + f.WriteLine("all: {0}", defconf); + f.WriteLine(); + + f.Write("clean:"); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}-clean", conf.Name); + f.WriteLine(); + f.WriteLine(); + + foreach (ConfigurationNode conf in solution.Configurations) + { + f.Write("{0}: ", conf.Name); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0}-{1}", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + + f.Write("{0}-clean: ", conf.Name); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + } + + foreach (ProjectNode proj in solution.Projects) + { + f.WriteLine("{0}: {0}-{1}", proj.Name, defconf); + f.WriteLine(); + + f.Write("{0}-clean:", proj.Name); + foreach (ConfigurationNode conf in proj.Configurations) + f.Write(" {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + } + } + + private void WriteSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Creating makefile for {0}", solution.Name); + m_Kernel.CurrentWorkingDirectory.Push(); + + string file = "Makefile";// Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); + StreamWriter f = new StreamWriter(file); + + Helper.SetCurrentDir(Path.GetDirectoryName(file)); + + using (f) + { + WriteIntro(f, solution); + WritePhony(f, solution); + + foreach (ProjectNode project in solution.Projects) + { + m_Kernel.Log.Write("...Creating Project: {0}", project.Name); + WriteProject(f, solution, project); + } + } + + m_Kernel.Log.Write(""); + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning makefile for {0}", solution.Name); + + string file = Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); + Helper.DeleteIfExists(file); + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + public void Write(Kernel kern) + { + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + WriteSolution(solution); + m_Kernel = null; + } + + public virtual void Clean(Kernel kern) + { + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + CleanSolution(sol); + m_Kernel = null; + } + + public string Name + { + get + { + return "makefile"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs new file mode 100644 index 0000000000..ea6d2c2233 --- /dev/null +++ b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs @@ -0,0 +1,515 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("monodev")] + public class MonoDevelopTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + { + tmpPath = Helper.NormalizePath(tmpPath); + } + else + { + tmpPath = Helper.NormalizePath("./" + tmpPath); + } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if(refr.Path != null || fileRef != null) + { + ret += "Assembly\" refto=\""; + + string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; + + ret += finalPath; + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + return ret; + } + + ret += "Gac\""; + ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; + ret += " refto=\""; + try + { + /* + Day changed to 28 Mar 2007 + ... + 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? + 08:09 < jonp> no + 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the + ability to load any assembly version by-name was an inherently + bad idea + 08:11 < cj> I'm thinking of a bunch of four-letter words right now... + 08:11 < cj> security through making it difficult for the developer!!! + 08:12 < jonp> just use the Obsolete API + 08:12 < jonp> it should still work + 08:12 < cj> alrighty. + 08:12 < jonp> you just get warnings when using it + */ + Assembly assem = Assembly.LoadWithPartialName(refr.Name); + ret += assem.FullName; + //ret += refr.Name; + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name; + } + ret += "\" />"; + } + + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if(File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + { + return "False"; + } + return "True"; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string csComp = "Mcs"; + string netRuntime = "Mono"; + if(project.Runtime == ClrRuntime.Microsoft) + { + csComp = "Csc"; + netRuntime = "MsNet"; + } + + string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + + using(ss) + { + ss.WriteLine( + "", + project.Name, + project.RootNamespace + ); + + int count = 0; + + ss.WriteLine(" ", solution.ActiveConfig); + + foreach(ConfigurationNode conf in project.Configurations) + { + ss.WriteLine(" ", conf.Name); + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + + ss.Write(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(string file in project.Files) + { + string buildAction; + string dependson = ""; + string resource_id = ""; + string copyToOutput = ""; + + switch(project.Files.GetBuildAction(file)) + { + case BuildAction.None: + buildAction = "Nothing"; + break; + + case BuildAction.Content: + buildAction = "Exclude"; + break; + + case BuildAction.EmbeddedResource: + buildAction = "EmbedAsResource"; + break; + + default: + buildAction = "Compile"; + break; + } + + if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) + buildAction = "FileCopy"; + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string extension = Path.GetExtension(file); + string designer_format = string.Format(".Designer{0}", extension); + + if (file.EndsWith(designer_format)) + { + string basename = file.Substring(0, file.LastIndexOf(designer_format)); + string[] extensions = new string[] { ".cs", ".resx", ".settings" }; + + foreach(string ext in extensions) + { + if (project.Files.Contains(basename + ext)) + { + dependson = string.Format(" dependson=\"{0}{1}\"", basename, ext); + break; + } + } + } + if (extension == ".resx") + { + buildAction = "EmbedAsResource"; + string basename = file.Substring(0, file.LastIndexOf(".resx")); + + // Visual Studio type resx + form dependency + if (project.Files.Contains(basename + ".cs")) + { + dependson = string.Format(" dependson=\"{0}{1}\"", basename, ".cs"); + } + + // We need to specify a resources file name to avoid MissingManifestResourceExceptions + // in libraries that are built. + resource_id = string.Format(" resource_id=\"{0}.{1}.resources\"", + project.AssemblyName, basename.Replace("/", ".")); + } + + switch(project.Files.GetCopyToOutput(file)) + { + case CopyToOutput.Always: + copyToOutput = string.Format(" copyToOutputDirectory=\"Always\""); + break; + case CopyToOutput.PreserveNewest: + copyToOutput = string.Format(" copyToOutputDirectory=\"PreserveNewest\""); + break; + } + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string filePath = PrependPath(file); + ss.WriteLine(" ", + filePath, buildAction, dependson, resource_id, copyToOutput); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ss.WriteLine(" {0}", BuildReference(solution, refr)); + } + ss.WriteLine(" "); + + + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + int count = 0; + + using(ss) + { + ss.WriteLine("", solution.Name); + + count = 0; + foreach(ConfigurationNode conf in solution.Configurations) + { + if(count == 0) + { + ss.WriteLine(" ", conf.Name); + } + + ss.WriteLine(" ", conf.Name); + foreach(ProjectNode project in solution.Projects) + { + ss.WriteLine(" ", project.Name, conf.Name); + } + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + + count = 0; + + foreach(ProjectNode project in solution.Projects) + { + if(count == 0) + ss.WriteLine(" ", project.Name); + + ss.WriteLine(" ", project.Name); + count++; + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine(" ", + Helper.MakeFilePath(path, project.Name, "mdp")); + } + ss.WriteLine(" "); + + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); + Helper.DeleteIfExists(slnFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "sharpdev"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/NAntTarget.cs b/Prebuild/src/Core/Targets/NAntTarget.cs new file mode 100644 index 0000000000..d4a33f8d3b --- /dev/null +++ b/Prebuild/src/Core/Targets/NAntTarget.cs @@ -0,0 +1,792 @@ +#region BSD License +/* +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +C.J. Adams-Collier (cjac@colliertech.org), + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("nant")] + public class NAntTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr) + { + + if (!String.IsNullOrEmpty(refr.Path)) + { + return refr.Path; + } + + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name]; + string finalPath = + Helper.NormalizePath(refr.Name + GetProjectExtension(projectRef), '/'); + return finalPath; + } + + ProjectNode project = (ProjectNode) refr.Parent; + + // Do we have an explicit file reference? + string fileRef = FindFileReference(refr.Name, project); + if (fileRef != null) + { + return fileRef; + } + + // Is there an explicit path in the project ref? + if (refr.Path != null) + { + return Helper.NormalizePath(refr.Path + "/" + refr.Name + GetProjectExtension(project), '/'); + } + + // No, it's an extensionless GAC ref, but nant needs the .dll extension anyway + return refr.Name + ".dll"; + } + + public static string GetRefFileName(string refName) + { + if (ExtensionSpecified(refName)) + { + return refName; + } + else + { + return refName + ".dll"; + } + } + + private static bool ExtensionSpecified(string refName) + { + return refName.EndsWith(".dll") || refName.EndsWith(".exe"); + } + + private static string GetProjectExtension(ProjectNode project) + { + string extension = ".dll"; + if (project.Type == ProjectType.Exe || project.Type == ProjectType.WinExe) + { + extension = ".exe"; + } + return extension; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName); + + if (File.Exists(fullPath)) + { + return fullPath; + } + + fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + + fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + if (project.ConfigFile != null && project.ConfigFile.Length!=0) + { + ss.Write(" "); + } + + // Add the content files to just be copied + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + foreach (string file in project.Files) + { + // Ignore if we aren't content + if (project.Files.GetBuildAction(file) != BuildAction.Content) + continue; + + // Create a include tag + ss.WriteLine(" {0}", ""); + } + + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + ss.Write(" "); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + ss.WriteLine(" "); + } + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); + if (refr.Path != null) { + if (ExtensionSpecified(refr.Name)) + { + ss.WriteLine (" "); + } + else + { + ss.WriteLine (" "); + } + } + else + { + ss.WriteLine (" "); + } + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + if (!String.IsNullOrEmpty(conf.Options.OutputPath)) + { + string targetDir = Helper.NormalizePath(conf.Options.OutputPath, '/'); + + ss.WriteLine(" "); + + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + break; + } + } + + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating NAnt build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); + + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + // Use the active configuration, which is the first configuration name in the prebuild file. + Dictionary emittedConfigurations = new Dictionary(); + + ss.WriteLine(" ", solution.ActiveConfig); + ss.WriteLine(); + + foreach (ConfigurationNode conf in solution.Configurations) + { + // If the name isn't in the emitted configurations, we give a high level target to the + // platform specific on. This lets "Debug" point to "Debug-AnyCPU". + if (!emittedConfigurations.ContainsKey(conf.Name)) + { + // Add it to the dictionary so we only emit one. + emittedConfigurations.Add(conf.Name, conf.Platform); + + // Write out the target block. + ss.WriteLine(" ", conf.Name, conf.Platform); + ss.WriteLine(" "); + ss.WriteLine(); + } + + // Write out the target for the configuration. + ss.WriteLine(" ", conf.Name, conf.Platform); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine("\t\t ", conf.Platform); + ss.WriteLine(" "); + ss.WriteLine(); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + + // sdague - ok, this is an ugly hack, but what it lets + // us do is native include of files into the nant + // created files from all .nant/*include files. This + // lets us keep using prebuild, but allows for + // extended nant targets to do build and the like. + + try + { + Regex re = new Regex(".include$"); + DirectoryInfo nantdir = new DirectoryInfo(".nant"); + foreach (FileSystemInfo item in nantdir.GetFileSystemInfos()) + { + if (item is DirectoryInfo) { } + else if (item is FileInfo) + { + if (re.Match(item.FullName) != + System.Text.RegularExpressions.Match.Empty) + { + Console.WriteLine("Including file: " + item.FullName); + + using (FileStream fs = new FileStream(item.FullName, + FileMode.Open, + FileAccess.Read, + FileShare.None)) + { + using (StreamReader sr = new StreamReader(fs)) + { + ss.WriteLine("", (item).FullName); + while (sr.Peek() != -1) + { + ss.WriteLine(sr.ReadLine()); + } + ss.WriteLine(); + } + } + } + } + } + } + catch { } + // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" ", solution.Name, solution.Version); + // ss.WriteLine(" "); + + // ss.WriteLine(" "); + // // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" "); + // ss.WriteLine(" "); + ss.WriteLine(); + + + ss.WriteLine(" "); + ss.WriteLine(" "); + //ss.WriteLine(" "); + + // justincc: FIXME FIXME FIXME - A temporary OpenSim hack to clean up files when "nant clean" is executed. + // Should be replaced with extreme prejudice once anybody finds out if the CleanFiles stuff works or there is + // another working mechanism for specifying this stuff + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + if (solution.Cleanup != null && solution.Cleanup.CleanFiles.Count > 0) + { + foreach (CleanFilesNode cleanFile in solution.Cleanup.CleanFiles) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" ", cleanFile.Pattern); + ss.WriteLine(" ", cleanFile.Pattern); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + } + + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning NAnt build files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "nant"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs new file mode 100644 index 0000000000..66dd1bc6f6 --- /dev/null +++ b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs @@ -0,0 +1,82 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +using Prebuild.Core.Attributes; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("sharpdev2")] + public class SharpDevelop2Target : VS2005Target + { + #region Properties + public override string VersionName + { + get + { + return "SharpDevelop2"; + } + } + #endregion + + #region Public Methods + + /// + /// Writes the specified kern. + /// + /// The kern. + public override void Write(Kernel kern) + { + base.Write(kern); + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public override void Clean(Kernel kern) + { + base.Clean(kern); + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return "sharpdev2"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs new file mode 100644 index 0000000000..8e3205025f --- /dev/null +++ b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs @@ -0,0 +1,425 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("sharpdev")] + public class SharpDevelopTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + { + tmpPath = Helper.NormalizePath(tmpPath); + } + else + { + tmpPath = Helper.NormalizePath("./" + tmpPath); + } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if(refr.Path != null || fileRef != null) + { + ret += "Assembly\" refto=\""; + + string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; + + ret += finalPath; + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + return ret; + } + + ret += "Gac\" refto=\""; + try + { + //Assembly assem = Assembly.Load(refr.Name); + ret += refr.Name;// assem.FullName; + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name; + } + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + } + + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if(File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + { + return "False"; + } + return "True"; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string csComp = "Csc"; + string netRuntime = "MsNet"; + if(project.Runtime == ClrRuntime.Mono) + { + csComp = "Mcs"; + netRuntime = "Mono"; + } + + string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + + using(ss) + { + ss.WriteLine( + "", + project.Name, + project.RootNamespace + ); + + ss.WriteLine(" "); + foreach(string file in project.Files) + { + string buildAction = "Compile"; + switch(project.Files.GetBuildAction(file)) + { + case BuildAction.None: + buildAction = "Nothing"; + break; + + case BuildAction.Content: + buildAction = "Exclude"; + break; + + case BuildAction.EmbeddedResource: + buildAction = "EmbedAsResource"; + break; + + default: + buildAction = "Compile"; + break; + } + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string filePath = PrependPath(file); + ss.WriteLine(" ", filePath, buildAction); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ss.WriteLine(" {0}", BuildReference(solution, refr)); + } + ss.WriteLine(" "); + + ss.Write(" "); + + int count = 0; + + ss.WriteLine(" ", solution.ActiveConfig); + + foreach(ConfigurationNode conf in project.Configurations) + { + ss.Write(" "); + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using(ss) + { + ss.WriteLine("", solution.Name); + + int count = 0; + foreach(ProjectNode project in solution.Projects) + { + if(count == 0) + ss.WriteLine(" ", project.Name); + + ss.WriteLine(" ", project.Name); + count++; + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine(" ", + Helper.MakeFilePath(path, project.Name, "prjx")); + } + ss.WriteLine(" "); + + count = 0; + foreach(ConfigurationNode conf in solution.Configurations) + { + if(count == 0) + { + ss.WriteLine(" ", conf.Name); + } + + ss.WriteLine(" ", conf.Name); + foreach(ProjectNode project in solution.Projects) + { + ss.WriteLine(" ", project.Name, conf.Name); + } + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); + Helper.DeleteIfExists(slnFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "sharpdev"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/ToolInfo.cs b/Prebuild/src/Core/Targets/ToolInfo.cs new file mode 100644 index 0000000000..935c6744db --- /dev/null +++ b/Prebuild/src/Core/Targets/ToolInfo.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + public struct ToolInfo + { + string name; + string guid; + string fileExtension; + string xmlTag; + string importProject; + + /// + /// Gets or sets the name. + /// + /// The name. + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + /// + /// Gets or sets the GUID. + /// + /// The GUID. + public string Guid + { + get + { + return guid; + } + set + { + guid = value; + } + } + + /// + /// Gets or sets the file extension. + /// + /// The file extension. + public string FileExtension + { + get + { + return fileExtension; + } + set + { + fileExtension = value; + } + } + public string LanguageExtension + { + get + { + switch (this.Name) + { + case "C#": + return ".cs"; + case "VisualBasic": + return ".vb"; + case "Boo": + return ".boo"; + default: + return ".cs"; + } + } + } + /// + /// Gets or sets the XML tag. + /// + /// The XML tag. + public string XmlTag + { + get + { + return xmlTag; + } + set + { + xmlTag = value; + } + } + + /// + /// Gets or sets the import project property. + /// + /// The ImportProject tag. + public string ImportProject + { + get + { + return importProject; + } + set + { + importProject = value; + } + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The GUID. + /// The file extension. + /// The XML. + /// The import project. + public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) + { + this.name = name; + this.guid = guid; + this.fileExtension = fileExtension; + this.xmlTag = xml; + this.importProject = importProject; + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The GUID. + /// The file extension. + /// The XML. + public ToolInfo(string name, string guid, string fileExtension, string xml) + { + this.name = name; + this.guid = guid; + this.fileExtension = fileExtension; + this.xmlTag = xml; + this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; + } + + /// + /// Equals operator + /// + /// ToolInfo to compare + /// true if toolInfos are equal + public override bool Equals(object obj) + { + if (obj == null) + { + throw new ArgumentNullException("obj"); + } + if (obj.GetType() != typeof(ToolInfo)) + return false; + + ToolInfo c = (ToolInfo)obj; + return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); + } + + /// + /// Equals operator + /// + /// ToolInfo to compare + /// ToolInfo to compare + /// True if toolInfos are equal + public static bool operator ==(ToolInfo c1, ToolInfo c2) + { + return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); + } + + /// + /// Not equals operator + /// + /// ToolInfo to compare + /// ToolInfo to compare + /// True if toolInfos are not equal + public static bool operator !=(ToolInfo c1, ToolInfo c2) + { + return !(c1 == c2); + } + + /// + /// Hash Code + /// + /// Hash code + public override int GetHashCode() + { + return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); + + } + } +} diff --git a/Prebuild/src/Core/Targets/VS2002Target.cs b/Prebuild/src/Core/Targets/VS2002Target.cs new file mode 100644 index 0000000000..2292624473 --- /dev/null +++ b/Prebuild/src/Core/Targets/VS2002Target.cs @@ -0,0 +1,87 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; + +using Prebuild.Core.Attributes; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("vs2002")] + public class VS2002Target : VS2003Target + { + #region Private Methods + + private void SetVS2002() + { + this.SolutionVersion = "7.00"; + this.ProductVersion = "7.0.9254"; + this.SchemaVersion = "1.0"; + this.VersionName = "2002"; + this.Version = VSVersion.VS70; + } + + #endregion + + #region Public Methods + + /// + /// Writes the specified kern. + /// + /// The kern. + public override void Write(Kernel kern) + { + SetVS2002(); + base.Write(kern); + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public override void Clean(Kernel kern) + { + SetVS2002(); + base.Clean(kern); + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return "vs2002"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VS2003Target.cs b/Prebuild/src/Core/Targets/VS2003Target.cs new file mode 100644 index 0000000000..10e2dc4a71 --- /dev/null +++ b/Prebuild/src/Core/Targets/VS2003Target.cs @@ -0,0 +1,593 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + [Target("vs2003")] + public class VS2003Target : ITarget + { + + #region Fields + + string solutionVersion = "8.00"; + string productVersion = "7.10.3077"; + string schemaVersion = "2.0"; + string versionName = "2003"; + VSVersion version = VSVersion.VS71; + + readonly Dictionary m_Tools = new Dictionary(); + Kernel m_Kernel; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + protected string SolutionVersion + { + get + { + return solutionVersion; + } + set + { + solutionVersion = value; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + protected string ProductVersion + { + get + { + return productVersion; + } + set + { + productVersion = value; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + protected string SchemaVersion + { + get + { + return schemaVersion; + } + set + { + schemaVersion = value; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + protected string VersionName + { + get + { + return versionName; + } + set + { + versionName = value; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + protected VSVersion Version + { + get + { + return version; + } + set + { + version = value; + } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2003Target() + { + m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); + m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach(ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if(ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch(ArgumentException) + { + m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if(!m_Tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = m_Tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using(ps) + { + ps.WriteLine(""); + ps.WriteLine(" <{0}", toolInfo.XmlTag); + ps.WriteLine("\t\t\t\tProjectType = \"Local\""); + ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", ProductVersion); + ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", SchemaVersion); + ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); + ps.WriteLine("\t\t>"); + + ps.WriteLine("\t\t\t\t"); + ps.WriteLine(" "); + + foreach(ConfigurationNode conf in project.Configurations) + { + ps.WriteLine("\t\t\t\t "); + } + + ps.WriteLine(" "); + + ps.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach(string file in project.Files) + { + string fileName = file.Replace(".\\", ""); + ps.WriteLine(" "); + + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ps.WriteLine(" "); + + } + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" ", toolInfo.XmlTag); + ps.WriteLine(""); + } + + ps = new StreamWriter(projectFile + ".user"); + using(ps) + { + ps.WriteLine(""); + ps.WriteLine(" <{0}>", toolInfo.XmlTag); + ps.WriteLine(" "); + + ps.WriteLine(" ", MakeRefPath(project)); + foreach(ConfigurationNode conf in project.Configurations) + { + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" ", toolInfo.XmlTag); + ps.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false + // { + // return string.Empty; + // } + + //default to "AssemblyName.xml" + //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + //return (string)conf.Options["XmlDocFile", defaultValue]; + + //default to no XmlDocFile file + return (string)conf.Options["XmlDocFile", ""]; + } + + private void WriteSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", VersionName); + + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + StreamWriter ss = new StreamWriter(solutionFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + using(ss) + { + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + foreach(ProjectNode project in solution.Projects) + { + if(!m_Tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = m_Tools[project.Language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", + toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, + toolInfo.FileExtension), project.Guid.ToString().ToUpper()); + + ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); + ss.WriteLine("\tEndProjectSection"); + + ss.WriteLine("EndProject"); + } + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); + foreach(ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.Name); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); + foreach(ProjectNode project in solution.Projects) + { + for(int i = 0; i < project.References.Count; i++) + { + ReferenceNode refr = project.References[i]; + if(solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProject = solution.ProjectsTable[refr.Name]; + ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", + project.Guid.ToString().ToUpper() + , i, + refProject.Guid.ToString().ToUpper() + ); + } + } + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); + foreach(ProjectNode project in solution.Projects) + { + foreach(ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", + project.Guid.ToString().ToUpper(), + conf.Name); + + ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", + project.Guid.ToString().ToUpper(), + conf.Name); + } + } + ss.WriteLine("\tEndGlobalSection"); + + if(solution.Files != null) + { + ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); + foreach(string file in solution.Files) + { + ss.WriteLine("\t\t{0} = {0}", file); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); + ss.WriteLine("\tEndGlobalSection"); + ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("EndGlobal"); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = m_Tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in m_Kernel.Solutions) + { + WriteSolution(sol); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in m_Kernel.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public virtual string Name + { + get + { + return "vs2003"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VS2005Target.cs b/Prebuild/src/Core/Targets/VS2005Target.cs new file mode 100644 index 0000000000..9c70e26a37 --- /dev/null +++ b/Prebuild/src/Core/Targets/VS2005Target.cs @@ -0,0 +1,147 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("vs2005")] + public class VS2005Target : VSGenericTarget + { + #region Inner Classes + + #endregion + + #region Fields + + string solutionVersion = "9.00"; + string productVersion = "8.0.50727"; + string schemaVersion = "2.0"; + string versionName = "Visual C# 2005"; + string name = "vs2005"; + + VSVersion version = VSVersion.VS80; + + public override string SolutionTag + { + get { return "# Visual Studio 2005"; } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + return string.Empty; + } + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2005Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VS2008Target.cs b/Prebuild/src/Core/Targets/VS2008Target.cs new file mode 100644 index 0000000000..fee4f7f27f --- /dev/null +++ b/Prebuild/src/Core/Targets/VS2008Target.cs @@ -0,0 +1,127 @@ +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2008")] + public class VS2008Target : VSGenericTarget + { + #region Fields + string solutionVersion = "10.00"; + string productVersion = "9.0.21022"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2008"; + string name = "vs2008"; + VSVersion version = VSVersion.VS90; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v3_5: + return "ToolsVersion=\"3.5\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2008"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2008Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs new file mode 100644 index 0000000000..ea9f736475 --- /dev/null +++ b/Prebuild/src/Core/Targets/VS2010Target.cs @@ -0,0 +1,138 @@ +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2010")] + public class VS2010Target : VSGenericTarget + { + #region Fields + + string solutionVersion = "11.00"; + string productVersion = "9.0.30729"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2010"; + string name = "vs2010"; + VSVersion version = VSVersion.VS10; + + #endregion + + #region Properties + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v4_0: + case FrameworkVersion.v3_5: + return "ToolsVersion=\"4.0\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2010"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2010Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs new file mode 100644 index 0000000000..6969dd7323 --- /dev/null +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs @@ -0,0 +1,922 @@ +#region BSD License +/* +Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + public abstract class VSGenericTarget : ITarget + { + #region Fields + + readonly Dictionary tools = new Dictionary(); + Kernel kernel; + #endregion + + #region Properties + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public abstract string SolutionVersion { get; } + /// + /// Gets or sets the product version. + /// + /// The product version. + public abstract string ProductVersion { get; } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public abstract string SchemaVersion { get; } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public abstract string VersionName { get; } + /// + /// Gets or sets the version. + /// + /// The version. + public abstract VSVersion Version { get; } + /// + /// Gets the name. + /// + /// The name. + public abstract string Name { get; } + + protected abstract string GetToolsVersionXml(FrameworkVersion version); + public abstract string SolutionTag { get; } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + protected VSGenericTarget() + { + tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); + tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); + tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); + tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); + tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach (ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if (ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch (ArgumentException) + { + kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) + { + SolutionNode node = solution; + + while (node.Parent is SolutionNode) + node = node.Parent as SolutionNode; + + return FindProjectInSolutionRecursively(name, node); + } + + private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) + { + if (solution.ProjectsTable.ContainsKey(name)) + return solution.ProjectsTable[name]; + + foreach (SolutionNode child in solution.Solutions) + { + ProjectNode node = FindProjectInSolutionRecursively(name, child); + if (node != null) + return node; + } + + return null; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if (!tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + #region Project File + using (ps) + { + ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); + ps.WriteLine(" "); + ps.WriteLine(" Local"); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" {0}", SchemaVersion); + ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); + + // Visual Studio has a hard coded guid for the project type + if (project.Type == ProjectType.Web) + ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); + ps.WriteLine(" Debug"); + ps.WriteLine(" {0}", project.AppIcon); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", project.AssemblyName); + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != "") + { + ps.WriteLine(" {0}", conf.Options.KeyFile); + ps.WriteLine(" true"); + break; + } + } + ps.WriteLine(" JScript"); + ps.WriteLine(" Grid"); + ps.WriteLine(" IE50"); + ps.WriteLine(" false"); + ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); + + ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); + ps.WriteLine(" {0}", project.DesignerFolder); + ps.WriteLine(" {0}", project.RootNamespace); + ps.WriteLine(" {0}", project.StartupObject); + if (string.IsNullOrEmpty(project.DebugStartParameters)) + { + ps.WriteLine(" {0}", project.DebugStartParameters); + } + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" ", conf.Name, conf.Platform); + ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); + ps.WriteLine(" {0}", conf.Options["BaseAddress"]); + ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); + ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); + ps.WriteLine(" {0}", conf.Options["DebugInformation"]); + ps.WriteLine(" {0}", conf.Options["FileAlignment"]); + ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); + if (project.Type != ProjectType.Web) + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); + else + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath("bin\\"))); + + ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); + ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); + ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); + ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); + ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); + ps.WriteLine(" {0}", conf.Platform); + ps.WriteLine(" "); + } + + //ps.WriteLine(" "); + + Dictionary projectReferences = new Dictionary(); + List otherReferences = new List(); + + foreach (ReferenceNode refr in project.References) + { + ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); + + if (projectNode == null) + otherReferences.Add(refr); + else + projectReferences.Add(refr, projectNode); + } + // Assembly References + ps.WriteLine(" "); + + foreach (ReferenceNode refr in otherReferences) + { + ps.Write(" "); + ps.Write(" "); + ps.Write(refr.Name); + ps.WriteLine(""); + + if(!String.IsNullOrEmpty(refr.Path)) + { + // Use absolute path to assembly (for determining assembly type) + string absolutePath = Path.Combine(project.FullPath, refr.Path); + if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { + // Assembly is an executable (exe) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); + } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { + // Assembly is an library (dll) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } else { + string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); + kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } + } + + ps.WriteLine(" {0}", refr.LocalCopy); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + //Project References + ps.WriteLine(" "); + foreach (KeyValuePair pair in projectReferences) + { + ToolInfo tool = tools[pair.Value.Language]; + if (tools == null) + throw new UnknownLanguageException(); + + string path = + Helper.MakePathRelativeTo(project.FullPath, + Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); + ps.WriteLine(" ", path); + + // TODO: Allow reference to visual basic projects + ps.WriteLine(" {0}", pair.Value.Name); + ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); + ps.WriteLine(" {0}", tool.Guid.ToUpper()); + + //This is the Copy Local flag in VS + ps.WriteLine(" {0}", pair.Key.LocalCopy); + + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + // ps.WriteLine(" "); + ps.WriteLine(" "); + + // ps.WriteLine(" "); + List list = new List(); + + foreach (string path in project.Files) + { + string lower = path.ToLower(); + if (lower.EndsWith(".resx")) + { + string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); + if (!list.Contains(codebehind)) + list.Add(codebehind); + } + + } + + foreach (string filePath in project.Files) + { + // if (file == "Properties\\Bind.Designer.cs") + // { + // Console.WriteLine("Wait a minute!"); + // Console.WriteLine(project.Files.GetSubType(file).ToString()); + // } + SubType subType = project.Files.GetSubType(filePath); + + // Visual Studio chokes on file names if forward slash is used as a path separator + // instead of backslash. So we must make sure that all file paths written to the + // project file use \ as a path separator. + string file = filePath.Replace(@"/", @"\"); + + if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer + && subType != SubType.CodeBehind) + { + ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ps.WriteLine(" {0}", Path.GetFileName(file)); + ps.WriteLine(" Designer"); + ps.WriteLine(" "); + // + } + + if (subType == SubType.Designer) + { + ps.WriteLine(" ", file); + + string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; + string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; + + // Check for a parent .cs file with the same name as this designer file + if (File.Exists(Helper.NormalizePath(dependent_name))) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" ResXFileCodeGenerator"); + ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); + ps.WriteLine(" " + subType + ""); + } + + ps.WriteLine(" "); + if (File.Exists(Helper.NormalizePath(autogen_name))) + { + ps.WriteLine(" ", autogen_name); + //ps.WriteLine(" True"); + + // If a parent .cs file exists, link this autogen file to it. Otherwise link + // to the designer file + if (File.Exists(dependent_name)) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" True"); + ps.WriteLine(" {0}", Path.GetFileName(filePath)); + } + + ps.WriteLine(" "); + } + list.Add(autogen_name); + } + if (subType == SubType.Settings) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + ps.WriteLine("Include=\"{0}\">", file); + string fileName = Path.GetFileName(filePath); + if (project.Files.GetBuildAction(filePath) == BuildAction.None) + { + ps.WriteLine(" SettingsSingleFileGenerator"); + ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); + } + else + { + ps.WriteLine(" Code"); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); + string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); + ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); + } + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + else if (subType != SubType.Designer) + { + string path = Helper.NormalizePath(file); + string path_lower = path.ToLower(); + + if (!list.Contains(filePath)) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + + int startPos = 0; + if (project.Files.GetPreservePath(filePath)) + { + while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) + startPos++; + + } + else + { + startPos = file.LastIndexOf(Path.GetFileName(path)); + } + + // be sure to write out the path with backslashes so VS recognizes + // the file properly. + ps.WriteLine("Include=\"{0}\">", file); + + int last_period_index = file.LastIndexOf('.'); + string short_file_name = file.Substring(0, last_period_index); + string extension = Path.GetExtension(path); + // make this upper case, so that when File.Exists tests for the + // existence of a designer file on a case-sensitive platform, + // it is correctly identified. + string designer_format = string.Format(".Designer{0}", extension); + + if (path_lower.EndsWith(designer_format.ToLowerInvariant())) + { + int designer_index = path.IndexOf(designer_format); + string file_name = path.Substring(0, designer_index); + + // There are two corrections to the next lines: + // 1. Fix the connection between a designer file and a form + // or usercontrol that don't have an associated resx file. + // 2. Connect settings files to associated designer files. + if (File.Exists(file_name + extension)) + ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); + else if (File.Exists(file_name + ".resx")) + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); + else if (File.Exists(file_name + ".settings")) + { + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + } + } + else if (subType == SubType.CodeBehind) + { + ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); + } + if (project.Files.GetIsLink(filePath)) + { + string alias = project.Files.GetLinkPath(filePath); + alias += file.Substring(startPos); + alias = Helper.NormalizePath(alias); + ps.WriteLine(" {0}", alias); + } + else if (project.Files.GetBuildAction(filePath) != BuildAction.None) + { + if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) + { + ps.WriteLine(" {0}", subType); + } + } + + if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) + { + ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); + } + + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + } + } + + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(""); + } + #endregion + + #region User File + + ps = new StreamWriter(projectFile + ".user"); + using (ps) + { + // Get the first configuration from the project. + ConfigurationNode firstConfiguration = null; + + if (project.Configurations.Count > 0) + { + firstConfiguration = project.Configurations[0]; + } + + ps.WriteLine(""); + //ps.WriteLine( "" ); + //ps.WriteLine(" <{0}>", toolInfo.XMLTag); + //ps.WriteLine(" "); + ps.WriteLine(" "); + //ps.WriteLine(" ", MakeRefPath(project)); + + if (firstConfiguration != null) + { + ps.WriteLine(" {0}", firstConfiguration.Name); + ps.WriteLine(" {0}", firstConfiguration.Platform); + } + + ps.WriteLine(" {0}", MakeRefPath(project)); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" ProjectFiles"); + ps.WriteLine(" 0"); + ps.WriteLine(" "); + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" "); + } + ps.WriteLine(""); + } + #endregion + + kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) + { + kernel.Log.Write("Creating {0} solution and project files", VersionName); + + foreach (SolutionNode child in solution.Solutions) + { + kernel.Log.Write("...Creating folder: {0}", child.Name); + WriteSolution(child, false); + } + + foreach (ProjectNode project in solution.Projects) + { + kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + + foreach (DatabaseProjectNode project in solution.DatabaseProjects) + { + kernel.Log.Write("...Creating database project: {0}", project.Name); + WriteDatabaseProject(solution, project); + } + + if (writeSolutionToDisk) // only write main solution + { + kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + + using (StreamWriter ss = new StreamWriter(solutionFile)) + { + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + ss.WriteLine(SolutionTag); + + WriteProjectDeclarations(ss, solution, solution); + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + WriteConfigurationLines(solution.Configurations, solution, ss); + ss.WriteLine("\tEndGlobalSection"); + + if (solution.Solutions.Count > 0) + { + ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); + foreach (SolutionNode embeddedSolution in solution.Solutions) + { + WriteNestedProjectMap(ss, embeddedSolution); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("EndGlobal"); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + } + + private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) + { + foreach (SolutionNode childSolution in embeddedSolution.Solutions) + { + WriteEmbeddedSolution(writer, childSolution); + WriteProjectDeclarations(writer, actualSolution, childSolution); + } + + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteProject(actualSolution, writer, project); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteProject(actualSolution, writer, dbProject); + } + + if (actualSolution.Guid == embeddedSolution.Guid) + { + WriteSolutionFiles(actualSolution, writer); + } + } + + private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) + { + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteNestedProject(writer, embeddedSolution, project.Guid); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteNestedProject(writer, embeddedSolution, dbProject.Guid); + } + + foreach (SolutionNode child in embeddedSolution.Solutions) + { + WriteNestedProject(writer, embeddedSolution, child.Guid); + WriteNestedProjectMap(writer, child); + } + } + + private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) + { + WriteNestedFolder(writer, solution.Guid, projectGuid); + } + + private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) + { + writer.WriteLine("\t\t{0} = {1}", + childGuid.ToString("B").ToUpper(), + parentGuid.ToString("B").ToUpper()); + } + + private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) + { + foreach (ProjectNode project in solution.Projects) + { + foreach (ConfigurationNode conf in configurations) + { + ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + + ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + } + } + + foreach (SolutionNode child in solution.Solutions) + { + WriteConfigurationLines(configurations, child, ss); + } + } + + private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) + { + if(solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); + } + + private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) + { + WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) + { + WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) + { + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + } + + const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; + const string ProjectDeclarationEndFormat = "EndProject"; + + private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); + + path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); + + WriteProject(ss, language, guid, name, path); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) + { + WriteProject(writer, language, projectGuid, name, location, null); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + writer.WriteLine(ProjectDeclarationBeginFormat, + toolInfo.Guid, + name, + location, + projectGuid.ToString("B").ToUpper()); + + if (files != null) + { + writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); + + foreach (string file in files) + writer.WriteLine("\t\t{0} = {0}", file); + + writer.WriteLine("\tEndProjectSection"); + } + + writer.WriteLine(ProjectDeclarationEndFormat); + } + + private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) + { + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); + IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); + + kernel.CurrentWorkingDirectory.Push(); + + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using (ps) + { + ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); + ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); + ps.Indent++; + ps.WriteLine("MSDTVersion = \"80\""); + // TODO: Use the project.Files property + if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) + WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); + + ps.WriteLine("Begin DBRefFolder = \"Database References\""); + ps.Indent++; + foreach (DatabaseReferenceNode reference in project.References) + { + ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); + ps.Indent++; + ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); + ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); + //ps.WriteLine("Colorizer = 5"); + ps.Indent--; + ps.WriteLine("End"); + } + ps.Indent--; + ps.WriteLine("End"); + ps.Indent--; + ps.WriteLine("End"); + + ps.Flush(); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + + private static bool ContainsSqlFiles(string folder) + { + if(Directory.GetFiles(folder, "*.sql").Length > 0) + return true; // if the folder contains 1 .sql file, that's good enough + + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + return true; // if 1 child folder contains a .sql file, still good enough + } + + return false; + } + + private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) + { + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + { + writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); + writer.Indent++; + WriteDatabaseFoldersAndFiles(writer, child); + writer.Indent--; + writer.WriteLine("End"); + } + } + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); + } + } + + private void CleanProject(ProjectNode project) + { + kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + WriteSolution(sol, true); + } + kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + CleanSolution(sol); + } + kernel = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VSVersion.cs b/Prebuild/src/Core/Targets/VSVersion.cs new file mode 100644 index 0000000000..699b5ca019 --- /dev/null +++ b/Prebuild/src/Core/Targets/VSVersion.cs @@ -0,0 +1,54 @@ +#region BSD License +/* +Copyright (c) 2008-2009 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + public enum VSVersion + { + /// + /// Visual Studio 2002 + /// + VS70, + /// + /// Visual Studio 2003 + /// + VS71, + /// + /// Visual Studio 2005 + /// + VS80, + /// + /// Visual Studio 2008 + /// + VS90, + /// + /// Visual Studio 2010 + /// + VS10 + } +} diff --git a/Prebuild/src/Core/Targets/XcodeTarget.cs b/Prebuild/src/Core/Targets/XcodeTarget.cs new file mode 100644 index 0000000000..5393cec05f --- /dev/null +++ b/Prebuild/src/Core/Targets/XcodeTarget.cs @@ -0,0 +1,594 @@ +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("xcode")] + public class XcodeTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path + "/" + refr.Name + ".dll", '/') : fileRef; + ret += finalPath; + return ret; + } + + try + { + //Assembly assem = Assembly.Load(refr.Name); + //if (assem != null) + //{ + //ret += (refr.Name + ".dll"); + //} + //else + //{ + ret += (refr.Name + ".dll"); + //} + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name + ".dll"; + } + } + return ret; + } + + private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; + ret += finalPath; + return ret; + } + + try + { + Assembly assem = Assembly.Load(refr.Name); + if (assem != null) + { + ret += ""; + } + else + { + ret += ""; + } + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += ""; + } + } + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + ss.WriteLine(" ", '/')); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating Xcode build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj")); + if (!directoryInfo.Exists) + { + directoryInfo.Create(); + } + string combFile = Helper.MakeFilePath(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj"), "project", "pbxproj"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); + + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + foreach (ConfigurationNode conf in solution.Configurations) + { + // Set the project.config to a non-debug configuration + if (conf.Options["DebugInformation"].ToString().ToLower() != "true") + { + ss.WriteLine(" ", conf.Name); + } + ss.WriteLine(); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine(" "); + ss.WriteLine(); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + //foreach(ProjectNode project in solution.Projects) + //{ + // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + // ss.Write(" "); + //} + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Xcode build files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "xcode"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/UnknownLanguageException.cs b/Prebuild/src/Core/UnknownLanguageException.cs new file mode 100644 index 0000000000..607b66c022 --- /dev/null +++ b/Prebuild/src/Core/UnknownLanguageException.cs @@ -0,0 +1,63 @@ +/* + * $RCSfile$ + * Copyright (C) 2004, 2005 David Hudson (jendave@yahoo.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + [Serializable()] + public class UnknownLanguageException : Exception + { + /// + /// Basic exception. + /// + public UnknownLanguageException() + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public UnknownLanguageException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public UnknownLanguageException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + } +} diff --git a/Prebuild/src/Core/Utilities/.svn/all-wcprops b/Prebuild/src/Core/Utilities/.svn/all-wcprops new file mode 100644 index 0000000000..7418c29534 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 60 +/svnroot/dnpb/!svn/ver/309/trunk/Prebuild/src/Core/Utilities +END +Helper.cs +K 25 +svn:wc:ra_dav:version-url +V 70 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Utilities/Helper.cs +END +Log.cs +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/dnpb/!svn/ver/309/trunk/Prebuild/src/Core/Utilities/Log.cs +END +CommandLineCollection.cs +K 25 +svn:wc:ra_dav:version-url +V 85 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Utilities/CommandLineCollection.cs +END +CurrentDirectory.cs +K 25 +svn:wc:ra_dav:version-url +V 80 +/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Utilities/CurrentDirectory.cs +END diff --git a/Prebuild/src/Core/Utilities/.svn/dir-prop-base b/Prebuild/src/Core/Utilities/.svn/dir-prop-base new file mode 100644 index 0000000000..a1989a0b6d --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/dir-prop-base @@ -0,0 +1,5 @@ +K 10 +svn:ignore +V 5 +*.swp +END diff --git a/Prebuild/src/Core/Utilities/.svn/entries b/Prebuild/src/Core/Utilities/.svn/entries new file mode 100644 index 0000000000..cc148d7550 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/entries @@ -0,0 +1,164 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Utilities +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2009-04-15T01:40:10.014568Z +309 +kunnis +has-props + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +Helper.cs +file + + + + +2010-09-10T22:51:44.000000Z +7a0749dec0ce5453fc73dd11f89ce613 +2009-04-15T01:28:16.827957Z +307 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +14966 + +Log.cs +file + + + + +2010-09-10T22:51:44.000000Z +d91804d20a90778d74744cd14bb2fa4c +2009-04-15T01:40:10.014568Z +309 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +6100 + +CommandLineCollection.cs +file + + + + +2010-09-10T22:51:44.000000Z +2a00bed45ea425e5e8a21a5ff6a68d69 +2009-04-15T01:28:16.827957Z +307 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +4032 + +CurrentDirectory.cs +file + + + + +2010-09-10T22:51:44.000000Z +e710723e685cc628a3761209001c8767 +2009-04-15T01:28:16.827957Z +307 +kunnis +has-props + + + + + + + + + + + + + + + + + + + + +2124 + diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base new file mode 100644 index 0000000000..786fa1e49d --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base @@ -0,0 +1,152 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System.Collections; +using System.Collections.Generic; + +namespace Prebuild.Core.Utilities +{ + /// + /// The CommandLine class parses and interprets the command-line arguments passed to + /// prebuild. + /// + public class CommandLineCollection : IEnumerable> + { + #region Fields + + // The raw OS arguments + private readonly string[] m_RawArgs; + + // Command-line argument storage + private readonly Dictionary m_Arguments = new Dictionary(); + + #endregion + + #region Constructors + + /// + /// Create a new CommandLine instance and set some internal variables. + /// + public CommandLineCollection(string[] args) + { + m_RawArgs = args; + + Parse(); + } + + #endregion + + #region Private Methods + + private void Parse() + { + if(m_RawArgs.Length < 1) + return; + + int idx = 0; + string lastArg = null; + + while(idx 2 && arg[0] == '/') + { + arg = arg.Substring(1); + lastArg = arg; + m_Arguments[arg] = ""; + } + else + { + if(lastArg != null) + { + m_Arguments[lastArg] = arg; + lastArg = null; + } + } + + idx++; + } + } + + #endregion + + #region Public Methods + + /// + /// Wases the passed. + /// + /// The arg. + /// + public bool WasPassed(string arg) + { + return (m_Arguments.ContainsKey(arg)); + } + + #endregion + + #region Properties + + /// + /// Gets the parameter associated with the command line option + /// + /// Returns null if option was not specified, + /// null string if no parameter was specified, and the value if a parameter was specified + public string this[string index] + { + get + { + if(m_Arguments.ContainsKey(index)) + { + return (m_Arguments[index]); + } + return null; + } + } + + #endregion + + #region IEnumerable Members + + /// + /// Returns an enumerator that can iterate through a collection. + /// + /// + /// An + /// that can be used to iterate through the collection. + /// + public IEnumerator> GetEnumerator() + { + return m_Arguments.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base new file mode 100644 index 0000000000..9624c35ed5 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base @@ -0,0 +1,68 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public class CurrentDirectory + { + #region Fields + + private readonly Stack m_Stack = new Stack(); + + #endregion + + #region Public Methods + + /// + /// Pushes this instance. + /// + public void Push() + { + m_Stack.Push(Environment.CurrentDirectory); + } + + /// + /// Pops this instance. + /// + public void Pop() + { + if(m_Stack.Count < 1) + { + return; + } + + string cwd = m_Stack.Pop(); + Helper.SetCurrentDir(cwd); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base new file mode 100644 index 0000000000..8c3e9680c5 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base @@ -0,0 +1,575 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Collections.Specialized; +using System.Xml; +using Prebuild.Core.Nodes; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public class Helper + { + #region Fields + + static bool checkForOSVariables; + + /// + /// + /// + public static bool CheckForOSVariables + { + get + { + return checkForOSVariables; + } + set + { + checkForOSVariables = value; + } + } + + #endregion + + #region Public Methods + + #region String Parsing + + public delegate string StringLookup(string key); + + /// + /// Gets a collection of StringLocationPair objects that represent the matches + /// + /// The target. + /// The before group. + /// The after group. + /// if set to true [include delimiters in substrings]. + /// + public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) + { + if( beforeGroup == null ) + { + throw new ArgumentNullException("beforeGroup"); + } + if( afterGroup == null ) + { + throw new ArgumentNullException("afterGroup"); + } + StringCollection results = new StringCollection(); + if(target == null || target.Length == 0) + { + return results; + } + + int beforeMod = 0; + int afterMod = 0; + if(includeDelimitersInSubstrings) + { + //be sure to not exlude the delims + beforeMod = beforeGroup.Length; + afterMod = afterGroup.Length; + } + int startIndex = 0; + while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { + int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it + if(endIndex == -1) + { + break; + } + int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string + string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, + length - afterMod); + + results.Add(substring); + //results.Add(new StringLocationPair(substring,startIndex)); + startIndex = endIndex + 1; + //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization + //so start after endIndex + + } + return results; + } + + /// + /// Replaces the groups. + /// + /// The target. + /// The before group. + /// The after group. + /// The lookup. + /// + public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { + if( target == null ) + { + throw new ArgumentNullException("target"); + } + //int targetLength = target.Length; + StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); + if( lookup == null ) + { + throw new ArgumentNullException("lookup"); + } + foreach(string substring in strings) + { + target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); + } + return target; + } + + /// + /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate + /// + /// The target. + /// The lookup. + /// + public static string InterpolateForVariables(string target, StringLookup lookup) + { + return ReplaceGroups(target, "${" , "}" , lookup); + } + + /// + /// Replaces ${var} statements in a string with the corresonding environment variable with name var + /// + /// + /// + public static string InterpolateForEnvironmentVariables(string target) + { + return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); + } + + #endregion + + /// + /// Translates the value. + /// + /// Type of the translate. + /// The translation item. + /// + public static object TranslateValue(Type translateType, string translationItem) + { + if(translationItem == null) + { + return null; + } + + try + { + string lowerVal = translationItem.ToLower(); + if(translateType == typeof(bool)) + { + return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); + } + else if(translateType == typeof(int)) + { + return (Int32.Parse(translationItem)); + } + else + { + return translationItem; + } + } + catch(FormatException) + { + return null; + } + } + + /// + /// Deletes if exists. + /// + /// The file. + /// + public static bool DeleteIfExists(string file) + { + string resFile = null; + try + { + resFile = ResolvePath(file); + } + catch(ArgumentException) + { + return false; + } + + if(!File.Exists(resFile)) + { + return false; + } + + File.Delete(resFile); + return true; + } + + static readonly char seperator = Path.DirectorySeparatorChar; + + // This little gem was taken from the NeL source, thanks guys! + /// + /// Makes a relative path + /// + /// Path to start from + /// Path to end at + /// Path that will get from startPath to endPath + public static string MakePathRelativeTo(string startPath, string endPath) + { + string tmp = NormalizePath(startPath, seperator); + string src = NormalizePath(endPath, seperator); + string prefix = ""; + + while(true) + { + if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) + { + string ret; + int size = tmp.Length; + if(size == src.Length) + { + return "./"; + } + if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) + { + } + else + { + ret = prefix + endPath.Substring(size, endPath.Length - size); + ret = ret.Trim(); + if(ret[0] == seperator) + { + ret = "." + ret; + } + + return NormalizePath(ret); + } + + } + + if(tmp.Length < 2) + { + break; + } + + int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); + int prevPos = tmp.IndexOf(seperator); + + if((lastPos == prevPos) || (lastPos == -1)) + { + break; + } + + tmp = tmp.Substring(0, lastPos + 1); + prefix += ".." + seperator.ToString(); + } + + return endPath; + } + + /// + /// Resolves the path. + /// + /// The path. + /// + public static string ResolvePath(string path) + { + string tmpPath = NormalizePath(path); + if(tmpPath.Length < 1) + { + tmpPath = "."; + } + + tmpPath = Path.GetFullPath(tmpPath); + if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) + { + throw new ArgumentException("Path could not be resolved: " + tmpPath); + } + + return tmpPath; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// The separator character. + /// + public static string NormalizePath(string path, char separatorCharacter) + { + if(path == null || path == "" || path.Length < 1) + { + return ""; + } + + string tmpPath = path.Replace('\\', '/'); + tmpPath = tmpPath.Replace('/', separatorCharacter); + return tmpPath; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + return NormalizePath(path, Path.DirectorySeparatorChar); + } + + /// + /// Ends the path. + /// + /// The path. + /// The separator character. + /// + public static string EndPath(string path, char separatorCharacter) + { + if(path == null || path == "" || path.Length < 1) + { + return ""; + } + + if(!path.EndsWith(separatorCharacter.ToString())) + { + return (path + separatorCharacter); + } + + return path; + } + + /// + /// Ends the path. + /// + /// The path. + /// + public static string EndPath(string path) + { + return EndPath(path, Path.DirectorySeparatorChar); + } + + /// + /// Makes the file path. + /// + /// The path. + /// The name. + /// The ext. + /// + public static string MakeFilePath(string path, string name, string ext) + { + string ret = EndPath(NormalizePath(path)); + + if( name == null ) + { + throw new ArgumentNullException("name"); + } + + ret += name; + if(!name.EndsWith("." + ext)) + { + ret += "." + ext; + } + + //foreach(char c in Path.GetInvalidPathChars()) + //{ + // ret = ret.Replace(c, '_'); + //} + + return ret; + } + + /// + /// Makes the file path. + /// + /// The path. + /// The name. + /// + public static string MakeFilePath(string path, string name) + { + string ret = EndPath(NormalizePath(path)); + + if( name == null ) + { + throw new ArgumentNullException("name"); + } + + ret += name; + + //foreach (char c in Path.GetInvalidPathChars()) + //{ + // ret = ret.Replace(c, '_'); + //} + + return ret; + } + + /// + /// + /// + /// + /// + public static string MakeReferencePath(string path) + { + string ret = EndPath(NormalizePath(path)); + + //foreach (char c in Path.GetInvalidPathChars()) + //{ + // ret = ret.Replace(c, '_'); + //} + + return ret; + } + + /// + /// Sets the current dir. + /// + /// The path. + public static void SetCurrentDir(string path) + { + if( path == null ) + { + throw new ArgumentNullException("path"); + } + if(path.Length < 1) + { + return; + } + + Environment.CurrentDirectory = path; + } + + /// + /// Checks the type. + /// + /// The type to check. + /// The attr. + /// The inter. + /// + public static object CheckType(Type typeToCheck, Type attr, Type inter) + { + if(typeToCheck == null || attr == null) + { + return null; + } + + object[] attrs = typeToCheck.GetCustomAttributes(attr, false); + if(attrs == null || attrs.Length < 1) + { + return null; + } + if( inter == null ) + { + throw new ArgumentNullException("inter"); + } + + if(typeToCheck.GetInterface(inter.FullName) == null) + { + return null; + } + + return attrs[0]; + } + + /// + /// Attributes the value. + /// + /// The node. + /// The attr. + /// The def. + /// + public static string AttributeValue(XmlNode node, string attr, string def) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(node.Attributes[attr] == null) + { + return def; + } + string val = node.Attributes[attr].Value; + if(!CheckForOSVariables) + { + return val; + } + + return InterpolateForEnvironmentVariables(val); + } + + /// + /// Parses the boolean. + /// + /// The node. + /// The attr. + /// if set to true [default value]. + /// + public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(node.Attributes[attr] == null) + { + return defaultValue; + } + return bool.Parse(node.Attributes[attr].Value); + } + + /// + /// Enums the attribute value. + /// + /// The node. + /// The attr. + /// Type of the enum. + /// The def. + /// + public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) + { + if( def == null ) + { + throw new ArgumentNullException("def"); + } + string val = AttributeValue(node, attr, def.ToString()); + return Enum.Parse(enumType, val, true); + } + + /// + /// + /// + /// + /// + /// + public static string AssemblyFullName(string assemblyName, ProjectType projectType) + { + return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base new file mode 100644 index 0000000000..4df3defdd0 --- /dev/null +++ b/Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base @@ -0,0 +1,276 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public enum LogType + { + /// + /// + /// + None, + /// + /// + /// + Info, + /// + /// + /// + Warning, + /// + /// + /// + Error + } + + /// + /// + /// + [Flags] + public enum LogTargets + { + /// + /// + /// + None = 0, + /// + /// + /// + Null = 1, + /// + /// + /// + File = 2, + /// + /// + /// + Console = 4 + } + + /// + /// Summary description for Log. + /// + public class Log : IDisposable + { + #region Fields + + private TextWriter m_Writer; + private LogTargets m_Target = LogTargets.Null; + bool disposed; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The target. + /// Name of the file. + public Log(LogTargets target, string fileName) + { + m_Target = target; + + if ((m_Target & LogTargets.File) != 0) + { + m_Writer = new StreamWriter(fileName, false); + } + else if ((m_Target & LogTargets.Console) != 0) + { + // Prevents null reference exceptions when outputing to the log file. + // This seems to only happen when running on a network drive. + m_Writer = Console.Out; + } + } + + #endregion + + #region Public Methods + + /// + /// Writes this instance. + /// + public void Write() + { + Write(string.Empty); + } + + /// + /// Writes the specified MSG. + /// + /// The MSG. + public void Write(string msg) + { + if((m_Target & LogTargets.Null) != 0) + { + return; + } + + if((m_Target & LogTargets.Console) != 0) + { + Console.WriteLine(msg); + } + if((m_Target & LogTargets.File) != 0 && m_Writer != null) + { + m_Writer.WriteLine(msg); + } + } + + /// + /// Writes the specified format. + /// + /// The format. + /// The args. + public void Write(string format, params object[] args) + { + Write(string.Format(format,args)); + } + + /// + /// Writes the specified type. + /// + /// The type. + /// The format. + /// The args. + public void Write(LogType type, string format, params object[] args) + { + if((m_Target & LogTargets.Null) != 0) + { + return; + } + + string str = ""; + switch(type) + { + case LogType.Info: + str = "[I] "; + break; + case LogType.Warning: + str = "[!] "; + break; + case LogType.Error: + str = "[X] "; + break; + } + + Write(str + format,args); + } + + /// + /// Writes the exception. + /// + /// The type. + /// The ex. + public void WriteException(LogType type, Exception ex) + { + if(ex != null) + { + Write(type, ex.Message); + //#if DEBUG + m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); + m_Writer.WriteLine(ex.StackTrace); + m_Writer.WriteLine("]]"); + //#endif + } + } + + /// + /// Flushes this instance. + /// + public void Flush() + { + if(m_Writer != null) + { + m_Writer.Flush(); + } + } + + #endregion + + #region IDisposable Members + + /// + /// Performs application-defined tasks associated with freeing, releasing, or + /// resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose objects + /// + /// + /// If true, it will dispose close the handle + /// + /// + /// Will dispose managed and unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!this.disposed) + { + if (disposing) + { + if (m_Writer != null) + { + m_Writer.Close(); + m_Writer = null; + } + } + } + this.disposed = true; + } + + /// + /// + /// + ~Log() + { + this.Dispose(false); + } + + /// + /// Closes and destroys this object + /// + /// + /// Same as Dispose(true) + /// + public void Close() + { + Dispose(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/CommandLineCollection.cs b/Prebuild/src/Core/Utilities/CommandLineCollection.cs new file mode 100644 index 0000000000..786fa1e49d --- /dev/null +++ b/Prebuild/src/Core/Utilities/CommandLineCollection.cs @@ -0,0 +1,152 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System.Collections; +using System.Collections.Generic; + +namespace Prebuild.Core.Utilities +{ + /// + /// The CommandLine class parses and interprets the command-line arguments passed to + /// prebuild. + /// + public class CommandLineCollection : IEnumerable> + { + #region Fields + + // The raw OS arguments + private readonly string[] m_RawArgs; + + // Command-line argument storage + private readonly Dictionary m_Arguments = new Dictionary(); + + #endregion + + #region Constructors + + /// + /// Create a new CommandLine instance and set some internal variables. + /// + public CommandLineCollection(string[] args) + { + m_RawArgs = args; + + Parse(); + } + + #endregion + + #region Private Methods + + private void Parse() + { + if(m_RawArgs.Length < 1) + return; + + int idx = 0; + string lastArg = null; + + while(idx 2 && arg[0] == '/') + { + arg = arg.Substring(1); + lastArg = arg; + m_Arguments[arg] = ""; + } + else + { + if(lastArg != null) + { + m_Arguments[lastArg] = arg; + lastArg = null; + } + } + + idx++; + } + } + + #endregion + + #region Public Methods + + /// + /// Wases the passed. + /// + /// The arg. + /// + public bool WasPassed(string arg) + { + return (m_Arguments.ContainsKey(arg)); + } + + #endregion + + #region Properties + + /// + /// Gets the parameter associated with the command line option + /// + /// Returns null if option was not specified, + /// null string if no parameter was specified, and the value if a parameter was specified + public string this[string index] + { + get + { + if(m_Arguments.ContainsKey(index)) + { + return (m_Arguments[index]); + } + return null; + } + } + + #endregion + + #region IEnumerable Members + + /// + /// Returns an enumerator that can iterate through a collection. + /// + /// + /// An + /// that can be used to iterate through the collection. + /// + public IEnumerator> GetEnumerator() + { + return m_Arguments.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/CurrentDirectory.cs b/Prebuild/src/Core/Utilities/CurrentDirectory.cs new file mode 100644 index 0000000000..9624c35ed5 --- /dev/null +++ b/Prebuild/src/Core/Utilities/CurrentDirectory.cs @@ -0,0 +1,68 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public class CurrentDirectory + { + #region Fields + + private readonly Stack m_Stack = new Stack(); + + #endregion + + #region Public Methods + + /// + /// Pushes this instance. + /// + public void Push() + { + m_Stack.Push(Environment.CurrentDirectory); + } + + /// + /// Pops this instance. + /// + public void Pop() + { + if(m_Stack.Count < 1) + { + return; + } + + string cwd = m_Stack.Pop(); + Helper.SetCurrentDir(cwd); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/Helper.cs b/Prebuild/src/Core/Utilities/Helper.cs new file mode 100644 index 0000000000..8c3e9680c5 --- /dev/null +++ b/Prebuild/src/Core/Utilities/Helper.cs @@ -0,0 +1,575 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Collections.Specialized; +using System.Xml; +using Prebuild.Core.Nodes; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public class Helper + { + #region Fields + + static bool checkForOSVariables; + + /// + /// + /// + public static bool CheckForOSVariables + { + get + { + return checkForOSVariables; + } + set + { + checkForOSVariables = value; + } + } + + #endregion + + #region Public Methods + + #region String Parsing + + public delegate string StringLookup(string key); + + /// + /// Gets a collection of StringLocationPair objects that represent the matches + /// + /// The target. + /// The before group. + /// The after group. + /// if set to true [include delimiters in substrings]. + /// + public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) + { + if( beforeGroup == null ) + { + throw new ArgumentNullException("beforeGroup"); + } + if( afterGroup == null ) + { + throw new ArgumentNullException("afterGroup"); + } + StringCollection results = new StringCollection(); + if(target == null || target.Length == 0) + { + return results; + } + + int beforeMod = 0; + int afterMod = 0; + if(includeDelimitersInSubstrings) + { + //be sure to not exlude the delims + beforeMod = beforeGroup.Length; + afterMod = afterGroup.Length; + } + int startIndex = 0; + while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { + int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it + if(endIndex == -1) + { + break; + } + int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string + string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, + length - afterMod); + + results.Add(substring); + //results.Add(new StringLocationPair(substring,startIndex)); + startIndex = endIndex + 1; + //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization + //so start after endIndex + + } + return results; + } + + /// + /// Replaces the groups. + /// + /// The target. + /// The before group. + /// The after group. + /// The lookup. + /// + public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { + if( target == null ) + { + throw new ArgumentNullException("target"); + } + //int targetLength = target.Length; + StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); + if( lookup == null ) + { + throw new ArgumentNullException("lookup"); + } + foreach(string substring in strings) + { + target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); + } + return target; + } + + /// + /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate + /// + /// The target. + /// The lookup. + /// + public static string InterpolateForVariables(string target, StringLookup lookup) + { + return ReplaceGroups(target, "${" , "}" , lookup); + } + + /// + /// Replaces ${var} statements in a string with the corresonding environment variable with name var + /// + /// + /// + public static string InterpolateForEnvironmentVariables(string target) + { + return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); + } + + #endregion + + /// + /// Translates the value. + /// + /// Type of the translate. + /// The translation item. + /// + public static object TranslateValue(Type translateType, string translationItem) + { + if(translationItem == null) + { + return null; + } + + try + { + string lowerVal = translationItem.ToLower(); + if(translateType == typeof(bool)) + { + return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); + } + else if(translateType == typeof(int)) + { + return (Int32.Parse(translationItem)); + } + else + { + return translationItem; + } + } + catch(FormatException) + { + return null; + } + } + + /// + /// Deletes if exists. + /// + /// The file. + /// + public static bool DeleteIfExists(string file) + { + string resFile = null; + try + { + resFile = ResolvePath(file); + } + catch(ArgumentException) + { + return false; + } + + if(!File.Exists(resFile)) + { + return false; + } + + File.Delete(resFile); + return true; + } + + static readonly char seperator = Path.DirectorySeparatorChar; + + // This little gem was taken from the NeL source, thanks guys! + /// + /// Makes a relative path + /// + /// Path to start from + /// Path to end at + /// Path that will get from startPath to endPath + public static string MakePathRelativeTo(string startPath, string endPath) + { + string tmp = NormalizePath(startPath, seperator); + string src = NormalizePath(endPath, seperator); + string prefix = ""; + + while(true) + { + if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) + { + string ret; + int size = tmp.Length; + if(size == src.Length) + { + return "./"; + } + if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) + { + } + else + { + ret = prefix + endPath.Substring(size, endPath.Length - size); + ret = ret.Trim(); + if(ret[0] == seperator) + { + ret = "." + ret; + } + + return NormalizePath(ret); + } + + } + + if(tmp.Length < 2) + { + break; + } + + int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); + int prevPos = tmp.IndexOf(seperator); + + if((lastPos == prevPos) || (lastPos == -1)) + { + break; + } + + tmp = tmp.Substring(0, lastPos + 1); + prefix += ".." + seperator.ToString(); + } + + return endPath; + } + + /// + /// Resolves the path. + /// + /// The path. + /// + public static string ResolvePath(string path) + { + string tmpPath = NormalizePath(path); + if(tmpPath.Length < 1) + { + tmpPath = "."; + } + + tmpPath = Path.GetFullPath(tmpPath); + if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) + { + throw new ArgumentException("Path could not be resolved: " + tmpPath); + } + + return tmpPath; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// The separator character. + /// + public static string NormalizePath(string path, char separatorCharacter) + { + if(path == null || path == "" || path.Length < 1) + { + return ""; + } + + string tmpPath = path.Replace('\\', '/'); + tmpPath = tmpPath.Replace('/', separatorCharacter); + return tmpPath; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + return NormalizePath(path, Path.DirectorySeparatorChar); + } + + /// + /// Ends the path. + /// + /// The path. + /// The separator character. + /// + public static string EndPath(string path, char separatorCharacter) + { + if(path == null || path == "" || path.Length < 1) + { + return ""; + } + + if(!path.EndsWith(separatorCharacter.ToString())) + { + return (path + separatorCharacter); + } + + return path; + } + + /// + /// Ends the path. + /// + /// The path. + /// + public static string EndPath(string path) + { + return EndPath(path, Path.DirectorySeparatorChar); + } + + /// + /// Makes the file path. + /// + /// The path. + /// The name. + /// The ext. + /// + public static string MakeFilePath(string path, string name, string ext) + { + string ret = EndPath(NormalizePath(path)); + + if( name == null ) + { + throw new ArgumentNullException("name"); + } + + ret += name; + if(!name.EndsWith("." + ext)) + { + ret += "." + ext; + } + + //foreach(char c in Path.GetInvalidPathChars()) + //{ + // ret = ret.Replace(c, '_'); + //} + + return ret; + } + + /// + /// Makes the file path. + /// + /// The path. + /// The name. + /// + public static string MakeFilePath(string path, string name) + { + string ret = EndPath(NormalizePath(path)); + + if( name == null ) + { + throw new ArgumentNullException("name"); + } + + ret += name; + + //foreach (char c in Path.GetInvalidPathChars()) + //{ + // ret = ret.Replace(c, '_'); + //} + + return ret; + } + + /// + /// + /// + /// + /// + public static string MakeReferencePath(string path) + { + string ret = EndPath(NormalizePath(path)); + + //foreach (char c in Path.GetInvalidPathChars()) + //{ + // ret = ret.Replace(c, '_'); + //} + + return ret; + } + + /// + /// Sets the current dir. + /// + /// The path. + public static void SetCurrentDir(string path) + { + if( path == null ) + { + throw new ArgumentNullException("path"); + } + if(path.Length < 1) + { + return; + } + + Environment.CurrentDirectory = path; + } + + /// + /// Checks the type. + /// + /// The type to check. + /// The attr. + /// The inter. + /// + public static object CheckType(Type typeToCheck, Type attr, Type inter) + { + if(typeToCheck == null || attr == null) + { + return null; + } + + object[] attrs = typeToCheck.GetCustomAttributes(attr, false); + if(attrs == null || attrs.Length < 1) + { + return null; + } + if( inter == null ) + { + throw new ArgumentNullException("inter"); + } + + if(typeToCheck.GetInterface(inter.FullName) == null) + { + return null; + } + + return attrs[0]; + } + + /// + /// Attributes the value. + /// + /// The node. + /// The attr. + /// The def. + /// + public static string AttributeValue(XmlNode node, string attr, string def) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(node.Attributes[attr] == null) + { + return def; + } + string val = node.Attributes[attr].Value; + if(!CheckForOSVariables) + { + return val; + } + + return InterpolateForEnvironmentVariables(val); + } + + /// + /// Parses the boolean. + /// + /// The node. + /// The attr. + /// if set to true [default value]. + /// + public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(node.Attributes[attr] == null) + { + return defaultValue; + } + return bool.Parse(node.Attributes[attr].Value); + } + + /// + /// Enums the attribute value. + /// + /// The node. + /// The attr. + /// Type of the enum. + /// The def. + /// + public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) + { + if( def == null ) + { + throw new ArgumentNullException("def"); + } + string val = AttributeValue(node, attr, def.ToString()); + return Enum.Parse(enumType, val, true); + } + + /// + /// + /// + /// + /// + /// + public static string AssemblyFullName(string assemblyName, ProjectType projectType) + { + return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Utilities/Log.cs b/Prebuild/src/Core/Utilities/Log.cs new file mode 100644 index 0000000000..4df3defdd0 --- /dev/null +++ b/Prebuild/src/Core/Utilities/Log.cs @@ -0,0 +1,276 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.IO; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public enum LogType + { + /// + /// + /// + None, + /// + /// + /// + Info, + /// + /// + /// + Warning, + /// + /// + /// + Error + } + + /// + /// + /// + [Flags] + public enum LogTargets + { + /// + /// + /// + None = 0, + /// + /// + /// + Null = 1, + /// + /// + /// + File = 2, + /// + /// + /// + Console = 4 + } + + /// + /// Summary description for Log. + /// + public class Log : IDisposable + { + #region Fields + + private TextWriter m_Writer; + private LogTargets m_Target = LogTargets.Null; + bool disposed; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The target. + /// Name of the file. + public Log(LogTargets target, string fileName) + { + m_Target = target; + + if ((m_Target & LogTargets.File) != 0) + { + m_Writer = new StreamWriter(fileName, false); + } + else if ((m_Target & LogTargets.Console) != 0) + { + // Prevents null reference exceptions when outputing to the log file. + // This seems to only happen when running on a network drive. + m_Writer = Console.Out; + } + } + + #endregion + + #region Public Methods + + /// + /// Writes this instance. + /// + public void Write() + { + Write(string.Empty); + } + + /// + /// Writes the specified MSG. + /// + /// The MSG. + public void Write(string msg) + { + if((m_Target & LogTargets.Null) != 0) + { + return; + } + + if((m_Target & LogTargets.Console) != 0) + { + Console.WriteLine(msg); + } + if((m_Target & LogTargets.File) != 0 && m_Writer != null) + { + m_Writer.WriteLine(msg); + } + } + + /// + /// Writes the specified format. + /// + /// The format. + /// The args. + public void Write(string format, params object[] args) + { + Write(string.Format(format,args)); + } + + /// + /// Writes the specified type. + /// + /// The type. + /// The format. + /// The args. + public void Write(LogType type, string format, params object[] args) + { + if((m_Target & LogTargets.Null) != 0) + { + return; + } + + string str = ""; + switch(type) + { + case LogType.Info: + str = "[I] "; + break; + case LogType.Warning: + str = "[!] "; + break; + case LogType.Error: + str = "[X] "; + break; + } + + Write(str + format,args); + } + + /// + /// Writes the exception. + /// + /// The type. + /// The ex. + public void WriteException(LogType type, Exception ex) + { + if(ex != null) + { + Write(type, ex.Message); + //#if DEBUG + m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); + m_Writer.WriteLine(ex.StackTrace); + m_Writer.WriteLine("]]"); + //#endif + } + } + + /// + /// Flushes this instance. + /// + public void Flush() + { + if(m_Writer != null) + { + m_Writer.Flush(); + } + } + + #endregion + + #region IDisposable Members + + /// + /// Performs application-defined tasks associated with freeing, releasing, or + /// resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose objects + /// + /// + /// If true, it will dispose close the handle + /// + /// + /// Will dispose managed and unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!this.disposed) + { + if (disposing) + { + if (m_Writer != null) + { + m_Writer.Close(); + m_Writer = null; + } + } + } + this.disposed = true; + } + + /// + /// + /// + ~Log() + { + this.Dispose(false); + } + + /// + /// Closes and destroys this object + /// + /// + /// Same as Dispose(true) + /// + public void Close() + { + Dispose(); + } + + #endregion + } +} diff --git a/Prebuild/src/Core/WarningException.cs b/Prebuild/src/Core/WarningException.cs new file mode 100644 index 0000000000..b7c3668cce --- /dev/null +++ b/Prebuild/src/Core/WarningException.cs @@ -0,0 +1,84 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + /// + [Serializable] + public class WarningException : Exception + { + #region Constructors + + /// + /// + /// + public WarningException() + { + } + + /// + /// + /// + /// + /// + public WarningException(string format, params object[] args) + : base(String.Format(format, args)) + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public WarningException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public WarningException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + + #endregion + } +} diff --git a/Prebuild/src/Prebuild.cs b/Prebuild/src/Prebuild.cs new file mode 100644 index 0000000000..081c89c404 --- /dev/null +++ b/Prebuild/src/Prebuild.cs @@ -0,0 +1,165 @@ +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: kunnis $ + * $Date: 2009-04-15 02:33:14 +0100 (Wed, 15 Apr 2009) $ + * $Revision: 308 $ + */ +#endregion + +using System; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.EnterpriseServices.Internal; + +using Prebuild.Core; +using Prebuild.Core.Utilities; + +namespace Prebuild +{ + /// + /// + /// + class Prebuild + { + #region Main + + [STAThread] + static void Main(string[] args) + { + Kernel kernel = null; + try + { + kernel = Kernel.Instance; + kernel.Initialize(LogTargets.File | LogTargets.Console, args); + bool exit = false; + + if(kernel.CommandLine.WasPassed("usage")) + { + exit = true; + OutputUsage(); + } + if(kernel.CommandLine.WasPassed("showtargets")) + { + exit = true; + OutputTargets(kernel); + } + if(kernel.CommandLine.WasPassed("install")) + { + exit = true; + InstallAssembly(kernel); + } + if(kernel.CommandLine.WasPassed("remove")) + { + exit = true; + RemoveAssembly(kernel); + } + + if(!exit) + { + kernel.Process(); + } + } +#if !DEBUG + catch (Exception ex) + { + Console.WriteLine("Unhandled error: {0}", ex.Message); + Console.WriteLine("{0}", ex.StackTrace); + } +#endif + finally + { + if(kernel != null && kernel.PauseAfterFinish) + { + Console.WriteLine("\nPress enter to continue..."); + Console.ReadLine(); + } + } + } + + #endregion + + #region Private Methods + + private static void InstallAssembly(Kernel kernel) + { + Publish publish = new Publish(); + string file = kernel.CommandLine["install"]; + //Console.WriteLine(".."+file+".."); + publish.GacInstall(file); + } + + private static void RemoveAssembly(Kernel kernel) + { + Publish publish = new Publish(); + string file = kernel.CommandLine["remove"]; + publish.GacRemove(file); + } + + private static void OutputUsage() + { + Console.WriteLine("Usage: prebuild /target [options]"); + Console.WriteLine("Available command-line switches:"); + Console.WriteLine(); + Console.WriteLine("/target Target for Prebuild"); + Console.WriteLine("/clean Clean the build files for the given target"); + Console.WriteLine("/file XML file to process"); + Console.WriteLine("/log Log file to write to"); + Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); + Console.WriteLine("/pause Pauses the application after execution to view the output"); + Console.WriteLine("/yes Default to yes to any questions asked"); + Console.WriteLine("/install Install assembly into the GAC"); + Console.WriteLine("/remove Remove assembly from the GAC"); + Console.WriteLine(); + Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); + Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); + Console.WriteLine(); + } + + private static void OutputTargets(Kernel kern) + { + Console.WriteLine("Targets available in Prebuild:"); + Console.WriteLine(""); + if(kern.Targets.Keys.Count > 0) + { + string[] targs = new string[kern.Targets.Keys.Count]; + kern.Targets.Keys.CopyTo(targs, 0); + Array.Sort(targs); + foreach(string target in targs) + { + Console.WriteLine(target); + } + } + Console.WriteLine(""); + } + + #endregion + } +} diff --git a/Prebuild/src/Prebuild.snk b/Prebuild/src/Prebuild.snk new file mode 100644 index 0000000000000000000000000000000000000000..f9dce054ffae7c79dce7d3ba0b790904bdb36831 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097%QdipZe+P78+gioe1FL>Pm`A%NYNJjT zvr&utrO*Bz`;(~1&v7SLbo#8h8*Eu!T1$f&*Z!JD(@sjU;6;rE+#4q{`Ci_P6X~Os zsqTl*?$f+z`P@h&-Z=SV9gYc!udqrVAH@hG`xHwT1SMQBX^U%@gPO$V6JX)9KT9Ww>?9GKft(b~3CsqH2^BHX{_&xGMn ztAW9|iLO>;#yB;wrHus##d%AZDeNPu@F_TTzUscSGU=aLSyvelLiSJps^FvCxcYHV z4Y1$J$Wu2ek`e>_>d43PbVJq8mILALAW%&DDsyb=|xUms2{~U~!hI$4*kXem7!Hk=k zc1qQS!>`bZbL}5fr*. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyName("")] diff --git a/Prebuild/src/Properties/AssemblyInfo.cs b/Prebuild/src/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f3ac30f39d --- /dev/null +++ b/Prebuild/src/Properties/AssemblyInfo.cs @@ -0,0 +1,113 @@ +#region BSD License +/* + +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Dave Hudson (jendave@yahoo.com), +Rob Loach (http://www.robloach.net), +C.J. Adams-Collier (cjac@colliertech.org), + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security.Permissions; +using System.Resources; + + +// FxCop recommended attributes +[assembly: ComVisible(false)] +[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted=true)] +[assembly: CLSCompliant(true)] + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle(".NET Prebuild")] +[assembly: AssemblyDescription("A .NET project file build tool")] +[assembly: AssemblyConfiguration(".NET CLR")] +[assembly: AssemblyCompany("The Prebuild Project")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("Copyright 2004-2010 " + + "Matthew Holmes, " + + "Dan Moorehead, " + + "C.J. Adams-Collier, " + + "Rob Loach, " + + "David Hudson," + + "John Hurliman")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguageAttribute("en-US")] +[assembly: AssemblyVersion("2.0.5.*")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyName("")] diff --git a/Prebuild/src/data/.svn/all-wcprops b/Prebuild/src/data/.svn/all-wcprops new file mode 100644 index 0000000000..3af3c24715 --- /dev/null +++ b/Prebuild/src/data/.svn/all-wcprops @@ -0,0 +1,71 @@ +K 25 +svn:wc:ra_dav:version-url +V 50 +/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/data +END +dnpb-1.3.xsd +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.3.xsd +END +dnpb-1.4.xsd +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.4.xsd +END +dnpb-1.5.xsd +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.5.xsd +END +prebuild-1.6.xsd +K 25 +svn:wc:ra_dav:version-url +V 66 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/prebuild-1.6.xsd +END +prebuild-1.7.xsd +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/dnpb/!svn/ver/299/trunk/Prebuild/src/data/prebuild-1.7.xsd +END +prebuild-1.8.xsd +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/dnpb/!svn/ver/314/trunk/Prebuild/src/data/prebuild-1.8.xsd +END +autotools.xml +K 25 +svn:wc:ra_dav:version-url +V 64 +/svnroot/dnpb/!svn/ver/256/trunk/Prebuild/src/data/autotools.xml +END +prebuild-1.9.xsd +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/data/prebuild-1.9.xsd +END +dnpb-1.0.xsd +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.0.xsd +END +dnpb-1.1.xsd +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.1.xsd +END +dnpb-1.2.xsd +K 25 +svn:wc:ra_dav:version-url +V 62 +/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.2.xsd +END diff --git a/Prebuild/src/data/.svn/dir-prop-base b/Prebuild/src/data/.svn/dir-prop-base new file mode 100644 index 0000000000..29ffe333a0 --- /dev/null +++ b/Prebuild/src/data/.svn/dir-prop-base @@ -0,0 +1,6 @@ +K 10 +svn:ignore +V 11 +*.swp +*.xsx +END diff --git a/Prebuild/src/data/.svn/entries b/Prebuild/src/data/.svn/entries new file mode 100644 index 0000000000..935b447cff --- /dev/null +++ b/Prebuild/src/data/.svn/entries @@ -0,0 +1,402 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/data +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2010-05-08T05:43:01.449559Z +316 +jhurliman +has-props + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +dnpb-1.3.xsd +file + + + + +2010-09-10T22:51:45.000000Z +636ed9edea90e5104ad1879c96552b91 +2004-12-29T02:08:06.000000Z +35 +xeonx +has-props + + + + + + + + + + + + + + + + + + + + +7995 + +dnpb-1.4.xsd +file + + + + +2010-09-10T22:51:45.000000Z +3e883fc616c786e3835ba3386ede4269 +2005-12-23T06:05:38.000000Z +39 +jendave +has-props + + + + + + + + + + + + + + + + + + + + +8197 + +dnpb-1.5.xsd +file + + + + +2010-09-10T22:51:45.000000Z +c692bbcd63f10ca4c93da1c19f5b107e +2006-01-23T23:19:16.000000Z +55 +jendave +has-props + + + + + + + + + + + + + + + + + + + + +8420 + +prebuild-1.6.xsd +file + + + + +2010-09-10T22:51:45.000000Z +61f6e6f13f64ae842b1324cf145934ad +2006-02-28T18:13:10.884431Z +95 +jendave +has-props + + + + + + + + + + + + + + + + + + + + +9770 + +prebuild-1.7.xsd +file + + + + +2010-09-10T22:51:45.000000Z +edf1193fad8922061845cf48cc8eb851 +2009-02-21T05:36:29.327384Z +299 +kunnis + + + + + + + + + + + + + + + + + + + + + +16083 + +prebuild-1.8.xsd +file + + + + +2010-09-10T22:51:45.000000Z +6eb078509319faa7ae4cdc55af184ac1 +2009-06-06T19:43:44.493200Z +314 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +15296 + +autotools.xml +file + + + + +2010-09-10T22:51:45.000000Z +e119a174539f100e18d2ee73c5660318 +2008-02-07T16:31:29.630257Z +256 +cjcollier + + + + + + + + + + + + + + + + + + + + + +27653 + +prebuild-1.9.xsd +file + + + + +2010-09-10T22:51:45.000000Z +8988b0f7fc4462d76183a4c0b72121e9 +2010-05-08T05:43:01.449559Z +316 +jhurliman + + + + + + + + + + + + + + + + + + + + + +14622 + +dnpb-1.0.xsd +file + + + + +2010-09-10T22:51:45.000000Z +080c1e8ce73ec5aff528c2a62b355c38 +2004-04-19T07:06:45.000000Z +17 +calefaction +has-props + + + + + + + + + + + + + + + + + + + + +6878 + +dnpb-1.1.xsd +file + + + + +2010-09-10T22:51:45.000000Z +b00a1d973849b76554afb17f8a21978c +2004-04-22T00:51:14.000000Z +18 +calefaction +has-props + + + + + + + + + + + + + + + + + + + + +6883 + +dnpb-1.2.xsd +file + + + + +2010-09-10T22:51:45.000000Z +7ebd6286a2df12ef5e21e835342b1daa +2004-09-15T19:40:37.000000Z +29 +calefaction +has-props + + + + + + + + + + + + + + + + + + + + +7639 + diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base new file mode 100644 index 0000000000..7b57b302a4 --- /dev/null +++ b/Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base @@ -0,0 +1,9 @@ +K 13 +svn:eol-style +V 6 +native +K 12 +svn:keywords +V 23 +Author Date Id Revision +END diff --git a/Prebuild/src/data/.svn/text-base/autotools.xml.svn-base b/Prebuild/src/data/.svn/text-base/autotools.xml.svn-base new file mode 100644 index 0000000000..ee4b0643dc --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/autotools.xml.svn-base @@ -0,0 +1,790 @@ + + + + + #!/bin/sh +# Run this to generate all the initial makefiles, etc. +# Ripped off from Mono, which ripped off from GNOME macros version + +DIE=0 + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +if [ -n "$MONO_PATH" ]; then + # from -> /mono/lib:/another/mono/lib + # to -> /mono /another/mono + for i in `echo ${MONO_PATH} | tr ":" " "`; do + i=`dirname ${i}` + if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then + ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" + fi + if [ -n "{i}" -a -d "${i}/bin" ]; then + PATH="${i}/bin:$PATH" + fi + done + export PATH +fi + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to compile Mono." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +if [ -z "$LIBTOOL" ]; then + LIBTOOL=`which glibtool 2>/dev/null` + if [ ! -x "$LIBTOOL" ]; then + LIBTOOL=`which libtool` + fi +fi + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { + ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed to compile Mono." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$NOCONFIGURE"; then + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + + +if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + ${LIBTOOL}ize --force --copy + fi +fi + +echo "Running aclocal $ACLOCAL_FLAGS ..." +aclocal $ACLOCAL_FLAGS || { + echo + echo "**Error**: aclocal failed. This may mean that you have not" + echo "installed all of the packages you need, or you may need to" + echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" + echo "for the prefix where you installed the packages whose" + echo "macros were not found" + exit 1 +} + +if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then + echo "Running autoheader..." + autoheader || { echo "**Error**: autoheader failed."; exit 1; } +fi + +echo "Running automake --gnu $am_opt ..." +automake --add-missing --gnu $am_opt || + { echo "**Error**: automake failed."; exit 1; } +echo "Running autoconf ..." +autoconf || { echo "**Error**: autoconf failed."; exit 1; } + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME || exit 1 +else + echo Skipping configure process. +fi + + + + + + + + + + + + + + + + AC_INIT([],[]) + +AC_PREREQ(2.60) +AC_CANONICAL_SYSTEM +AC_CONFIG_AUX_DIR(.) +AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) +AM_MAINTAINER_MODE +dnl AC_PROG_INTLTOOL([0.25]) +AC_PROG_INSTALL + +ASSEMBLY_NAME= +PROJECT_NAME= +PROJECT_VERSION=$VERSION +PROJECT_DESCRIPTION="" +PROJECT_TYPE="" + +AC_SUBST(ASSEMBLY_NAME) +AC_SUBST(PROJECT_NAME) +AC_SUBST(PROJECT_VERSION) +AC_SUBST(DESCRIPTION) + +AC_MSG_CHECKING([assembly type]) +case $PROJECT_TYPE in + *Exe) + ASSEMBLY_EXTENSION=exe + ;; + *Library) + ASSEMBLY_EXTENSION=dll + ;; + *) + AC_MSG_ERROR([*** Please add support for project type $PROJECT_TYPE to configure.ac checks!]) + ;; +esac +AC_MSG_RESULT([$PROJECT_TYPE]) + +AC_SUBST(ASSEMBLY_EXTENSION) + +AC_MSG_CHECKING([whether we're compiling from an RCS]) +if test -f "$srcdir/.cvs_version" ; then + from_rcs=cvs +else + if test -f "$srcdir/.svn/entries" ; then + from_rcs=svn + else + from_rcs=no + fi +fi + +AC_MSG_RESULT($from_rcs) + +MONO_REQUIRED_VERSION=1.1 + +PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false) + +if test "x$has_mono" = "xtrue"; then + AC_PATH_PROG(RUNTIME, mono, no) + AC_PATH_PROG(CSC, gmcs, no) + AC_PATH_PROG(RESGEN, resgen2, no) + if test `uname -s` = "Darwin"; then + LIB_PREFIX= + LIB_SUFFIX=.dylib + else + LIB_PREFIX=.so + LIB_SUFFIX= + fi +else + AC_PATH_PROG(CSC, csc.exe, no) + if test x$CSC = "xno"; then + AC_MSG_ERROR([You need to install either mono or .Net]) + else + RUNTIME= + LIB_PREFIX= + LIB_SUFFIX= + fi +fi + +AC_PATH_PROG(GACUTIL, gacutil) +if test "x$GACUTIL" = "xno" ; then + AC_MSG_ERROR([No gacutil tool found]) +fi + +GACUTIL_FLAGS='/package /gacdir $(DESTDIR)$(prefix)/lib' +AC_SUBST(GACUTIL_FLAGS) + +AC_SUBST(PATH) +AC_SUBST(LD_LIBRARY_PATH) + +AC_SUBST(LIB_PREFIX) +AC_SUBST(LIB_SUFFIX) +AC_SUBST(RUNTIME) +AC_SUBST(CSC) +AC_SUBST(RESGEN) +AC_SUBST(GACUTIL) + +AC_SUBST(BASE_DEPENDENCIES_CFLAGS) +AC_SUBST(BASE_DEPENDENCIES_LIBS) + +dnl Find monodoc +MONODOC_REQUIRED_VERSION=1.0 +AC_SUBST(MONODOC_REQUIRED_VERSION) + +PKG_CHECK_MODULES(MONODOC_DEPENDENCY, monodoc >= $MONODOC_REQUIRED_VERSION, enable_monodoc=yes, enable_monodoc=no) + +if test "x$enable_monodoc" = "xyes"; then + AC_PATH_PROG(MONODOC, monodoc, no) + if test x$MONODOC = xno; then + enable_monodoc=no + fi +else + MONODOC= +fi + +AC_SUBST(MONODOC) +AM_CONDITIONAL(ENABLE_MONODOC, test "x$enable_monodoc" = "xyes") + +winbuild=no +case "$host" in + *-*-mingw*|*-*-cygwin*) + winbuild=yes + ;; +esac +AM_CONDITIONAL(WINBUILD, test x$winbuild = xyes) + +AC_CONFIG_FILES() +AC_CONFIG_FILES(.pc) + +AC_CONFIG_FILES(Makefile) +AC_OUTPUT + +echo "===" +echo "" +echo "Project configuration summary" +echo "" +echo " * Installation prefix: $prefix" +echo " * compiler: $CSC" +echo " * Documentation: $enable_monodoc ($MONODOC)" +echo " * Project Name: $PROJECT_NAME" +echo " * Version: $PROJECT_VERSION" +echo "" +echo "===" + + + + + + + + + + + + + + + + + + + + + + + + + + +ASSEMBLY=$(ASSEMBLY_NAME).$(ASSEMBLY_EXTENSION) + + +dir = $(prefix)/lib/ +_DATA = $(ASSEMBLY) $(ASSEMBLY).config + +bin_SCRIPTS= + +pkgconfigdir = $(prefix)/lib/pkgconfig +pkgconfig_DATA = .pc + +dir = $(prefix)/lib/mono/ +_DATA = $(ASSEMBLY).config + +noinst_DATA = $(ASSEMBLY) + + +PACKAGES = +BINARY_LIBS = +SYSTEM_LIBS = +RESOURCES_SRC = +RESOURCES = $(RESOURCES_SRC:.resx=.resources) +SOURCES = + +EXTRA_DIST=$(SOURCES) $(BINARY_LIBS) $(RESOURCES_SRC) install-sh missing + +CLEANFILES=$(ASSEMBLY) + + + + + + + +/$(ASSEMBLY): $(srcdir)/$(ASSEMBLY).response $(RESOURCES) $(SOURCES) $(BINARY_LIBS) + mkdir -p doc && mkdir -p && $(CSC) /out:$@ \ + /target: \ + $(addprefix /resource:$(srcdir)/, $(RESOURCES)) \ + $(addprefix /pkg:, $(PACKAGES)) \ + $(addprefix /r:, $(SYSTEM_LIBS)) \ + $(addprefix /r:$(srcdir)/, $(BINARY_LIBS)) \ + @$(srcdir)/$(ASSEMBLY).response \ + /doc:doc/ \ + /keyfile:$(srcdir)/ \ + /unsafe \ + && rm -f $(ASSEMBLY) \ + && ln $@ $(ASSEMBLY) + +CLEANFILES+=/$(ASSEMBLY) + + +EXTRA_DIST+= + +: /$(ASSEMBLY) + rm -f $(ASSEMBLY) \ + && ln /$(ASSEMBLY) $(ASSEMBLY) + + + + + +_install-data-local: /$(ASSEMBLY) + echo "$(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS)"; \ + $(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS) || exit 1; + +_uninstall-local: + if [`gacutil -l | grep "Number" | awk -F= '{print $$2}'` -gt "0" ] ; \ + then \ + echo "$(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ + $(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ + fi + + + +noinst__dir = $(prefix)/lib/mono/ +noinst___DATA = /$(ASSEMBLY) + + + + + + +$(ASSEMBLY): + + +$(srcdir)/$(ASSEMBLY).response: $(srcdir)/Makefile + echo "$(addprefix $(srcdir)/, $(SOURCES))" > $@ + + +all: $(ASSEMBLY) + +# rule to compile .resx files to .resources +%.resources: %.resx + $(RESGEN) /useSourcePath /compile $(@:.resources=.resx) + + + + + +install-data-local: _install-data-local + +uninstall-local: _uninstall-local + + + +#dir+=$(noinst__dir) +#_DATA+=$(noinst___DATA) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +prefix=@prefix@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib/mono/@PROJECT_NAME@ + +Name: +Description: +Version: @PROJECT_VERSION@ +Requires: +Libs: -r:${libdir}/@PROJECT_NAME@.dll + + + + + + + + + + + #!/bin/sh +# Run this to generate all the initial makefiles, etc. +# Ripped off from Mono, which ripped off from GNOME macros version + +DIE=0 + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +if [ -n "$MONO_PATH" ]; then + # from -> /mono/lib:/another/mono/lib + # to -> /mono /another/mono + for i in `echo ${MONO_PATH} | tr ":" " "`; do + i=`dirname ${i}` + if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then + ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" + fi + if [ -n "{i}" -a -d "${i}/bin" ]; then + PATH="${i}/bin:$PATH" + fi + done + export PATH +fi + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to compile Mono." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +if [ -z "$LIBTOOL" ]; then + LIBTOOL=`which glibtool 2>/dev/null` + if [ ! -x "$LIBTOOL" ]; then + LIBTOOL=`which libtool` + fi +fi + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { + ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed to compile Mono." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + + +if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + ${LIBTOOL}ize --force --copy + fi +fi + +echo "Running aclocal $ACLOCAL_FLAGS ..." +aclocal $ACLOCAL_FLAGS || { + echo + echo "**Error**: aclocal failed. This may mean that you have not" + echo "installed all of the packages you need, or you may need to" + echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" + echo "for the prefix where you installed the packages whose" + echo "macros were not found" + exit 1 +} + +if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then + echo "Running autoheader..." + autoheader || { echo "**Error**: autoheader failed."; exit 1; } +fi + +echo "Running automake --gnu $am_opt ..." +automake --add-missing --gnu $am_opt || + { echo "**Error**: automake failed."; exit 1; } +echo "Running autoconf ..." +autoconf || { echo "**Error**: autoconf failed."; exit 1; } + + +echo Running /autogen.sh ... +(cd $srcdir/ ; NOCONFIGURE=1 /bin/sh ./autogen.sh "$@") +echo Done running /autogen.sh ... + + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME || exit 1 +else + echo Skipping configure process. +fi + + + + + + + + + + +AC_INIT([]-solution,[]) +AC_CONFIG_AUX_DIR(.) +AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) +EXTRA_DIST="install-sh missing" +SOLUTION_NAME= +SOLUTION_VERSION=$VERSION +SOLUTION_DESCRIPTION="" +AC_SUBST(DESCRIPTION) + +AM_MAINTAINER_MODE + +dnl AC_PROG_INTLTOOL([0.25]) + +AC_PROG_INSTALL + +AC_MSG_CHECKING([whether we're building from an RCS]) +if test -f "$srcdir/.cvs_version" ; then + from_rcs=cvs +else + if test -f "$srcdir/.svn/entries" ; then + from_rcs=svn + else + from_rcs=no + fi +fi + +AC_MSG_RESULT($from_rcs) + +CONFIG="Release" +AC_SUBST(CONFIG) + +AC_CONFIG_SUBDIRS( +) + + +AC_OUTPUT([ +Makefile +]) + +echo "===" +echo "" +echo "Solution configuration summary" +echo "" +echo " * Solution Name: $SOLUTION_NAME" +echo " * Version: $SOLUTION_VERSION" +echo " * Packages:" +echo " - " +echo "" +echo "===" + + + + + + + + + SUBDIRS = + + + + + + + + + + + + +#! /bin/sh + +PACKAGE= +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +# %%$@%$# why oh why isn't it $sharedir/ +# Day changed to 30 Mar 2007 +# ... +# 07:50 < cj> why are we installing .exe assemblies to $prefix/lib/$package/ and +# not $prefix/share/$package ? +# 07:50 < jonp> momentum. +# 07:50 < jonp> and it's hard to say that a .exe isn't platform specific +# 07:50 < jonp> as it can still contain DllImport's which make platform +# assumptions + +packagedir=$prefix/lib/ +export MONO_PATH=$MONO_PATH + +exec @RUNTIME@ $packagedir/$PACKAGE.exe "$@" + + + + + diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base new file mode 100644 index 0000000000..b9e0e4eaf5 --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base @@ -0,0 +1,183 @@ + + + + + Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base new file mode 100644 index 0000000000..2c065a3297 --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base @@ -0,0 +1,184 @@ + + + + + Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base new file mode 100644 index 0000000000..d694ab43d7 --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base @@ -0,0 +1,198 @@ + + + + + Copyright (c) 2004 Matthew Holmes (calefaction _at_ houston _._ rr _._ com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base new file mode 100644 index 0000000000..8f31a544ab --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base @@ -0,0 +1,206 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Pre-Build is an XML-driven pre-build tool allowing developers to + easily generate project or make files for major IDE's and .NET + development tools including: Visual Studio 2003, Visual Studio 2002, + SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base new file mode 100644 index 0000000000..1da50fcc7a --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base @@ -0,0 +1,212 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base new file mode 100644 index 0000000000..e2b21f0c69 --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base @@ -0,0 +1,215 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base new file mode 100644 index 0000000000..57ebd2eb9d --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base @@ -0,0 +1,231 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base new file mode 100644 index 0000000000..a7f5c88d09 --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base @@ -0,0 +1,350 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base new file mode 100644 index 0000000000..8f5c1a4566 --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base @@ -0,0 +1,331 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base new file mode 100644 index 0000000000..d647e087ae --- /dev/null +++ b/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base @@ -0,0 +1,336 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/autotools.xml b/Prebuild/src/data/autotools.xml new file mode 100644 index 0000000000..ee4b0643dc --- /dev/null +++ b/Prebuild/src/data/autotools.xml @@ -0,0 +1,790 @@ + + + + + #!/bin/sh +# Run this to generate all the initial makefiles, etc. +# Ripped off from Mono, which ripped off from GNOME macros version + +DIE=0 + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +if [ -n "$MONO_PATH" ]; then + # from -> /mono/lib:/another/mono/lib + # to -> /mono /another/mono + for i in `echo ${MONO_PATH} | tr ":" " "`; do + i=`dirname ${i}` + if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then + ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" + fi + if [ -n "{i}" -a -d "${i}/bin" ]; then + PATH="${i}/bin:$PATH" + fi + done + export PATH +fi + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to compile Mono." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +if [ -z "$LIBTOOL" ]; then + LIBTOOL=`which glibtool 2>/dev/null` + if [ ! -x "$LIBTOOL" ]; then + LIBTOOL=`which libtool` + fi +fi + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { + ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed to compile Mono." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$NOCONFIGURE"; then + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + + +if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + ${LIBTOOL}ize --force --copy + fi +fi + +echo "Running aclocal $ACLOCAL_FLAGS ..." +aclocal $ACLOCAL_FLAGS || { + echo + echo "**Error**: aclocal failed. This may mean that you have not" + echo "installed all of the packages you need, or you may need to" + echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" + echo "for the prefix where you installed the packages whose" + echo "macros were not found" + exit 1 +} + +if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then + echo "Running autoheader..." + autoheader || { echo "**Error**: autoheader failed."; exit 1; } +fi + +echo "Running automake --gnu $am_opt ..." +automake --add-missing --gnu $am_opt || + { echo "**Error**: automake failed."; exit 1; } +echo "Running autoconf ..." +autoconf || { echo "**Error**: autoconf failed."; exit 1; } + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME || exit 1 +else + echo Skipping configure process. +fi + + + + + + + + + + + + + + + + AC_INIT([],[]) + +AC_PREREQ(2.60) +AC_CANONICAL_SYSTEM +AC_CONFIG_AUX_DIR(.) +AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) +AM_MAINTAINER_MODE +dnl AC_PROG_INTLTOOL([0.25]) +AC_PROG_INSTALL + +ASSEMBLY_NAME= +PROJECT_NAME= +PROJECT_VERSION=$VERSION +PROJECT_DESCRIPTION="" +PROJECT_TYPE="" + +AC_SUBST(ASSEMBLY_NAME) +AC_SUBST(PROJECT_NAME) +AC_SUBST(PROJECT_VERSION) +AC_SUBST(DESCRIPTION) + +AC_MSG_CHECKING([assembly type]) +case $PROJECT_TYPE in + *Exe) + ASSEMBLY_EXTENSION=exe + ;; + *Library) + ASSEMBLY_EXTENSION=dll + ;; + *) + AC_MSG_ERROR([*** Please add support for project type $PROJECT_TYPE to configure.ac checks!]) + ;; +esac +AC_MSG_RESULT([$PROJECT_TYPE]) + +AC_SUBST(ASSEMBLY_EXTENSION) + +AC_MSG_CHECKING([whether we're compiling from an RCS]) +if test -f "$srcdir/.cvs_version" ; then + from_rcs=cvs +else + if test -f "$srcdir/.svn/entries" ; then + from_rcs=svn + else + from_rcs=no + fi +fi + +AC_MSG_RESULT($from_rcs) + +MONO_REQUIRED_VERSION=1.1 + +PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false) + +if test "x$has_mono" = "xtrue"; then + AC_PATH_PROG(RUNTIME, mono, no) + AC_PATH_PROG(CSC, gmcs, no) + AC_PATH_PROG(RESGEN, resgen2, no) + if test `uname -s` = "Darwin"; then + LIB_PREFIX= + LIB_SUFFIX=.dylib + else + LIB_PREFIX=.so + LIB_SUFFIX= + fi +else + AC_PATH_PROG(CSC, csc.exe, no) + if test x$CSC = "xno"; then + AC_MSG_ERROR([You need to install either mono or .Net]) + else + RUNTIME= + LIB_PREFIX= + LIB_SUFFIX= + fi +fi + +AC_PATH_PROG(GACUTIL, gacutil) +if test "x$GACUTIL" = "xno" ; then + AC_MSG_ERROR([No gacutil tool found]) +fi + +GACUTIL_FLAGS='/package /gacdir $(DESTDIR)$(prefix)/lib' +AC_SUBST(GACUTIL_FLAGS) + +AC_SUBST(PATH) +AC_SUBST(LD_LIBRARY_PATH) + +AC_SUBST(LIB_PREFIX) +AC_SUBST(LIB_SUFFIX) +AC_SUBST(RUNTIME) +AC_SUBST(CSC) +AC_SUBST(RESGEN) +AC_SUBST(GACUTIL) + +AC_SUBST(BASE_DEPENDENCIES_CFLAGS) +AC_SUBST(BASE_DEPENDENCIES_LIBS) + +dnl Find monodoc +MONODOC_REQUIRED_VERSION=1.0 +AC_SUBST(MONODOC_REQUIRED_VERSION) + +PKG_CHECK_MODULES(MONODOC_DEPENDENCY, monodoc >= $MONODOC_REQUIRED_VERSION, enable_monodoc=yes, enable_monodoc=no) + +if test "x$enable_monodoc" = "xyes"; then + AC_PATH_PROG(MONODOC, monodoc, no) + if test x$MONODOC = xno; then + enable_monodoc=no + fi +else + MONODOC= +fi + +AC_SUBST(MONODOC) +AM_CONDITIONAL(ENABLE_MONODOC, test "x$enable_monodoc" = "xyes") + +winbuild=no +case "$host" in + *-*-mingw*|*-*-cygwin*) + winbuild=yes + ;; +esac +AM_CONDITIONAL(WINBUILD, test x$winbuild = xyes) + +AC_CONFIG_FILES() +AC_CONFIG_FILES(.pc) + +AC_CONFIG_FILES(Makefile) +AC_OUTPUT + +echo "===" +echo "" +echo "Project configuration summary" +echo "" +echo " * Installation prefix: $prefix" +echo " * compiler: $CSC" +echo " * Documentation: $enable_monodoc ($MONODOC)" +echo " * Project Name: $PROJECT_NAME" +echo " * Version: $PROJECT_VERSION" +echo "" +echo "===" + + + + + + + + + + + + + + + + + + + + + + + + + + +ASSEMBLY=$(ASSEMBLY_NAME).$(ASSEMBLY_EXTENSION) + + +dir = $(prefix)/lib/ +_DATA = $(ASSEMBLY) $(ASSEMBLY).config + +bin_SCRIPTS= + +pkgconfigdir = $(prefix)/lib/pkgconfig +pkgconfig_DATA = .pc + +dir = $(prefix)/lib/mono/ +_DATA = $(ASSEMBLY).config + +noinst_DATA = $(ASSEMBLY) + + +PACKAGES = +BINARY_LIBS = +SYSTEM_LIBS = +RESOURCES_SRC = +RESOURCES = $(RESOURCES_SRC:.resx=.resources) +SOURCES = + +EXTRA_DIST=$(SOURCES) $(BINARY_LIBS) $(RESOURCES_SRC) install-sh missing + +CLEANFILES=$(ASSEMBLY) + + + + + + + +/$(ASSEMBLY): $(srcdir)/$(ASSEMBLY).response $(RESOURCES) $(SOURCES) $(BINARY_LIBS) + mkdir -p doc && mkdir -p && $(CSC) /out:$@ \ + /target: \ + $(addprefix /resource:$(srcdir)/, $(RESOURCES)) \ + $(addprefix /pkg:, $(PACKAGES)) \ + $(addprefix /r:, $(SYSTEM_LIBS)) \ + $(addprefix /r:$(srcdir)/, $(BINARY_LIBS)) \ + @$(srcdir)/$(ASSEMBLY).response \ + /doc:doc/ \ + /keyfile:$(srcdir)/ \ + /unsafe \ + && rm -f $(ASSEMBLY) \ + && ln $@ $(ASSEMBLY) + +CLEANFILES+=/$(ASSEMBLY) + + +EXTRA_DIST+= + +: /$(ASSEMBLY) + rm -f $(ASSEMBLY) \ + && ln /$(ASSEMBLY) $(ASSEMBLY) + + + + + +_install-data-local: /$(ASSEMBLY) + echo "$(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS)"; \ + $(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS) || exit 1; + +_uninstall-local: + if [`gacutil -l | grep "Number" | awk -F= '{print $$2}'` -gt "0" ] ; \ + then \ + echo "$(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ + $(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ + fi + + + +noinst__dir = $(prefix)/lib/mono/ +noinst___DATA = /$(ASSEMBLY) + + + + + + +$(ASSEMBLY): + + +$(srcdir)/$(ASSEMBLY).response: $(srcdir)/Makefile + echo "$(addprefix $(srcdir)/, $(SOURCES))" > $@ + + +all: $(ASSEMBLY) + +# rule to compile .resx files to .resources +%.resources: %.resx + $(RESGEN) /useSourcePath /compile $(@:.resources=.resx) + + + + + +install-data-local: _install-data-local + +uninstall-local: _uninstall-local + + + +#dir+=$(noinst__dir) +#_DATA+=$(noinst___DATA) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +prefix=@prefix@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib/mono/@PROJECT_NAME@ + +Name: +Description: +Version: @PROJECT_VERSION@ +Requires: +Libs: -r:${libdir}/@PROJECT_NAME@.dll + + + + + + + + + + + #!/bin/sh +# Run this to generate all the initial makefiles, etc. +# Ripped off from Mono, which ripped off from GNOME macros version + +DIE=0 + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +if [ -n "$MONO_PATH" ]; then + # from -> /mono/lib:/another/mono/lib + # to -> /mono /another/mono + for i in `echo ${MONO_PATH} | tr ":" " "`; do + i=`dirname ${i}` + if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then + ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" + fi + if [ -n "{i}" -a -d "${i}/bin" ]; then + PATH="${i}/bin:$PATH" + fi + done + export PATH +fi + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to compile Mono." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +if [ -z "$LIBTOOL" ]; then + LIBTOOL=`which glibtool 2>/dev/null` + if [ ! -x "$LIBTOOL" ]; then + LIBTOOL=`which libtool` + fi +fi + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { + ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed to compile Mono." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed to compile Mono." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + + +if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + ${LIBTOOL}ize --force --copy + fi +fi + +echo "Running aclocal $ACLOCAL_FLAGS ..." +aclocal $ACLOCAL_FLAGS || { + echo + echo "**Error**: aclocal failed. This may mean that you have not" + echo "installed all of the packages you need, or you may need to" + echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" + echo "for the prefix where you installed the packages whose" + echo "macros were not found" + exit 1 +} + +if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then + echo "Running autoheader..." + autoheader || { echo "**Error**: autoheader failed."; exit 1; } +fi + +echo "Running automake --gnu $am_opt ..." +automake --add-missing --gnu $am_opt || + { echo "**Error**: automake failed."; exit 1; } +echo "Running autoconf ..." +autoconf || { echo "**Error**: autoconf failed."; exit 1; } + + +echo Running /autogen.sh ... +(cd $srcdir/ ; NOCONFIGURE=1 /bin/sh ./autogen.sh "$@") +echo Done running /autogen.sh ... + + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME || exit 1 +else + echo Skipping configure process. +fi + + + + + + + + + + +AC_INIT([]-solution,[]) +AC_CONFIG_AUX_DIR(.) +AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) +EXTRA_DIST="install-sh missing" +SOLUTION_NAME= +SOLUTION_VERSION=$VERSION +SOLUTION_DESCRIPTION="" +AC_SUBST(DESCRIPTION) + +AM_MAINTAINER_MODE + +dnl AC_PROG_INTLTOOL([0.25]) + +AC_PROG_INSTALL + +AC_MSG_CHECKING([whether we're building from an RCS]) +if test -f "$srcdir/.cvs_version" ; then + from_rcs=cvs +else + if test -f "$srcdir/.svn/entries" ; then + from_rcs=svn + else + from_rcs=no + fi +fi + +AC_MSG_RESULT($from_rcs) + +CONFIG="Release" +AC_SUBST(CONFIG) + +AC_CONFIG_SUBDIRS( +) + + +AC_OUTPUT([ +Makefile +]) + +echo "===" +echo "" +echo "Solution configuration summary" +echo "" +echo " * Solution Name: $SOLUTION_NAME" +echo " * Version: $SOLUTION_VERSION" +echo " * Packages:" +echo " - " +echo "" +echo "===" + + + + + + + + + SUBDIRS = + + + + + + + + + + + + +#! /bin/sh + +PACKAGE= +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +# %%$@%$# why oh why isn't it $sharedir/ +# Day changed to 30 Mar 2007 +# ... +# 07:50 < cj> why are we installing .exe assemblies to $prefix/lib/$package/ and +# not $prefix/share/$package ? +# 07:50 < jonp> momentum. +# 07:50 < jonp> and it's hard to say that a .exe isn't platform specific +# 07:50 < jonp> as it can still contain DllImport's which make platform +# assumptions + +packagedir=$prefix/lib/ +export MONO_PATH=$MONO_PATH + +exec @RUNTIME@ $packagedir/$PACKAGE.exe "$@" + + + + + diff --git a/Prebuild/src/data/dnpb-1.0.xsd b/Prebuild/src/data/dnpb-1.0.xsd new file mode 100644 index 0000000000..b9e0e4eaf5 --- /dev/null +++ b/Prebuild/src/data/dnpb-1.0.xsd @@ -0,0 +1,183 @@ + + + + + Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.1.xsd b/Prebuild/src/data/dnpb-1.1.xsd new file mode 100644 index 0000000000..2c065a3297 --- /dev/null +++ b/Prebuild/src/data/dnpb-1.1.xsd @@ -0,0 +1,184 @@ + + + + + Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.2.xsd b/Prebuild/src/data/dnpb-1.2.xsd new file mode 100644 index 0000000000..d694ab43d7 --- /dev/null +++ b/Prebuild/src/data/dnpb-1.2.xsd @@ -0,0 +1,198 @@ + + + + + Copyright (c) 2004 Matthew Holmes (calefaction _at_ houston _._ rr _._ com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.3.xsd b/Prebuild/src/data/dnpb-1.3.xsd new file mode 100644 index 0000000000..8f31a544ab --- /dev/null +++ b/Prebuild/src/data/dnpb-1.3.xsd @@ -0,0 +1,206 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Pre-Build is an XML-driven pre-build tool allowing developers to + easily generate project or make files for major IDE's and .NET + development tools including: Visual Studio 2003, Visual Studio 2002, + SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Prebuild/src/data/dnpb-1.4.xsd b/Prebuild/src/data/dnpb-1.4.xsd new file mode 100644 index 0000000000..1da50fcc7a --- /dev/null +++ b/Prebuild/src/data/dnpb-1.4.xsd @@ -0,0 +1,212 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/dnpb-1.5.xsd b/Prebuild/src/data/dnpb-1.5.xsd new file mode 100644 index 0000000000..e2b21f0c69 --- /dev/null +++ b/Prebuild/src/data/dnpb-1.5.xsd @@ -0,0 +1,215 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.6.xsd b/Prebuild/src/data/prebuild-1.6.xsd new file mode 100644 index 0000000000..57ebd2eb9d --- /dev/null +++ b/Prebuild/src/data/prebuild-1.6.xsd @@ -0,0 +1,231 @@ + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.7.xsd b/Prebuild/src/data/prebuild-1.7.xsd new file mode 100644 index 0000000000..a7f5c88d09 --- /dev/null +++ b/Prebuild/src/data/prebuild-1.7.xsd @@ -0,0 +1,350 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.8.xsd b/Prebuild/src/data/prebuild-1.8.xsd new file mode 100644 index 0000000000..8f5c1a4566 --- /dev/null +++ b/Prebuild/src/data/prebuild-1.8.xsd @@ -0,0 +1,331 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.9.xsd b/Prebuild/src/data/prebuild-1.9.xsd new file mode 100644 index 0000000000..d647e087ae --- /dev/null +++ b/Prebuild/src/data/prebuild-1.9.xsd @@ -0,0 +1,336 @@ + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/tests/.svn/all-wcprops b/Prebuild/tests/.svn/all-wcprops new file mode 100644 index 0000000000..0668acba54 --- /dev/null +++ b/Prebuild/tests/.svn/all-wcprops @@ -0,0 +1,59 @@ +K 25 +svn:wc:ra_dav:version-url +V 47 +/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests +END +include-001.expected +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/include-001.expected +END +include-002.expected +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002.expected +END +include-001.include +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/include-001.include +END +include-002-2.include +K 25 +svn:wc:ra_dav:version-url +V 69 +/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002-2.include +END +include-002.include +K 25 +svn:wc:ra_dav:version-url +V 67 +/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002.include +END +include-001.prebuild +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/include-001.prebuild +END +include-002.prebuild +K 25 +svn:wc:ra_dav:version-url +V 68 +/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002.prebuild +END +README.txt +K 25 +svn:wc:ra_dav:version-url +V 58 +/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/README.txt +END +Makefile +K 25 +svn:wc:ra_dav:version-url +V 56 +/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/Makefile +END diff --git a/Prebuild/tests/.svn/entries b/Prebuild/tests/.svn/entries new file mode 100644 index 0000000000..2a70cf9a67 --- /dev/null +++ b/Prebuild/tests/.svn/entries @@ -0,0 +1,334 @@ +10 + +dir +323 +https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/tests +https://dnpb.svn.sourceforge.net/svnroot/dnpb + + + +2008-12-10T02:26:03.443834Z +280 +dmoonfire + + + + + + + + + + + + + + +3355ff64-970d-0410-bbe8-d0fbd18be4fb + +include-001.expected +file + + + + +2010-09-10T22:51:45.000000Z +d65010a81975867917d4468950ec7ccc +2008-12-10T02:04:22.474237Z +279 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +1784 + +include-002.expected +file + + + + +2010-09-10T22:51:45.000000Z +dcef68172b57f9e1b2228f1dba535934 +2008-12-10T02:26:03.443834Z +280 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +1150 + +include-001.include +file + + + + +2010-09-10T22:51:45.000000Z +92601282deffe7c461f80b407525446d +2008-12-10T02:04:22.474237Z +279 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +983 + +include-002-2.include +file + + + + +2010-09-10T22:51:45.000000Z +d9f24dc85d95d7310516187910433c8c +2008-12-10T02:26:03.443834Z +280 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +307 + +include-002.include +file + + + + +2010-09-10T22:51:45.000000Z +44815ffa6c2dc32d4df9977b5fe49ca4 +2008-12-10T02:26:03.443834Z +280 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +332 + +include-001.prebuild +file + + + + +2010-09-10T22:51:45.000000Z +d01a5391189ada3dcd7d3becf254f151 +2008-12-10T02:04:22.474237Z +279 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +742 + +include-002.prebuild +file + + + + +2010-09-10T22:51:45.000000Z +22ad11b07dd489b41ec998e03c83a397 +2008-12-10T02:26:03.443834Z +280 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +289 + +README.txt +file + + + + +2010-09-10T22:51:45.000000Z +6b111c08a76e929cb94b77c99774ef78 +2008-12-10T02:04:22.474237Z +279 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +326 + +Makefile +file + + + + +2010-09-10T22:51:45.000000Z +eed6712c3f5e4478d92137f6657aba56 +2008-12-10T02:04:22.474237Z +279 +dmoonfire + + + + + + + + + + + + + + + + + + + + + +456 + diff --git a/Prebuild/tests/.svn/text-base/Makefile.svn-base b/Prebuild/tests/.svn/text-base/Makefile.svn-base new file mode 100644 index 0000000000..4a8ddf459d --- /dev/null +++ b/Prebuild/tests/.svn/text-base/Makefile.svn-base @@ -0,0 +1,24 @@ +# +# Executable +# + +# Executables +PREBUILD = mono ../src/bin/Release/prebuild.exe /target makefile + +# Files +PREBUILDS = $(wildcard *.prebuild) +RESULTS = $(PREBUILDS:prebuild=results) +TESTS = $(PREBUILDS:prebuild=test) + +all: $(TESTS) + +clean: + rm -f *~ *.log + rm -f $(RESULTS) + +%.test: %.prebuild + $(PREBUILD) /log $*.log /file $*.prebuild /ppi $*.results >& /dev/null + if ! cmp $*.expected $*.results; then \ + echo $*.prebuild failed; \ + false; \ + fi diff --git a/Prebuild/tests/.svn/text-base/README.txt.svn-base b/Prebuild/tests/.svn/text-base/README.txt.svn-base new file mode 100644 index 0000000000..2c2de3bc50 --- /dev/null +++ b/Prebuild/tests/.svn/text-base/README.txt.svn-base @@ -0,0 +1,5 @@ +There are some tests that are run via a Makfile in this +directory. They haven't been included in any form of unit tests, but +they are there to help test the functionality in some what. Simply +build prebuild (so there is a src/bin/Release/prebuild.exe) and type +`make` in this directory. Everything should pass without errors. diff --git a/Prebuild/tests/.svn/text-base/include-001.expected.svn-base b/Prebuild/tests/.svn/text-base/include-001.expected.svn-base new file mode 100644 index 0000000000..26374b5bc7 --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-001.expected.svn-base @@ -0,0 +1,46 @@ + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + TRACE + bin/Release + true + false + + + + + + DEBUG;TRACE + false + bin/Debug + true + Prebuild.snk + 1595 + + + + + TRACE + bin/Release + true + false + Prebuild.snk + 1595 + + + + + + + + + diff --git a/Prebuild/tests/.svn/text-base/include-001.include.svn-base b/Prebuild/tests/.svn/text-base/include-001.include.svn-base new file mode 100644 index 0000000000..7f75962a7a --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-001.include.svn-base @@ -0,0 +1,33 @@ + + + + DEBUG;TRACE + false + bin/Debug + true + Prebuild.snk + 1595 + + + + + TRACE + bin/Release + true + false + Prebuild.snk + 1595 + + + + + + + diff --git a/Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base b/Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base new file mode 100644 index 0000000000..8047008951 --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base @@ -0,0 +1,22 @@ + + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + TRACE + bin/Release + true + false + + + + + diff --git a/Prebuild/tests/.svn/text-base/include-002-2.include.svn-base b/Prebuild/tests/.svn/text-base/include-002-2.include.svn-base new file mode 100644 index 0000000000..661b7f3b06 --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-002-2.include.svn-base @@ -0,0 +1,8 @@ + + + DEBUG;TRACE + false + bin/Debug + true + + diff --git a/Prebuild/tests/.svn/text-base/include-002.expected.svn-base b/Prebuild/tests/.svn/text-base/include-002.expected.svn-base new file mode 100644 index 0000000000..9849658b1e --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-002.expected.svn-base @@ -0,0 +1,26 @@ + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + + + + + diff --git a/Prebuild/tests/.svn/text-base/include-002.include.svn-base b/Prebuild/tests/.svn/text-base/include-002.include.svn-base new file mode 100644 index 0000000000..64f4058dc0 --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-002.include.svn-base @@ -0,0 +1,14 @@ + + + + + + + diff --git a/Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base b/Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base new file mode 100644 index 0000000000..9e85f20f54 --- /dev/null +++ b/Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Prebuild/tests/Makefile b/Prebuild/tests/Makefile new file mode 100644 index 0000000000..4a8ddf459d --- /dev/null +++ b/Prebuild/tests/Makefile @@ -0,0 +1,24 @@ +# +# Executable +# + +# Executables +PREBUILD = mono ../src/bin/Release/prebuild.exe /target makefile + +# Files +PREBUILDS = $(wildcard *.prebuild) +RESULTS = $(PREBUILDS:prebuild=results) +TESTS = $(PREBUILDS:prebuild=test) + +all: $(TESTS) + +clean: + rm -f *~ *.log + rm -f $(RESULTS) + +%.test: %.prebuild + $(PREBUILD) /log $*.log /file $*.prebuild /ppi $*.results >& /dev/null + if ! cmp $*.expected $*.results; then \ + echo $*.prebuild failed; \ + false; \ + fi diff --git a/Prebuild/tests/README.txt b/Prebuild/tests/README.txt new file mode 100644 index 0000000000..2c2de3bc50 --- /dev/null +++ b/Prebuild/tests/README.txt @@ -0,0 +1,5 @@ +There are some tests that are run via a Makfile in this +directory. They haven't been included in any form of unit tests, but +they are there to help test the functionality in some what. Simply +build prebuild (so there is a src/bin/Release/prebuild.exe) and type +`make` in this directory. Everything should pass without errors. diff --git a/Prebuild/tests/include-001.expected b/Prebuild/tests/include-001.expected new file mode 100644 index 0000000000..26374b5bc7 --- /dev/null +++ b/Prebuild/tests/include-001.expected @@ -0,0 +1,46 @@ + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + TRACE + bin/Release + true + false + + + + + + DEBUG;TRACE + false + bin/Debug + true + Prebuild.snk + 1595 + + + + + TRACE + bin/Release + true + false + Prebuild.snk + 1595 + + + + + + + + + diff --git a/Prebuild/tests/include-001.include b/Prebuild/tests/include-001.include new file mode 100644 index 0000000000..7f75962a7a --- /dev/null +++ b/Prebuild/tests/include-001.include @@ -0,0 +1,33 @@ + + + + DEBUG;TRACE + false + bin/Debug + true + Prebuild.snk + 1595 + + + + + TRACE + bin/Release + true + false + Prebuild.snk + 1595 + + + + + + + diff --git a/Prebuild/tests/include-001.prebuild b/Prebuild/tests/include-001.prebuild new file mode 100644 index 0000000000..8047008951 --- /dev/null +++ b/Prebuild/tests/include-001.prebuild @@ -0,0 +1,22 @@ + + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + TRACE + bin/Release + true + false + + + + + diff --git a/Prebuild/tests/include-002-2.include b/Prebuild/tests/include-002-2.include new file mode 100644 index 0000000000..661b7f3b06 --- /dev/null +++ b/Prebuild/tests/include-002-2.include @@ -0,0 +1,8 @@ + + + DEBUG;TRACE + false + bin/Debug + true + + diff --git a/Prebuild/tests/include-002.expected b/Prebuild/tests/include-002.expected new file mode 100644 index 0000000000..9849658b1e --- /dev/null +++ b/Prebuild/tests/include-002.expected @@ -0,0 +1,26 @@ + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + + + + + diff --git a/Prebuild/tests/include-002.include b/Prebuild/tests/include-002.include new file mode 100644 index 0000000000..64f4058dc0 --- /dev/null +++ b/Prebuild/tests/include-002.include @@ -0,0 +1,14 @@ + + + + + + + diff --git a/Prebuild/tests/include-002.prebuild b/Prebuild/tests/include-002.prebuild new file mode 100644 index 0000000000..9e85f20f54 --- /dev/null +++ b/Prebuild/tests/include-002.prebuild @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe index ad84b98edf60ebbf4fec7fec73c36ebc14c07071..d79227c6da38b67408fee08669bbe96f6dd73aff 100755 GIT binary patch delta 74855 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 z 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 delta 74617 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 From 51a5af93d0be85dcd0cbfeeaab6f898b9507b37d Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 10 Sep 2010 18:48:32 -0700 Subject: [PATCH 23/35] White space junk. --- .../.svn/text-base/prebuild-1.7.xsd.svn-base | 700 +++++++++--------- .../.svn/text-base/prebuild-1.9.xsd.svn-base | 672 ++++++++--------- Prebuild/src/data/prebuild-1.7.xsd | 700 +++++++++--------- Prebuild/src/data/prebuild-1.9.xsd | 672 ++++++++--------- 4 files changed, 1372 insertions(+), 1372 deletions(-) diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base index a7f5c88d09..3675503bab 100644 --- a/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base +++ b/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base @@ -1,350 +1,350 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base index d647e087ae..fbca556f19 100644 --- a/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base +++ b/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base @@ -1,336 +1,336 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.7.xsd b/Prebuild/src/data/prebuild-1.7.xsd index a7f5c88d09..3675503bab 100644 --- a/Prebuild/src/data/prebuild-1.7.xsd +++ b/Prebuild/src/data/prebuild-1.7.xsd @@ -1,350 +1,350 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.9.xsd b/Prebuild/src/data/prebuild-1.9.xsd index d647e087ae..fbca556f19 100644 --- a/Prebuild/src/data/prebuild-1.9.xsd +++ b/Prebuild/src/data/prebuild-1.9.xsd @@ -1,336 +1,336 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d5c7a8d28c9cdfba62f7832fddedbb4523df84ef Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 10 Sep 2010 21:18:23 -0700 Subject: [PATCH 24/35] All these files want to be committed. All white space junk. grr. --- Prebuild/COPYING | 130 +- Prebuild/NEWS | 400 +-- Prebuild/README | 548 ++--- .../.svn/text-base/SharpDevelop2.bat.svn-base | 8 +- .../.svn/text-base/VS2008.bat.svn-base | 8 +- .../.svn/text-base/VS2010.bat.svn-base | 8 +- .../.svn/text-base/autotools.bat.svn-base | 8 +- Prebuild/scripts/SharpDevelop2.bat | 8 +- Prebuild/scripts/VS2008.bat | 8 +- Prebuild/scripts/VS2010.bat | 8 +- Prebuild/scripts/autotools.bat | 8 +- .../.svn/text-base/CleanFilesNode.cs.svn-base | 158 +- .../.svn/text-base/CleanupNode.cs.svn-base | 168 +- .../ConfigurationNodeCollection.cs.svn-base | 142 +- .../text-base/DatabaseProjectNode.cs.svn-base | 186 +- .../DatabaseReferenceNode.cs.svn-base | 126 +- Prebuild/src/Core/Nodes/CleanFilesNode.cs | 158 +- Prebuild/src/Core/Nodes/CleanupNode.cs | 168 +- .../Core/Nodes/ConfigurationNodeCollection.cs | 142 +- .../src/Core/Nodes/DatabaseProjectNode.cs | 186 +- .../src/Core/Nodes/DatabaseReferenceNode.cs | 126 +- .../text-base/AutotoolsTarget.cs.svn-base | 2140 ++++++++--------- .../.svn/text-base/VS2010Target.cs.svn-base | 276 +-- .../text-base/VSGenericTarget.cs.svn-base | 1844 +++++++------- Prebuild/src/Core/Targets/AutotoolsTarget.cs | 2140 ++++++++--------- Prebuild/src/Core/Targets/VS2010Target.cs | 276 +-- Prebuild/src/Core/Targets/VSGenericTarget.cs | 1844 +++++++------- 27 files changed, 5611 insertions(+), 5611 deletions(-) diff --git a/Prebuild/COPYING b/Prebuild/COPYING index d3cdf7e38e..c57c080b15 100644 --- a/Prebuild/COPYING +++ b/Prebuild/COPYING @@ -1,65 +1,65 @@ -BSD License -Copyright (c)2004-2008 - -See AUTHORS file for list of copyright holders - -Dave Hudson (jendave@yahoo.com), -Matthew Holmes (matthew@wildfiregames.com) -Dan Moorehead (dan05a@gmail.com) -Rob Loach (http://www.robloach.net) -C.J. Adams-Collier (cjac@colliertech.org) - -http://dnpb.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. The names of the authors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---- - -Portions of src/Core/Targets/AutotoolsTarget.cs -// Copyright (C) 2006 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +BSD License +Copyright (c)2004-2008 + +See AUTHORS file for list of copyright holders + +Dave Hudson (jendave@yahoo.com), +Matthew Holmes (matthew@wildfiregames.com) +Dan Moorehead (dan05a@gmail.com) +Rob Loach (http://www.robloach.net) +C.J. Adams-Collier (cjac@colliertech.org) + +http://dnpb.sourceforge.net +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +--- + +Portions of src/Core/Targets/AutotoolsTarget.cs +// Copyright (C) 2006 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Prebuild/NEWS b/Prebuild/NEWS index bea28dac26..3ab3108b4c 100644 --- a/Prebuild/NEWS +++ b/Prebuild/NEWS @@ -1,200 +1,200 @@ -Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, MonoDevelop, and NAnt. - -Documentation and downloads are available at http://dnpb.sourceforge.net. - -Prebuild is licensed under the BSD license. - -[ XXXXXXX XX, XXX - 1.3.2 ] - + Added Keyfile signing to NAnt target and VS2005 target - + Updated XSD file to 1.7 - + Boo and VisualBasic Language support in VS2005 target - + Added basic Autotools target. It creates a non-recursive Autotools system. - ! Multiple files can be excluded from the Match node - ! VS2005 now handles .resx files correctly. - ! NAnt and Autotools now handle defines - ! NAnt and Autotools now handle resources - + Conditional XML variables can be passed through the command line. - + Added /install and /remove command line flags to install and remove assemblies from the GAC - + Many fixes to VS2005 target - -[ July 21, 2006 - 1.3.1 ] - ! VS2005 fixes from Rob Loach - ! NAnt fixes from Rob Loach and David Hudson - ! XML doc fixes from Rob Loach - + Added SharpDevelop2 target (really just uses VS2005 target) - ! Fixed bug with BuildEvents in Monodevelop target - + Passing /yes will default to answering yes to any warnings - -[ February 28, 2006 - 1.3 ] - + Added MonoDevelop target. - + Added NAnt target. - + Lots of fixes to all targets. - * Cleaned up the code using FXCop. - * Updated schema to 1.6 to fix a typo and add a new parameter. - * jendave is now the maintainer of the project. RobLoach has been added as a developer. - * Removed references to 'dnpb'. - + Added rudimentary support for pre- and post- build scripts - * Updated examples. - -[ August 5, 2004 - 1.2 ] - + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages - + Added the allowedgroups command line option followed by a pipe-delimited list of project group filter flags (eg. Group1|Group2) allow optional filtering of all projects that dont have at least one of these flags - + Added the filterGroups XML attribute to the project node and updated the scheme to v1.5 for this addition, it is used to specified the delimited list of filter groups to which a project belongs - * Modified the removedir command line option to allow for a pipe-delimited list of directory names - ! Modified the resource loading code to search for resourced without the prepended namespace (as Visual Studio .NET does it) to allow for it to be compiled with SharpDevelop as well - + Added the GenerateXmlDocFile boolean option to the Options XML element - * Changed the behavior of the XmlDocFile option so that if not specified it uses the assemblyName (without file extension) + .xml for the file name instead of just not generating the file since the new GenerateXmlDocFile takes care of this - -[ January 3, 2004 - 1.1 ] - ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems - + Added the checkOsVars attribute to the root element for enabling interpolation for Enviroment variables in the form ${var}, otherwise no checking is performed for efficiency-sake - * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version - -[ December 30, 2004 - 1.1 ] - ! Applied Leed's fix for SharpDevelop references - + Rewrote much of the processing for better validation and without the use of a temp file - + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs - * Changed all spaces into tabs - + Added support for the None build action - * Replaced all sequence's in the XML schema for all's because the order doesn't matter since the xml file is loaded into an XmlDocument - -[ December 25, 2004 - 1.0 ] - + Added the /removedir option for cleaning directories like obj before file releases - + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds - * Made path optional for Match elements (defaults to current directory) and updates schema for it - ! Fixed XML example in the readme.txt - + Added example xml files to docs directory - * Updated license.txt to add Dan Moorehead and update copyright years - + Updated prebuild.xml to take advantage of the default path attribute for match elements - + Updated Clean to delete the obj directories - -[ December 25, 2004 - 0.13 ] - + Added dnpb.exe so that it can be used to generate the project files - + Added dnpb.ico - * Added parameterless Write statement to Log for writing a single line - * Changed scehema to version 1.3 for support of icon attribute - * Added support for All configuration name under a Project node signifying common settings for all configurations - ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode - * Wrote documentation in docs/readme.txt - * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 - * Updated prebuild.xml - * Optimized Log class - * Updated OutputUsage() - * /clean targets all by default - * No log file is used by default, /log without value specified uses default file name - + Added support for the /pause which pauses the utility after execution to observe output - - -[ September 27, 2004 - 0.12.2a ] - ! Fixed a nasty bug when trying to delete our temp file for pre-processing. - -[ September 15, 2004 - 0.12.2 ] - + Expanded platform identification, thanks to the NAnt guys for shedding some - light on how to properly check for UNIX platforms! Thanks guys! - * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", - and "Unknown". - ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of - the Project tag. - + New command-line switch, /ppo, forces DNPB to pre-process the file and write - the pre-processed file. This allows you to test/debug your pre-processor - macros. No other processing will be done. You can specify a target file as - a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' - if you do not specify a file. - + The Match tag now has a 'buildAction' attribute which functions exactly like - the attribute of the same name for the File tag. - -[ August 5, 2004 - 0.12.1 ] - + Added environment variable expansion for all values. Environment variables - should be listed in the form ${VAR}. - -[ July 30, 2004 - 0.12.0 ] - + Added preprocessing via XML processing information tags. Available tags - are: ?>, ?>, and . The - current expression parser is very basic, but will be replaced with a more - capable parser over time. Current operators available are: =, !=, <, >, - <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, - RuntimeMinor, RuntimeRevision. - -[ July 27, 2004 - 0.11.4 ] - + Added 'useRegex' attribute to the Match tag. Matches can now use regular - expressions to match filenames. - + Added the 'assemblyName' attribute to the Project tag. Projects can now - set their output assembly name. - ! Fixed several bugs in the way that Project tags inheirt their parent - Solutions configuration options. This operation should now work fully as - intended. - ! Due to some wierdness, Project Guid's are now stored as part of the Project - node and created at parse time. - -[ May 11, 2004 - 0.11.3 ] - ! Fixed a bug where I was writing the wrong property name for a projects root - namespace. - ! Removed a DEBUG statement I had left in the code in 0.11.2. - ! Fixed a bug in the VS2002 writer which caused the version variables to not - be overriden correctly. - + Added the rootNamespace property to the element, allowing you to - specify the root namespace. - * /target and /clean are now mutually exclusive command line switches, and - they both now take the all option. In the case of /target all, all build - file for all targets will be created. In the case of /clean all, the user - will be prompted to make sure they want to do it, and if so, will clean - all build files for all targets. - -[ April 22, 2004 - 0.11.2 ] - ! Fixed a bug with the /file command-line operator. Was using the unresolved - file path rather then the resolved one, was making the attempt to open the - dnpb file fail. - ! Fixed a bug in the schema that required at least 1 solution and 1 reference - path. We can do just fine with 0 of either of these. Some files may be all - statements and not have any tags. - ! Fixed a bug that caused the project references not to be written with the - SharpDevelop target. - * Changed the schema to version 1.2, allowing for Configuration nodes to exist - under project nodes. The inheritance of values is hierarchical. Meaning, if - you define a configuration named Debug at the Soltion level, and one by the - same name at the Project level, the one at the Project level will first - inherit the options of the Solution level configuration, then set it's own - options. If you define a configuration at the Project level and it does not - exist at the Solution level, it will be created at the Solution level. - * Project references should now work correctly across the board. Note that due - to a restriction in Visual Studio, you can only reference projects in the same - solution. - -[ April 21, 2004 - 0.11.1 ] - ! Fixed a problem with resolving paths in various targets. Was not properly - setting the CWD. - * Schema updated to 1.1, moving the ReferencePath element from the Options - element to the Project element. This makes more logical sense, given that - reference paths are resolved relative to the project path. Any prebuild.xml - file referecning verison 1.0 will fail! Please update to the 1.1 schema. - -[ April 19, 2004 - 0.11.0 ] - * Added several attributes across the code to make FxCop happy - ! Fixed bugs in reference paths being written in the VS targets. - ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of - a Push/Pop pair. Was wreaking havoc with tags. - ! Fixed some bugs in the path tracking, both the Project and Solution nodes now - have a FullPath property, which is the full path to the file resolved at load - time. This should fix all path relativity problems. - + Added new /clean switch, allowing the target to clean up any files it generated. - in accordance, the ITarget interface has been updated to support a new Clean() - method. - + Completed addition of the tag, to allow the referencing of external - prebuild.xml files. - + Added the runtime attribute to the Project element. This allows the developer - to specify which runtime a project should target (Mono or Microsoft). This is - of course ignored in certain targets like the Visual Studio targets. - + Added the SharpDevelop target. - -[ April 13, 2004 - 0.10.1a ] - + Added the buildAction attribute to the File node. This is needed for dnpb - to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) - -[ April 13, 2004 - 0.10.1 ] - * First Release - -[ Key ] -* = Change or information -+ = Addition -! = Bug Fix - +Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, MonoDevelop, and NAnt. + +Documentation and downloads are available at http://dnpb.sourceforge.net. + +Prebuild is licensed under the BSD license. + +[ XXXXXXX XX, XXX - 1.3.2 ] + + Added Keyfile signing to NAnt target and VS2005 target + + Updated XSD file to 1.7 + + Boo and VisualBasic Language support in VS2005 target + + Added basic Autotools target. It creates a non-recursive Autotools system. + ! Multiple files can be excluded from the Match node + ! VS2005 now handles .resx files correctly. + ! NAnt and Autotools now handle defines + ! NAnt and Autotools now handle resources + + Conditional XML variables can be passed through the command line. + + Added /install and /remove command line flags to install and remove assemblies from the GAC + + Many fixes to VS2005 target + +[ July 21, 2006 - 1.3.1 ] + ! VS2005 fixes from Rob Loach + ! NAnt fixes from Rob Loach and David Hudson + ! XML doc fixes from Rob Loach + + Added SharpDevelop2 target (really just uses VS2005 target) + ! Fixed bug with BuildEvents in Monodevelop target + + Passing /yes will default to answering yes to any warnings + +[ February 28, 2006 - 1.3 ] + + Added MonoDevelop target. + + Added NAnt target. + + Lots of fixes to all targets. + * Cleaned up the code using FXCop. + * Updated schema to 1.6 to fix a typo and add a new parameter. + * jendave is now the maintainer of the project. RobLoach has been added as a developer. + * Removed references to 'dnpb'. + + Added rudimentary support for pre- and post- build scripts + * Updated examples. + +[ August 5, 2004 - 1.2 ] + + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages + + Added the allowedgroups command line option followed by a pipe-delimited list of project group filter flags (eg. Group1|Group2) allow optional filtering of all projects that dont have at least one of these flags + + Added the filterGroups XML attribute to the project node and updated the scheme to v1.5 for this addition, it is used to specified the delimited list of filter groups to which a project belongs + * Modified the removedir command line option to allow for a pipe-delimited list of directory names + ! Modified the resource loading code to search for resourced without the prepended namespace (as Visual Studio .NET does it) to allow for it to be compiled with SharpDevelop as well + + Added the GenerateXmlDocFile boolean option to the Options XML element + * Changed the behavior of the XmlDocFile option so that if not specified it uses the assemblyName (without file extension) + .xml for the file name instead of just not generating the file since the new GenerateXmlDocFile takes care of this + +[ January 3, 2004 - 1.1 ] + ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems + + Added the checkOsVars attribute to the root element for enabling interpolation for Enviroment variables in the form ${var}, otherwise no checking is performed for efficiency-sake + * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version + +[ December 30, 2004 - 1.1 ] + ! Applied Leed's fix for SharpDevelop references + + Rewrote much of the processing for better validation and without the use of a temp file + + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs + * Changed all spaces into tabs + + Added support for the None build action + * Replaced all sequence's in the XML schema for all's because the order doesn't matter since the xml file is loaded into an XmlDocument + +[ December 25, 2004 - 1.0 ] + + Added the /removedir option for cleaning directories like obj before file releases + + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds + * Made path optional for Match elements (defaults to current directory) and updates schema for it + ! Fixed XML example in the readme.txt + + Added example xml files to docs directory + * Updated license.txt to add Dan Moorehead and update copyright years + + Updated prebuild.xml to take advantage of the default path attribute for match elements + + Updated Clean to delete the obj directories + +[ December 25, 2004 - 0.13 ] + + Added dnpb.exe so that it can be used to generate the project files + + Added dnpb.ico + * Added parameterless Write statement to Log for writing a single line + * Changed scehema to version 1.3 for support of icon attribute + * Added support for All configuration name under a Project node signifying common settings for all configurations + ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode + * Wrote documentation in docs/readme.txt + * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 + * Updated prebuild.xml + * Optimized Log class + * Updated OutputUsage() + * /clean targets all by default + * No log file is used by default, /log without value specified uses default file name + + Added support for the /pause which pauses the utility after execution to observe output + + +[ September 27, 2004 - 0.12.2a ] + ! Fixed a nasty bug when trying to delete our temp file for pre-processing. + +[ September 15, 2004 - 0.12.2 ] + + Expanded platform identification, thanks to the NAnt guys for shedding some + light on how to properly check for UNIX platforms! Thanks guys! + * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", + and "Unknown". + ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of + the Project tag. + + New command-line switch, /ppo, forces DNPB to pre-process the file and write + the pre-processed file. This allows you to test/debug your pre-processor + macros. No other processing will be done. You can specify a target file as + a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' + if you do not specify a file. + + The Match tag now has a 'buildAction' attribute which functions exactly like + the attribute of the same name for the File tag. + +[ August 5, 2004 - 0.12.1 ] + + Added environment variable expansion for all values. Environment variables + should be listed in the form ${VAR}. + +[ July 30, 2004 - 0.12.0 ] + + Added preprocessing via XML processing information tags. Available tags + are: ?>, ?>, and . The + current expression parser is very basic, but will be replaced with a more + capable parser over time. Current operators available are: =, !=, <, >, + <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, + RuntimeMinor, RuntimeRevision. + +[ July 27, 2004 - 0.11.4 ] + + Added 'useRegex' attribute to the Match tag. Matches can now use regular + expressions to match filenames. + + Added the 'assemblyName' attribute to the Project tag. Projects can now + set their output assembly name. + ! Fixed several bugs in the way that Project tags inheirt their parent + Solutions configuration options. This operation should now work fully as + intended. + ! Due to some wierdness, Project Guid's are now stored as part of the Project + node and created at parse time. + +[ May 11, 2004 - 0.11.3 ] + ! Fixed a bug where I was writing the wrong property name for a projects root + namespace. + ! Removed a DEBUG statement I had left in the code in 0.11.2. + ! Fixed a bug in the VS2002 writer which caused the version variables to not + be overriden correctly. + + Added the rootNamespace property to the element, allowing you to + specify the root namespace. + * /target and /clean are now mutually exclusive command line switches, and + they both now take the all option. In the case of /target all, all build + file for all targets will be created. In the case of /clean all, the user + will be prompted to make sure they want to do it, and if so, will clean + all build files for all targets. + +[ April 22, 2004 - 0.11.2 ] + ! Fixed a bug with the /file command-line operator. Was using the unresolved + file path rather then the resolved one, was making the attempt to open the + dnpb file fail. + ! Fixed a bug in the schema that required at least 1 solution and 1 reference + path. We can do just fine with 0 of either of these. Some files may be all + statements and not have any tags. + ! Fixed a bug that caused the project references not to be written with the + SharpDevelop target. + * Changed the schema to version 1.2, allowing for Configuration nodes to exist + under project nodes. The inheritance of values is hierarchical. Meaning, if + you define a configuration named Debug at the Soltion level, and one by the + same name at the Project level, the one at the Project level will first + inherit the options of the Solution level configuration, then set it's own + options. If you define a configuration at the Project level and it does not + exist at the Solution level, it will be created at the Solution level. + * Project references should now work correctly across the board. Note that due + to a restriction in Visual Studio, you can only reference projects in the same + solution. + +[ April 21, 2004 - 0.11.1 ] + ! Fixed a problem with resolving paths in various targets. Was not properly + setting the CWD. + * Schema updated to 1.1, moving the ReferencePath element from the Options + element to the Project element. This makes more logical sense, given that + reference paths are resolved relative to the project path. Any prebuild.xml + file referecning verison 1.0 will fail! Please update to the 1.1 schema. + +[ April 19, 2004 - 0.11.0 ] + * Added several attributes across the code to make FxCop happy + ! Fixed bugs in reference paths being written in the VS targets. + ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of + a Push/Pop pair. Was wreaking havoc with tags. + ! Fixed some bugs in the path tracking, both the Project and Solution nodes now + have a FullPath property, which is the full path to the file resolved at load + time. This should fix all path relativity problems. + + Added new /clean switch, allowing the target to clean up any files it generated. + in accordance, the ITarget interface has been updated to support a new Clean() + method. + + Completed addition of the tag, to allow the referencing of external + prebuild.xml files. + + Added the runtime attribute to the Project element. This allows the developer + to specify which runtime a project should target (Mono or Microsoft). This is + of course ignored in certain targets like the Visual Studio targets. + + Added the SharpDevelop target. + +[ April 13, 2004 - 0.10.1a ] + + Added the buildAction attribute to the File node. This is needed for dnpb + to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) + +[ April 13, 2004 - 0.10.1 ] + * First Release + +[ Key ] +* = Change or information ++ = Addition +! = Bug Fix + diff --git a/Prebuild/README b/Prebuild/README index 2b05fb598d..e8a2d69530 100644 --- a/Prebuild/README +++ b/Prebuild/README @@ -1,274 +1,274 @@ -Prebuild Instructions - -Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, SharpDevelop2, MonoDevelop, and NAnt. - -_______________________________________________________________________________ -Overview - -Prebuild can be either be run from the command line to generate the -project and make files or you can execute the included batch (*.bat) -and Unix Shell script (*.sh) files. - -_______________________________________________________________________________ -The currently supported developement tools and their associated batch -and shell script files. - -Visual Studio .NET 2005 (VS2005.bat) -Visual Studio .NET 2003 (VS2003.bat) -Visual Studio .NET 2002 (VS2002.bat) -SharpDevelop (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ -SharpDevelop2 (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ -MonoDevelop (MonoDevelop.sh) - http://www.monodevelop.com/ -NAnt (nant.sh and nant.bat) - http://nant.sourceforge.net/ -Autotools (autotools.bat and autotools.sh) - http://en.wikipedia.org/wiki/GNU_build_system - -Notes: - -A Unix Shell script is provided for MonoDevelop, as it does not run on -Windows at this time. - -Visual Studio .NET 2005 and the Visual Express IDE's can import -solutions from older versions of Visual Studio .NET. - -Makefiles are not currently supported. - -_______________________________________________________________________________ -Command Line Syntax: - -Example: -> Prebuild /target vs2003 - -This will generate the project files for Visual Studio.NET 2003 and -place the redirect the log to a file named PrebuildLog.txt in the -parent directory - - -The syntax structure is as below, where commandParameter is optional -depending on the command and you can provide several option-value -pairs. - -Note: The '> ' signifies the command prompt, do not enter this literally - -> Prebuild /
"); - } - ps.WriteLine(" "); - - //Project References - ps.WriteLine(" "); - foreach (KeyValuePair pair in projectReferences) - { - ToolInfo tool = tools[pair.Value.Language]; - if (tools == null) - throw new UnknownLanguageException(); - - string path = - Helper.MakePathRelativeTo(project.FullPath, - Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); - ps.WriteLine(" ", path); - - // TODO: Allow reference to visual basic projects - ps.WriteLine(" {0}", pair.Value.Name); - ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); - ps.WriteLine(" {0}", tool.Guid.ToUpper()); - - //This is the Copy Local flag in VS - ps.WriteLine(" {0}", pair.Key.LocalCopy); - - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ps.WriteLine(" "); - - // ps.WriteLine(" "); - List list = new List(); - - foreach (string path in project.Files) - { - string lower = path.ToLower(); - if (lower.EndsWith(".resx")) - { - string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); - if (!list.Contains(codebehind)) - list.Add(codebehind); - } - - } - - foreach (string filePath in project.Files) - { - // if (file == "Properties\\Bind.Designer.cs") - // { - // Console.WriteLine("Wait a minute!"); - // Console.WriteLine(project.Files.GetSubType(file).ToString()); - // } - SubType subType = project.Files.GetSubType(filePath); - - // Visual Studio chokes on file names if forward slash is used as a path separator - // instead of backslash. So we must make sure that all file paths written to the - // project file use \ as a path separator. - string file = filePath.Replace(@"/", @"\"); - - if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer - && subType != SubType.CodeBehind) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ps.WriteLine(" {0}", Path.GetFileName(file)); - ps.WriteLine(" Designer"); - ps.WriteLine(" "); - // - } - - if (subType == SubType.Designer) - { - ps.WriteLine(" ", file); - - string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; - string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; - - // Check for a parent .cs file with the same name as this designer file - if (File.Exists(Helper.NormalizePath(dependent_name))) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" ResXFileCodeGenerator"); - ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); - ps.WriteLine(" " + subType + ""); - } - - ps.WriteLine(" "); - if (File.Exists(Helper.NormalizePath(autogen_name))) - { - ps.WriteLine(" ", autogen_name); - //ps.WriteLine(" True"); - - // If a parent .cs file exists, link this autogen file to it. Otherwise link - // to the designer file - if (File.Exists(dependent_name)) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" True"); - ps.WriteLine(" {0}", Path.GetFileName(filePath)); - } - - ps.WriteLine(" "); - } - list.Add(autogen_name); - } - if (subType == SubType.Settings) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - ps.WriteLine("Include=\"{0}\">", file); - string fileName = Path.GetFileName(filePath); - if (project.Files.GetBuildAction(filePath) == BuildAction.None) - { - ps.WriteLine(" SettingsSingleFileGenerator"); - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - else - { - ps.WriteLine(" Code"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); - string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); - ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); - } - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - else if (subType != SubType.Designer) - { - string path = Helper.NormalizePath(file); - string path_lower = path.ToLower(); - - if (!list.Contains(filePath)) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - - int startPos = 0; - if (project.Files.GetPreservePath(filePath)) - { - while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) - startPos++; - - } - else - { - startPos = file.LastIndexOf(Path.GetFileName(path)); - } - - // be sure to write out the path with backslashes so VS recognizes - // the file properly. - ps.WriteLine("Include=\"{0}\">", file); - - int last_period_index = file.LastIndexOf('.'); - string short_file_name = file.Substring(0, last_period_index); - string extension = Path.GetExtension(path); - // make this upper case, so that when File.Exists tests for the - // existence of a designer file on a case-sensitive platform, - // it is correctly identified. - string designer_format = string.Format(".Designer{0}", extension); - - if (path_lower.EndsWith(designer_format.ToLowerInvariant())) - { - int designer_index = path.IndexOf(designer_format); - string file_name = path.Substring(0, designer_index); - - // There are two corrections to the next lines: - // 1. Fix the connection between a designer file and a form - // or usercontrol that don't have an associated resx file. - // 2. Connect settings files to associated designer files. - if (File.Exists(file_name + extension)) - ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); - else if (File.Exists(file_name + ".resx")) - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); - else if (File.Exists(file_name + ".settings")) - { - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - } - } - else if (subType == SubType.CodeBehind) - { - ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); - } - if (project.Files.GetIsLink(filePath)) - { - string alias = project.Files.GetLinkPath(filePath); - alias += file.Substring(startPos); - alias = Helper.NormalizePath(alias); - ps.WriteLine(" {0}", alias); - } - else if (project.Files.GetBuildAction(filePath) != BuildAction.None) - { - if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) - { - ps.WriteLine(" {0}", subType); - } - } - - if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) - { - ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); - } - - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - } - } - - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(""); - } - #endregion - - #region User File - - ps = new StreamWriter(projectFile + ".user"); - using (ps) - { - // Get the first configuration from the project. - ConfigurationNode firstConfiguration = null; - - if (project.Configurations.Count > 0) - { - firstConfiguration = project.Configurations[0]; - } - - ps.WriteLine(""); - //ps.WriteLine( "" ); - //ps.WriteLine(" <{0}>", toolInfo.XMLTag); - //ps.WriteLine(" "); - ps.WriteLine(" "); - //ps.WriteLine(" ", MakeRefPath(project)); - - if (firstConfiguration != null) - { - ps.WriteLine(" {0}", firstConfiguration.Name); - ps.WriteLine(" {0}", firstConfiguration.Platform); - } - - ps.WriteLine(" {0}", MakeRefPath(project)); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" ProjectFiles"); - ps.WriteLine(" 0"); - ps.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" "); - } - ps.WriteLine(""); - } - #endregion - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) - { - kernel.Log.Write("Creating {0} solution and project files", VersionName); - - foreach (SolutionNode child in solution.Solutions) - { - kernel.Log.Write("...Creating folder: {0}", child.Name); - WriteSolution(child, false); - } - - foreach (ProjectNode project in solution.Projects) - { - kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - - foreach (DatabaseProjectNode project in solution.DatabaseProjects) - { - kernel.Log.Write("...Creating database project: {0}", project.Name); - WriteDatabaseProject(solution, project); - } - - if (writeSolutionToDisk) // only write main solution - { - kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - - using (StreamWriter ss = new StreamWriter(solutionFile)) - { - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); - ss.WriteLine(SolutionTag); - - WriteProjectDeclarations(ss, solution, solution); - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); - WriteConfigurationLines(solution.Configurations, solution, ss); - ss.WriteLine("\tEndGlobalSection"); - - if (solution.Solutions.Count > 0) - { - ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); - foreach (SolutionNode embeddedSolution in solution.Solutions) - { - WriteNestedProjectMap(ss, embeddedSolution); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("EndGlobal"); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - } - - private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) - { - foreach (SolutionNode childSolution in embeddedSolution.Solutions) - { - WriteEmbeddedSolution(writer, childSolution); - WriteProjectDeclarations(writer, actualSolution, childSolution); - } - - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteProject(actualSolution, writer, project); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteProject(actualSolution, writer, dbProject); - } - - if (actualSolution.Guid == embeddedSolution.Guid) - { - WriteSolutionFiles(actualSolution, writer); - } - } - - private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) - { - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteNestedProject(writer, embeddedSolution, project.Guid); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteNestedProject(writer, embeddedSolution, dbProject.Guid); - } - - foreach (SolutionNode child in embeddedSolution.Solutions) - { - WriteNestedProject(writer, embeddedSolution, child.Guid); - WriteNestedProjectMap(writer, child); - } - } - - private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) - { - WriteNestedFolder(writer, solution.Guid, projectGuid); - } - - private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) - { - writer.WriteLine("\t\t{0} = {1}", - childGuid.ToString("B").ToUpper(), - parentGuid.ToString("B").ToUpper()); - } - - private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) - { - foreach (ProjectNode project in solution.Projects) - { - foreach (ConfigurationNode conf in configurations) - { - ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - - ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - } - } - - foreach (SolutionNode child in solution.Solutions) - { - WriteConfigurationLines(configurations, child, ss); - } - } - - private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) - { - if(solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); - } - - private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) - { - WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) - { - WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) - { - if (solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); - } - - const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; - const string ProjectDeclarationEndFormat = "EndProject"; - - private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); - - path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); - - WriteProject(ss, language, guid, name, path); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) - { - WriteProject(writer, language, projectGuid, name, location, null); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - writer.WriteLine(ProjectDeclarationBeginFormat, - toolInfo.Guid, - name, - location, - projectGuid.ToString("B").ToUpper()); - - if (files != null) - { - writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); - - foreach (string file in files) - writer.WriteLine("\t\t{0} = {0}", file); - - writer.WriteLine("\tEndProjectSection"); - } - - writer.WriteLine(ProjectDeclarationEndFormat); - } - - private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) - { - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); - IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); - - kernel.CurrentWorkingDirectory.Push(); - - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - using (ps) - { - ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); - ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); - ps.Indent++; - ps.WriteLine("MSDTVersion = \"80\""); - // TODO: Use the project.Files property - if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) - WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); - - ps.WriteLine("Begin DBRefFolder = \"Database References\""); - ps.Indent++; - foreach (DatabaseReferenceNode reference in project.References) - { - ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); - ps.Indent++; - ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); - ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); - //ps.WriteLine("Colorizer = 5"); - ps.Indent--; - ps.WriteLine("End"); - } - ps.Indent--; - ps.WriteLine("End"); - ps.Indent--; - ps.WriteLine("End"); - - ps.Flush(); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - - private static bool ContainsSqlFiles(string folder) - { - if(Directory.GetFiles(folder, "*.sql").Length > 0) - return true; // if the folder contains 1 .sql file, that's good enough - - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - return true; // if 1 child folder contains a .sql file, still good enough - } - - return false; - } - - private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) - { - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - { - writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); - writer.Indent++; - WriteDatabaseFoldersAndFiles(writer, child); - writer.Indent--; - writer.WriteLine("End"); - } - } - foreach (string file in Directory.GetFiles(folder, "*.sql")) - { - writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); - } - } - - private void CleanProject(ProjectNode project) - { - kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - WriteSolution(sol, true); - } - kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - CleanSolution(sol); - } - kernel = null; - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + public abstract class VSGenericTarget : ITarget + { + #region Fields + + readonly Dictionary tools = new Dictionary(); + Kernel kernel; + #endregion + + #region Properties + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public abstract string SolutionVersion { get; } + /// + /// Gets or sets the product version. + /// + /// The product version. + public abstract string ProductVersion { get; } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public abstract string SchemaVersion { get; } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public abstract string VersionName { get; } + /// + /// Gets or sets the version. + /// + /// The version. + public abstract VSVersion Version { get; } + /// + /// Gets the name. + /// + /// The name. + public abstract string Name { get; } + + protected abstract string GetToolsVersionXml(FrameworkVersion version); + public abstract string SolutionTag { get; } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + protected VSGenericTarget() + { + tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); + tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); + tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); + tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); + tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach (ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if (ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch (ArgumentException) + { + kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) + { + SolutionNode node = solution; + + while (node.Parent is SolutionNode) + node = node.Parent as SolutionNode; + + return FindProjectInSolutionRecursively(name, node); + } + + private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) + { + if (solution.ProjectsTable.ContainsKey(name)) + return solution.ProjectsTable[name]; + + foreach (SolutionNode child in solution.Solutions) + { + ProjectNode node = FindProjectInSolutionRecursively(name, child); + if (node != null) + return node; + } + + return null; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if (!tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + #region Project File + using (ps) + { + ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); + ps.WriteLine(" "); + ps.WriteLine(" Local"); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" {0}", SchemaVersion); + ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); + + // Visual Studio has a hard coded guid for the project type + if (project.Type == ProjectType.Web) + ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); + ps.WriteLine(" Debug"); + ps.WriteLine(" {0}", project.AppIcon); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", project.AssemblyName); + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != "") + { + ps.WriteLine(" {0}", conf.Options.KeyFile); + ps.WriteLine(" true"); + break; + } + } + ps.WriteLine(" JScript"); + ps.WriteLine(" Grid"); + ps.WriteLine(" IE50"); + ps.WriteLine(" false"); + ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); + + ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); + ps.WriteLine(" {0}", project.DesignerFolder); + ps.WriteLine(" {0}", project.RootNamespace); + ps.WriteLine(" {0}", project.StartupObject); + if (string.IsNullOrEmpty(project.DebugStartParameters)) + { + ps.WriteLine(" {0}", project.DebugStartParameters); + } + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" ", conf.Name, conf.Platform); + ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); + ps.WriteLine(" {0}", conf.Options["BaseAddress"]); + ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); + ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); + ps.WriteLine(" {0}", conf.Options["DebugInformation"]); + ps.WriteLine(" {0}", conf.Options["FileAlignment"]); + ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); + if (project.Type != ProjectType.Web) + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); + else + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath("bin\\"))); + + ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); + ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); + ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); + ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); + ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); + ps.WriteLine(" {0}", conf.Platform); + ps.WriteLine(" "); + } + + //ps.WriteLine(" "); + + Dictionary projectReferences = new Dictionary(); + List otherReferences = new List(); + + foreach (ReferenceNode refr in project.References) + { + ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); + + if (projectNode == null) + otherReferences.Add(refr); + else + projectReferences.Add(refr, projectNode); + } + // Assembly References + ps.WriteLine(" "); + + foreach (ReferenceNode refr in otherReferences) + { + ps.Write(" "); + ps.Write(" "); + ps.Write(refr.Name); + ps.WriteLine(""); + + if(!String.IsNullOrEmpty(refr.Path)) + { + // Use absolute path to assembly (for determining assembly type) + string absolutePath = Path.Combine(project.FullPath, refr.Path); + if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { + // Assembly is an executable (exe) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); + } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { + // Assembly is an library (dll) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } else { + string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); + kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } + } + + ps.WriteLine(" {0}", refr.LocalCopy); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + //Project References + ps.WriteLine(" "); + foreach (KeyValuePair pair in projectReferences) + { + ToolInfo tool = tools[pair.Value.Language]; + if (tools == null) + throw new UnknownLanguageException(); + + string path = + Helper.MakePathRelativeTo(project.FullPath, + Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); + ps.WriteLine(" ", path); + + // TODO: Allow reference to visual basic projects + ps.WriteLine(" {0}", pair.Value.Name); + ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); + ps.WriteLine(" {0}", tool.Guid.ToUpper()); + + //This is the Copy Local flag in VS + ps.WriteLine(" {0}", pair.Key.LocalCopy); + + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + // ps.WriteLine(" "); + ps.WriteLine(" "); + + // ps.WriteLine(" "); + List list = new List(); + + foreach (string path in project.Files) + { + string lower = path.ToLower(); + if (lower.EndsWith(".resx")) + { + string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); + if (!list.Contains(codebehind)) + list.Add(codebehind); + } + + } + + foreach (string filePath in project.Files) + { + // if (file == "Properties\\Bind.Designer.cs") + // { + // Console.WriteLine("Wait a minute!"); + // Console.WriteLine(project.Files.GetSubType(file).ToString()); + // } + SubType subType = project.Files.GetSubType(filePath); + + // Visual Studio chokes on file names if forward slash is used as a path separator + // instead of backslash. So we must make sure that all file paths written to the + // project file use \ as a path separator. + string file = filePath.Replace(@"/", @"\"); + + if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer + && subType != SubType.CodeBehind) + { + ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ps.WriteLine(" {0}", Path.GetFileName(file)); + ps.WriteLine(" Designer"); + ps.WriteLine(" "); + // + } + + if (subType == SubType.Designer) + { + ps.WriteLine(" ", file); + + string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; + string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; + + // Check for a parent .cs file with the same name as this designer file + if (File.Exists(Helper.NormalizePath(dependent_name))) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" ResXFileCodeGenerator"); + ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); + ps.WriteLine(" " + subType + ""); + } + + ps.WriteLine(" "); + if (File.Exists(Helper.NormalizePath(autogen_name))) + { + ps.WriteLine(" ", autogen_name); + //ps.WriteLine(" True"); + + // If a parent .cs file exists, link this autogen file to it. Otherwise link + // to the designer file + if (File.Exists(dependent_name)) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" True"); + ps.WriteLine(" {0}", Path.GetFileName(filePath)); + } + + ps.WriteLine(" "); + } + list.Add(autogen_name); + } + if (subType == SubType.Settings) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + ps.WriteLine("Include=\"{0}\">", file); + string fileName = Path.GetFileName(filePath); + if (project.Files.GetBuildAction(filePath) == BuildAction.None) + { + ps.WriteLine(" SettingsSingleFileGenerator"); + ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); + } + else + { + ps.WriteLine(" Code"); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); + string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); + ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); + } + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + else if (subType != SubType.Designer) + { + string path = Helper.NormalizePath(file); + string path_lower = path.ToLower(); + + if (!list.Contains(filePath)) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + + int startPos = 0; + if (project.Files.GetPreservePath(filePath)) + { + while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) + startPos++; + + } + else + { + startPos = file.LastIndexOf(Path.GetFileName(path)); + } + + // be sure to write out the path with backslashes so VS recognizes + // the file properly. + ps.WriteLine("Include=\"{0}\">", file); + + int last_period_index = file.LastIndexOf('.'); + string short_file_name = file.Substring(0, last_period_index); + string extension = Path.GetExtension(path); + // make this upper case, so that when File.Exists tests for the + // existence of a designer file on a case-sensitive platform, + // it is correctly identified. + string designer_format = string.Format(".Designer{0}", extension); + + if (path_lower.EndsWith(designer_format.ToLowerInvariant())) + { + int designer_index = path.IndexOf(designer_format); + string file_name = path.Substring(0, designer_index); + + // There are two corrections to the next lines: + // 1. Fix the connection between a designer file and a form + // or usercontrol that don't have an associated resx file. + // 2. Connect settings files to associated designer files. + if (File.Exists(file_name + extension)) + ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); + else if (File.Exists(file_name + ".resx")) + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); + else if (File.Exists(file_name + ".settings")) + { + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + } + } + else if (subType == SubType.CodeBehind) + { + ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); + } + if (project.Files.GetIsLink(filePath)) + { + string alias = project.Files.GetLinkPath(filePath); + alias += file.Substring(startPos); + alias = Helper.NormalizePath(alias); + ps.WriteLine(" {0}", alias); + } + else if (project.Files.GetBuildAction(filePath) != BuildAction.None) + { + if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) + { + ps.WriteLine(" {0}", subType); + } + } + + if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) + { + ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); + } + + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + } + } + + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(""); + } + #endregion + + #region User File + + ps = new StreamWriter(projectFile + ".user"); + using (ps) + { + // Get the first configuration from the project. + ConfigurationNode firstConfiguration = null; + + if (project.Configurations.Count > 0) + { + firstConfiguration = project.Configurations[0]; + } + + ps.WriteLine(""); + //ps.WriteLine( "" ); + //ps.WriteLine(" <{0}>", toolInfo.XMLTag); + //ps.WriteLine(" "); + ps.WriteLine(" "); + //ps.WriteLine(" ", MakeRefPath(project)); + + if (firstConfiguration != null) + { + ps.WriteLine(" {0}", firstConfiguration.Name); + ps.WriteLine(" {0}", firstConfiguration.Platform); + } + + ps.WriteLine(" {0}", MakeRefPath(project)); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" ProjectFiles"); + ps.WriteLine(" 0"); + ps.WriteLine(" "); + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" "); + } + ps.WriteLine(""); + } + #endregion + + kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) + { + kernel.Log.Write("Creating {0} solution and project files", VersionName); + + foreach (SolutionNode child in solution.Solutions) + { + kernel.Log.Write("...Creating folder: {0}", child.Name); + WriteSolution(child, false); + } + + foreach (ProjectNode project in solution.Projects) + { + kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + + foreach (DatabaseProjectNode project in solution.DatabaseProjects) + { + kernel.Log.Write("...Creating database project: {0}", project.Name); + WriteDatabaseProject(solution, project); + } + + if (writeSolutionToDisk) // only write main solution + { + kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + + using (StreamWriter ss = new StreamWriter(solutionFile)) + { + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + ss.WriteLine(SolutionTag); + + WriteProjectDeclarations(ss, solution, solution); + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + WriteConfigurationLines(solution.Configurations, solution, ss); + ss.WriteLine("\tEndGlobalSection"); + + if (solution.Solutions.Count > 0) + { + ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); + foreach (SolutionNode embeddedSolution in solution.Solutions) + { + WriteNestedProjectMap(ss, embeddedSolution); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("EndGlobal"); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + } + + private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) + { + foreach (SolutionNode childSolution in embeddedSolution.Solutions) + { + WriteEmbeddedSolution(writer, childSolution); + WriteProjectDeclarations(writer, actualSolution, childSolution); + } + + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteProject(actualSolution, writer, project); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteProject(actualSolution, writer, dbProject); + } + + if (actualSolution.Guid == embeddedSolution.Guid) + { + WriteSolutionFiles(actualSolution, writer); + } + } + + private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) + { + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteNestedProject(writer, embeddedSolution, project.Guid); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteNestedProject(writer, embeddedSolution, dbProject.Guid); + } + + foreach (SolutionNode child in embeddedSolution.Solutions) + { + WriteNestedProject(writer, embeddedSolution, child.Guid); + WriteNestedProjectMap(writer, child); + } + } + + private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) + { + WriteNestedFolder(writer, solution.Guid, projectGuid); + } + + private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) + { + writer.WriteLine("\t\t{0} = {1}", + childGuid.ToString("B").ToUpper(), + parentGuid.ToString("B").ToUpper()); + } + + private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) + { + foreach (ProjectNode project in solution.Projects) + { + foreach (ConfigurationNode conf in configurations) + { + ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + + ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + } + } + + foreach (SolutionNode child in solution.Solutions) + { + WriteConfigurationLines(configurations, child, ss); + } + } + + private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) + { + if(solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); + } + + private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) + { + WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) + { + WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) + { + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + } + + const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; + const string ProjectDeclarationEndFormat = "EndProject"; + + private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); + + path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); + + WriteProject(ss, language, guid, name, path); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) + { + WriteProject(writer, language, projectGuid, name, location, null); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + writer.WriteLine(ProjectDeclarationBeginFormat, + toolInfo.Guid, + name, + location, + projectGuid.ToString("B").ToUpper()); + + if (files != null) + { + writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); + + foreach (string file in files) + writer.WriteLine("\t\t{0} = {0}", file); + + writer.WriteLine("\tEndProjectSection"); + } + + writer.WriteLine(ProjectDeclarationEndFormat); + } + + private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) + { + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); + IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); + + kernel.CurrentWorkingDirectory.Push(); + + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using (ps) + { + ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); + ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); + ps.Indent++; + ps.WriteLine("MSDTVersion = \"80\""); + // TODO: Use the project.Files property + if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) + WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); + + ps.WriteLine("Begin DBRefFolder = \"Database References\""); + ps.Indent++; + foreach (DatabaseReferenceNode reference in project.References) + { + ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); + ps.Indent++; + ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); + ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); + //ps.WriteLine("Colorizer = 5"); + ps.Indent--; + ps.WriteLine("End"); + } + ps.Indent--; + ps.WriteLine("End"); + ps.Indent--; + ps.WriteLine("End"); + + ps.Flush(); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + + private static bool ContainsSqlFiles(string folder) + { + if(Directory.GetFiles(folder, "*.sql").Length > 0) + return true; // if the folder contains 1 .sql file, that's good enough + + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + return true; // if 1 child folder contains a .sql file, still good enough + } + + return false; + } + + private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) + { + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + { + writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); + writer.Indent++; + WriteDatabaseFoldersAndFiles(writer, child); + writer.Indent--; + writer.WriteLine("End"); + } + } + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); + } + } + + private void CleanProject(ProjectNode project) + { + kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + WriteSolution(sol, true); + } + kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + CleanSolution(sol); + } + kernel = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs index e46b5a5f36..485e4dd724 100644 --- a/Prebuild/src/Core/Targets/AutotoolsTarget.cs +++ b/Prebuild/src/Core/Targets/AutotoolsTarget.cs @@ -1,1070 +1,1070 @@ -#region BSD License -/* - -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Dave Hudson (jendave@yahoo.com), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote -products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -#region MIT X11 license - -/* - Portions of this file authored by Lluis Sanchez Gual - - Copyright (C) 2006 Novell, Inc (http://www.novell.com) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#endregion -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Xsl; -using System.Net; -using System.Diagnostics; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - public enum ClrVersion - { - Default, - Net_1_1, - Net_2_0 - } - - public class SystemPackage - { - string name; - string version; - string description; - string[] assemblies; - bool isInternal; - ClrVersion targetVersion; - - public void Initialize(string name, - string version, - string description, - string[] assemblies, - ClrVersion targetVersion, - bool isInternal) - { - this.isInternal = isInternal; - this.name = name; - this.version = version; - this.assemblies = assemblies; - this.description = description; - this.targetVersion = targetVersion; - } - - public string Name - { - get { return name; } - } - - public string Version - { - get { return version; } - } - - public string Description - { - get { return description; } - } - - public ClrVersion TargetVersion - { - get { return targetVersion; } - } - - // The package is part of the mono SDK - public bool IsCorePackage - { - get { return name == "mono"; } - } - - // The package has been registered by an add-in, and is not installed - // in the system. - public bool IsInternalPackage - { - get { return isInternal; } - } - - public string[] Assemblies - { - get { return assemblies; } - } - - } - - - /// - /// - /// - [Target("autotools")] - public class AutotoolsTarget : ITarget - { - #region Fields - - Kernel m_Kernel; - XmlDocument autotoolsDoc; - XmlUrlResolver xr; - System.Security.Policy.Evidence e; - readonly Dictionary assemblyPathToPackage = new Dictionary(); - readonly Dictionary assemblyFullNameToPath = new Dictionary(); - readonly Dictionary packagesHash = new Dictionary(); - readonly List packages = new List(); - - #endregion - - #region Private Methods - - private static void mkdirDashP(string dirName) - { - DirectoryInfo di = new DirectoryInfo(dirName); - if (di.Exists) - return; - - string parentDirName = System.IO.Path.GetDirectoryName(dirName); - DirectoryInfo parentDi = new DirectoryInfo(parentDirName); - if (!parentDi.Exists) - mkdirDashP(parentDirName); - - di.Create(); - } - - private static void chkMkDir(string dirName) - { - System.IO.DirectoryInfo di = - new System.IO.DirectoryInfo(dirName); - - if (!di.Exists) - di.Create(); - } - - private void transformToFile(string filename, XsltArgumentList argList, string nodeName) - { - // Create an XslTransform for this file - XslTransform templateTransformer = - new XslTransform(); - - // Load up the template - XmlNode templateNode = - autotoolsDoc.SelectSingleNode(nodeName + "/*"); - templateTransformer.Load(templateNode.CreateNavigator(), xr, e); - - // Create a writer for the transformed template - XmlTextWriter templateWriter = - new XmlTextWriter(filename, null); - - // Perform transformation, writing the file - templateTransformer.Transform - (m_Kernel.CurrentDoc, argList, templateWriter, xr); - } - - static string NormalizeAsmName(string name) - { - int i = name.IndexOf(", PublicKeyToken=null"); - if (i != -1) - return name.Substring(0, i).Trim(); - return name; - } - - private void AddAssembly(string assemblyfile, SystemPackage package) - { - if (!File.Exists(assemblyfile)) - return; - - try - { - System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); - assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; - assemblyPathToPackage[assemblyfile] = package; - } - catch - { - } - } - - private static List GetAssembliesWithLibInfo(string line, string file) - { - List references = new List(); - List libdirs = new List(); - List retval = new List(); - foreach (string piece in line.Split(' ')) - { - if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) - { - references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); - } - else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) - { - libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); - } - } - - foreach (string refrnc in references) - { - foreach (string libdir in libdirs) - { - if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) - { - retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); - } - } - } - - return retval; - } - - private static List GetAssembliesWithoutLibInfo(string line, string file) - { - List references = new List(); - foreach (string reference in line.Split(' ')) - { - if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) - { - string final_ref = reference.Substring(3).Trim(); - references.Add(ProcessPiece(final_ref, file)); - } - } - return references; - } - - private static string ProcessPiece(string piece, string pcfile) - { - int start = piece.IndexOf("${"); - if (start == -1) - return piece; - - int end = piece.IndexOf("}"); - if (end == -1) - return piece; - - string variable = piece.Substring(start + 2, end - start - 2); - string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); - return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); - } - - private static string GetVariableFromPkgConfig(string var, string pcfile) - { - ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); - psi.RedirectStandardOutput = true; - psi.UseShellExecute = false; - psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); - Process p = new Process(); - p.StartInfo = psi; - p.Start(); - string ret = p.StandardOutput.ReadToEnd().Trim(); - p.WaitForExit(); - if (String.IsNullOrEmpty(ret)) - return String.Empty; - return ret; - } - - private void ParsePCFile(string pcfile) - { - // Don't register the package twice - string pname = Path.GetFileNameWithoutExtension(pcfile); - if (packagesHash.ContainsKey(pname)) - return; - - List fullassemblies = null; - string version = ""; - string desc = ""; - - SystemPackage package = new SystemPackage(); - - using (StreamReader reader = new StreamReader(pcfile)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - string lowerLine = line.ToLower(); - if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) - { - string choppedLine = line.Substring(5).Trim(); - if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) - { - fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); - } - else - { - fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); - } - } - else if (lowerLine.StartsWith("version:")) - { - // "version:".Length == 8 - version = line.Substring(8).Trim(); - } - else if (lowerLine.StartsWith("description:")) - { - // "description:".Length == 12 - desc = line.Substring(12).Trim(); - } - } - } - - if (fullassemblies == null) - return; - - foreach (string assembly in fullassemblies) - { - AddAssembly(assembly, package); - } - - package.Initialize(pname, - version, - desc, - fullassemblies.ToArray(), - ClrVersion.Default, - false); - packages.Add(package); - packagesHash[pname] = package; - } - - void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) - { - SystemPackage package = new SystemPackage(); - List list = new List(); - - string dir = Path.Combine(prefix, version); - if (!Directory.Exists(dir)) - { - return; - } - - foreach (string assembly in Directory.GetFiles(dir, "*.dll")) - { - AddAssembly(assembly, package); - list.Add(assembly); - } - - package.Initialize("mono", - version, - "The Mono runtime", - list.ToArray(), - ver, - false); - packages.Add(package); - } - - void RunInitialization() - { - string versionDir; - - if (Environment.Version.Major == 1) - { - versionDir = "1.0"; - } - else - { - versionDir = "2.0"; - } - - //Pull up assemblies from the installed mono system. - string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); - - if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) - prefix = Path.Combine(prefix, "mono"); - else - prefix = Path.GetDirectoryName(prefix); - - RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); - RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); - - string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); - string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); - - if (String.IsNullOrEmpty(libpath)) - { - string path_dirs = Environment.GetEnvironmentVariable("PATH"); - foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) - { - if (pathdir == null) - continue; - if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) - { - libpath = Path.Combine(pathdir, ".."); - libpath = Path.Combine(libpath, "lib"); - libpath = Path.Combine(libpath, "pkgconfig"); - break; - } - } - } - search_dirs += Path.PathSeparator + libpath; - if (!string.IsNullOrEmpty(search_dirs)) - { - List scanDirs = new List(); - foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) - { - if (!scanDirs.Contains(potentialDir)) - scanDirs.Add(potentialDir); - } - foreach (string pcdir in scanDirs) - { - if (pcdir == null) - continue; - - if (Directory.Exists(pcdir)) - { - foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) - { - ParsePCFile(pcfile); - } - } - } - } - } - - private void WriteCombine(SolutionNode solution) - { - #region "Create Solution directory if it doesn't exist" - string solutionDir = Path.Combine(solution.FullPath, - Path.Combine("autotools", - solution.Name)); - chkMkDir(solutionDir); - #endregion - - #region "Write Solution-level files" - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("solutionName", "", solution.Name); - // $solutionDir is $rootDir/$solutionName/ - transformToFile(Path.Combine(solutionDir, "configure.ac"), - argList, "/Autotools/SolutionConfigureAc"); - transformToFile(Path.Combine(solutionDir, "Makefile.am"), - argList, "/Autotools/SolutionMakefileAm"); - transformToFile(Path.Combine(solutionDir, "autogen.sh"), - argList, "/Autotools/SolutionAutogenSh"); - #endregion - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - m_Kernel.Log.Write(String.Format("Writing project: {0}", - project.Name)); - WriteProject(solution, project); - } - } - - private static string FindFileReference(string refName, - ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = - Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - if (path == null) - { - return ""; - } - - StringBuilder tmpPath; - - if (Core.Parse.Preprocessor.GetOS() == "Win32") - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath.Replace("/", @"\\"); - } - else - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); - } - return tmpPath.ToString(); - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); - string projectDir = Path.Combine(solutionDir, project.Name); - string projectVersion = project.Version; - bool hasAssemblyConfig = false; - chkMkDir(projectDir); - - List - compiledFiles = new List(), - contentFiles = new List(), - embeddedFiles = new List(), - - binaryLibs = new List(), - pkgLibs = new List(), - systemLibs = new List(), - runtimeLibs = new List(), - - extraDistFiles = new List(), - localCopyTargets = new List(); - - // If there exists a .config file for this assembly, copy - // it to the project folder - - // TODO: Support copying .config.osx files - // TODO: support processing the .config file for native library deps - string projectAssemblyName = project.Name; - if (project.AssemblyName != null) - projectAssemblyName = project.AssemblyName; - - if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) - { - hasAssemblyConfig = true; - System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); - extraDistFiles.Add(project.AssemblyName + ".dll.config"); - } - - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != string.Empty) - { - // Copy snk file into the project's directory - // Use the snk from the project directory directly - string source = Path.Combine(project.FullPath, conf.Options.KeyFile); - string keyFile = conf.Options.KeyFile; - Regex re = new Regex(".*/"); - keyFile = re.Replace(keyFile, ""); - - string dest = Path.Combine(projectDir, keyFile); - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - } - } - - // Copy compiled, embedded and content files into the project's directory - foreach (string filename in project.Files) - { - string source = Path.Combine(project.FullPath, filename); - string dest = Path.Combine(projectDir, filename); - - if (filename.Contains("AssemblyInfo.cs")) - { - // If we've got an AssemblyInfo.cs, pull the version number from it - string[] sources = { source }; - string[] args = { "" }; - Microsoft.CSharp.CSharpCodeProvider cscp = - new Microsoft.CSharp.CSharpCodeProvider(); - - string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); - System.CodeDom.Compiler.CompilerParameters cparam = - new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); - - System.CodeDom.Compiler.CompilerResults cr = - cscp.CompileAssemblyFromFile(cparam, sources); - - foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) - Console.WriteLine("Error! '{0}'", error.ErrorText); - - try { - string projectFullName = cr.CompiledAssembly.FullName; - Regex verRegex = new Regex("Version=([\\d\\.]+)"); - Match verMatch = verRegex.Match(projectFullName); - if (verMatch.Success) - projectVersion = verMatch.Groups[1].Value; - }catch{ - Console.WriteLine("Couldn't compile AssemblyInfo.cs"); - } - - // Clean up the temp file - try - { - if (File.Exists(tempAssemblyFile)) - File.Delete(tempAssemblyFile); - } - catch - { - Console.WriteLine("Error! '{0}'", e); - } - - } - - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - - switch (project.Files.GetBuildAction(filename)) - { - case BuildAction.Compile: - compiledFiles.Add(filename); - break; - case BuildAction.Content: - contentFiles.Add(filename); - extraDistFiles.Add(filename); - break; - case BuildAction.EmbeddedResource: - embeddedFiles.Add(filename); - break; - } - } - - // Set up references - for (int refNum = 0; refNum < project.References.Count; refNum++) - { - ReferenceNode refr = project.References[refNum]; - Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); - - /* Determine which pkg-config (.pc) file refers to - this assembly */ - - SystemPackage package = null; - - if (packagesHash.ContainsKey(refr.Name)) - { - package = packagesHash[refr.Name]; - - } - else - { - string assemblyFullName = string.Empty; - if (refAssembly != null) - assemblyFullName = refAssembly.FullName; - - string assemblyFileName = string.Empty; - if (assemblyFullName != string.Empty && - assemblyFullNameToPath.ContainsKey(assemblyFullName) - ) - assemblyFileName = - assemblyFullNameToPath[assemblyFullName]; - - if (assemblyFileName != string.Empty && - assemblyPathToPackage.ContainsKey(assemblyFileName) - ) - package = assemblyPathToPackage[assemblyFileName]; - - } - - /* If we know the .pc file and it is not "mono" - (already in the path), add a -pkg: argument */ - - if (package != null && - package.Name != "mono" && - !pkgLibs.Contains(package.Name) - ) - pkgLibs.Add(package.Name); - - string fileRef = - FindFileReference(refr.Name, (ProjectNode)refr.Parent); - - if (refr.LocalCopy || - solution.ProjectsTable.ContainsKey(refr.Name) || - fileRef != null || - refr.Path != null - ) - { - - /* Attempt to copy the referenced lib to the - project's directory */ - - string filename = refr.Name + ".dll"; - string source = filename; - if (refr.Path != null) - source = Path.Combine(refr.Path, source); - source = Path.Combine(project.FullPath, source); - string dest = Path.Combine(projectDir, filename); - - /* Since we depend on this binary dll to build, we - * will add a compile- time dependency on the - * copied dll, and add the dll to the list of - * files distributed with this package - */ - - binaryLibs.Add(refr.Name + ".dll"); - extraDistFiles.Add(refr.Name + ".dll"); - - // TODO: Support copying .config.osx files - // TODO: Support for determining native dependencies - if (File.Exists(source + ".config")) - { - System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); - extraDistFiles.Add(refr.Name + ".dll.config"); - } - - try - { - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException) - { - if (solution.ProjectsTable.ContainsKey(refr.Name)){ - - /* If an assembly is referenced, marked for - * local copy, in the list of projects for - * this solution, but does not exist, put a - * target into the Makefile.am to build the - * assembly and copy it to this project's - * directory - */ - - ProjectNode sourcePrj = - ((solution.ProjectsTable[refr.Name])); - - string target = - String.Format("{0}:\n" + - "\t$(MAKE) -C ../{1}\n" + - "\tln ../{2}/$@ $@\n", - filename, - sourcePrj.Name, - sourcePrj.Name ); - - localCopyTargets.Add(target); - } - } - } - else if( !pkgLibs.Contains(refr.Name) ) - { - // Else, let's assume it's in the GAC or the lib path - string assemName = string.Empty; - int index = refr.Name.IndexOf(","); - - if (index > 0) - assemName = refr.Name.Substring(0, index); - else - assemName = refr.Name; - - m_Kernel.Log.Write(String.Format( - "Warning: Couldn't find an appropriate assembly " + - "for reference:\n'{0}'", refr.Name - )); - systemLibs.Add(assemName); - } - } - - const string lineSep = " \\\n\t"; - string compiledFilesString = string.Empty; - if (compiledFiles.Count > 0) - compiledFilesString = - lineSep + string.Join(lineSep, compiledFiles.ToArray()); - - string embeddedFilesString = ""; - if (embeddedFiles.Count > 0) - embeddedFilesString = - lineSep + string.Join(lineSep, embeddedFiles.ToArray()); - - string contentFilesString = ""; - if (contentFiles.Count > 0) - contentFilesString = - lineSep + string.Join(lineSep, contentFiles.ToArray()); - - string extraDistFilesString = ""; - if (extraDistFiles.Count > 0) - extraDistFilesString = - lineSep + string.Join(lineSep, extraDistFiles.ToArray()); - - string pkgLibsString = ""; - if (pkgLibs.Count > 0) - pkgLibsString = - lineSep + string.Join(lineSep, pkgLibs.ToArray()); - - string binaryLibsString = ""; - if (binaryLibs.Count > 0) - binaryLibsString = - lineSep + string.Join(lineSep, binaryLibs.ToArray()); - - string systemLibsString = ""; - if (systemLibs.Count > 0) - systemLibsString = - lineSep + string.Join(lineSep, systemLibs.ToArray()); - - string localCopyTargetsString = ""; - if (localCopyTargets.Count > 0) - localCopyTargetsString = - string.Join("\n", localCopyTargets.ToArray()); - - string monoPath = ""; - foreach (string runtimeLib in runtimeLibs) - { - monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; - } - - // Add the project name to the list of transformation - // parameters - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("projectName", "", project.Name); - argList.AddParam("solutionName", "", solution.Name); - argList.AddParam("assemblyName", "", projectAssemblyName); - argList.AddParam("compiledFiles", "", compiledFilesString); - argList.AddParam("embeddedFiles", "", embeddedFilesString); - argList.AddParam("contentFiles", "", contentFilesString); - argList.AddParam("extraDistFiles", "", extraDistFilesString); - argList.AddParam("pkgLibs", "", pkgLibsString); - argList.AddParam("binaryLibs", "", binaryLibsString); - argList.AddParam("systemLibs", "", systemLibsString); - argList.AddParam("monoPath", "", monoPath); - argList.AddParam("localCopyTargets", "", localCopyTargetsString); - argList.AddParam("projectVersion", "", projectVersion); - argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); - - // Transform the templates - transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); - transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); - transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); - - if (project.Type == Core.Nodes.ProjectType.Library) - transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); - if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) - transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - m_Kernel.Log.Write("Parsing system pkg-config files"); - RunInitialization(); - - const string streamName = "autotools.xml"; - string fqStreamName = String.Format("Prebuild.data.{0}", - streamName - ); - - // Retrieve stream for the autotools template XML - Stream autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(fqStreamName); - - if(autotoolsStream == null) { - - /* - * try without the default namespace prepended, in - * case prebuild.exe assembly was compiled with - * something other than Visual Studio .NET - */ - - autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(streamName); - if(autotoolsStream == null){ - string errStr = - String.Format("Could not find embedded resource file:\n" + - "'{0}' or '{1}'", - streamName, fqStreamName - ); - - m_Kernel.Log.Write(errStr); - - throw new System.Reflection.TargetException(errStr); - } - } - - // Create an XML URL Resolver with default credentials - xr = new System.Xml.XmlUrlResolver(); - xr.Credentials = CredentialCache.DefaultCredentials; - - // Create a default evidence - no need to limit access - e = new System.Security.Policy.Evidence(); - - // Load the autotools XML - autotoolsDoc = new XmlDocument(); - autotoolsDoc.Load(autotoolsStream); - - /* rootDir is the filesystem location where the Autotools - * build tree will be created - for now we'll make it - * $PWD/autotools - */ - - string pwd = Directory.GetCurrentDirectory(); - //string pwd = System.Environment.GetEnvironmentVariable("PWD"); - //if (pwd.Length != 0) - //{ - string rootDir = Path.Combine(pwd, "autotools"); - //} - //else - //{ - // pwd = Assembly.GetExecutingAssembly() - //} - chkMkDir(rootDir); - - foreach (SolutionNode solution in kern.Solutions) - { - m_Kernel.Log.Write(String.Format("Writing solution: {0}", - solution.Name)); - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "autotools"; - } - } - - #endregion - } -} +#region BSD License +/* + +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Dave Hudson (jendave@yahoo.com), +C.J. Adams-Collier (cjac@colliertech.org), + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +#region MIT X11 license + +/* + Portions of this file authored by Lluis Sanchez Gual + + Copyright (C) 2006 Novell, Inc (http://www.novell.com) + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#endregion +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Xsl; +using System.Net; +using System.Diagnostics; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + public enum ClrVersion + { + Default, + Net_1_1, + Net_2_0 + } + + public class SystemPackage + { + string name; + string version; + string description; + string[] assemblies; + bool isInternal; + ClrVersion targetVersion; + + public void Initialize(string name, + string version, + string description, + string[] assemblies, + ClrVersion targetVersion, + bool isInternal) + { + this.isInternal = isInternal; + this.name = name; + this.version = version; + this.assemblies = assemblies; + this.description = description; + this.targetVersion = targetVersion; + } + + public string Name + { + get { return name; } + } + + public string Version + { + get { return version; } + } + + public string Description + { + get { return description; } + } + + public ClrVersion TargetVersion + { + get { return targetVersion; } + } + + // The package is part of the mono SDK + public bool IsCorePackage + { + get { return name == "mono"; } + } + + // The package has been registered by an add-in, and is not installed + // in the system. + public bool IsInternalPackage + { + get { return isInternal; } + } + + public string[] Assemblies + { + get { return assemblies; } + } + + } + + + /// + /// + /// + [Target("autotools")] + public class AutotoolsTarget : ITarget + { + #region Fields + + Kernel m_Kernel; + XmlDocument autotoolsDoc; + XmlUrlResolver xr; + System.Security.Policy.Evidence e; + readonly Dictionary assemblyPathToPackage = new Dictionary(); + readonly Dictionary assemblyFullNameToPath = new Dictionary(); + readonly Dictionary packagesHash = new Dictionary(); + readonly List packages = new List(); + + #endregion + + #region Private Methods + + private static void mkdirDashP(string dirName) + { + DirectoryInfo di = new DirectoryInfo(dirName); + if (di.Exists) + return; + + string parentDirName = System.IO.Path.GetDirectoryName(dirName); + DirectoryInfo parentDi = new DirectoryInfo(parentDirName); + if (!parentDi.Exists) + mkdirDashP(parentDirName); + + di.Create(); + } + + private static void chkMkDir(string dirName) + { + System.IO.DirectoryInfo di = + new System.IO.DirectoryInfo(dirName); + + if (!di.Exists) + di.Create(); + } + + private void transformToFile(string filename, XsltArgumentList argList, string nodeName) + { + // Create an XslTransform for this file + XslTransform templateTransformer = + new XslTransform(); + + // Load up the template + XmlNode templateNode = + autotoolsDoc.SelectSingleNode(nodeName + "/*"); + templateTransformer.Load(templateNode.CreateNavigator(), xr, e); + + // Create a writer for the transformed template + XmlTextWriter templateWriter = + new XmlTextWriter(filename, null); + + // Perform transformation, writing the file + templateTransformer.Transform + (m_Kernel.CurrentDoc, argList, templateWriter, xr); + } + + static string NormalizeAsmName(string name) + { + int i = name.IndexOf(", PublicKeyToken=null"); + if (i != -1) + return name.Substring(0, i).Trim(); + return name; + } + + private void AddAssembly(string assemblyfile, SystemPackage package) + { + if (!File.Exists(assemblyfile)) + return; + + try + { + System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); + assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; + assemblyPathToPackage[assemblyfile] = package; + } + catch + { + } + } + + private static List GetAssembliesWithLibInfo(string line, string file) + { + List references = new List(); + List libdirs = new List(); + List retval = new List(); + foreach (string piece in line.Split(' ')) + { + if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) + { + references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); + } + else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) + { + libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); + } + } + + foreach (string refrnc in references) + { + foreach (string libdir in libdirs) + { + if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) + { + retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); + } + } + } + + return retval; + } + + private static List GetAssembliesWithoutLibInfo(string line, string file) + { + List references = new List(); + foreach (string reference in line.Split(' ')) + { + if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) + { + string final_ref = reference.Substring(3).Trim(); + references.Add(ProcessPiece(final_ref, file)); + } + } + return references; + } + + private static string ProcessPiece(string piece, string pcfile) + { + int start = piece.IndexOf("${"); + if (start == -1) + return piece; + + int end = piece.IndexOf("}"); + if (end == -1) + return piece; + + string variable = piece.Substring(start + 2, end - start - 2); + string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); + return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); + } + + private static string GetVariableFromPkgConfig(string var, string pcfile) + { + ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); + psi.RedirectStandardOutput = true; + psi.UseShellExecute = false; + psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); + Process p = new Process(); + p.StartInfo = psi; + p.Start(); + string ret = p.StandardOutput.ReadToEnd().Trim(); + p.WaitForExit(); + if (String.IsNullOrEmpty(ret)) + return String.Empty; + return ret; + } + + private void ParsePCFile(string pcfile) + { + // Don't register the package twice + string pname = Path.GetFileNameWithoutExtension(pcfile); + if (packagesHash.ContainsKey(pname)) + return; + + List fullassemblies = null; + string version = ""; + string desc = ""; + + SystemPackage package = new SystemPackage(); + + using (StreamReader reader = new StreamReader(pcfile)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + string lowerLine = line.ToLower(); + if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) + { + string choppedLine = line.Substring(5).Trim(); + if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) + { + fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); + } + else + { + fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); + } + } + else if (lowerLine.StartsWith("version:")) + { + // "version:".Length == 8 + version = line.Substring(8).Trim(); + } + else if (lowerLine.StartsWith("description:")) + { + // "description:".Length == 12 + desc = line.Substring(12).Trim(); + } + } + } + + if (fullassemblies == null) + return; + + foreach (string assembly in fullassemblies) + { + AddAssembly(assembly, package); + } + + package.Initialize(pname, + version, + desc, + fullassemblies.ToArray(), + ClrVersion.Default, + false); + packages.Add(package); + packagesHash[pname] = package; + } + + void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) + { + SystemPackage package = new SystemPackage(); + List list = new List(); + + string dir = Path.Combine(prefix, version); + if (!Directory.Exists(dir)) + { + return; + } + + foreach (string assembly in Directory.GetFiles(dir, "*.dll")) + { + AddAssembly(assembly, package); + list.Add(assembly); + } + + package.Initialize("mono", + version, + "The Mono runtime", + list.ToArray(), + ver, + false); + packages.Add(package); + } + + void RunInitialization() + { + string versionDir; + + if (Environment.Version.Major == 1) + { + versionDir = "1.0"; + } + else + { + versionDir = "2.0"; + } + + //Pull up assemblies from the installed mono system. + string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); + + if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) + prefix = Path.Combine(prefix, "mono"); + else + prefix = Path.GetDirectoryName(prefix); + + RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); + RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); + + string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); + string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); + + if (String.IsNullOrEmpty(libpath)) + { + string path_dirs = Environment.GetEnvironmentVariable("PATH"); + foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) + { + if (pathdir == null) + continue; + if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) + { + libpath = Path.Combine(pathdir, ".."); + libpath = Path.Combine(libpath, "lib"); + libpath = Path.Combine(libpath, "pkgconfig"); + break; + } + } + } + search_dirs += Path.PathSeparator + libpath; + if (!string.IsNullOrEmpty(search_dirs)) + { + List scanDirs = new List(); + foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) + { + if (!scanDirs.Contains(potentialDir)) + scanDirs.Add(potentialDir); + } + foreach (string pcdir in scanDirs) + { + if (pcdir == null) + continue; + + if (Directory.Exists(pcdir)) + { + foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) + { + ParsePCFile(pcfile); + } + } + } + } + } + + private void WriteCombine(SolutionNode solution) + { + #region "Create Solution directory if it doesn't exist" + string solutionDir = Path.Combine(solution.FullPath, + Path.Combine("autotools", + solution.Name)); + chkMkDir(solutionDir); + #endregion + + #region "Write Solution-level files" + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("solutionName", "", solution.Name); + // $solutionDir is $rootDir/$solutionName/ + transformToFile(Path.Combine(solutionDir, "configure.ac"), + argList, "/Autotools/SolutionConfigureAc"); + transformToFile(Path.Combine(solutionDir, "Makefile.am"), + argList, "/Autotools/SolutionMakefileAm"); + transformToFile(Path.Combine(solutionDir, "autogen.sh"), + argList, "/Autotools/SolutionAutogenSh"); + #endregion + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + m_Kernel.Log.Write(String.Format("Writing project: {0}", + project.Name)); + WriteProject(solution, project); + } + } + + private static string FindFileReference(string refName, + ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = + Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + if (path == null) + { + return ""; + } + + StringBuilder tmpPath; + + if (Core.Parse.Preprocessor.GetOS() == "Win32") + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath.Replace("/", @"\\"); + } + else + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); + } + return tmpPath.ToString(); + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); + string projectDir = Path.Combine(solutionDir, project.Name); + string projectVersion = project.Version; + bool hasAssemblyConfig = false; + chkMkDir(projectDir); + + List + compiledFiles = new List(), + contentFiles = new List(), + embeddedFiles = new List(), + + binaryLibs = new List(), + pkgLibs = new List(), + systemLibs = new List(), + runtimeLibs = new List(), + + extraDistFiles = new List(), + localCopyTargets = new List(); + + // If there exists a .config file for this assembly, copy + // it to the project folder + + // TODO: Support copying .config.osx files + // TODO: support processing the .config file for native library deps + string projectAssemblyName = project.Name; + if (project.AssemblyName != null) + projectAssemblyName = project.AssemblyName; + + if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) + { + hasAssemblyConfig = true; + System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); + extraDistFiles.Add(project.AssemblyName + ".dll.config"); + } + + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != string.Empty) + { + // Copy snk file into the project's directory + // Use the snk from the project directory directly + string source = Path.Combine(project.FullPath, conf.Options.KeyFile); + string keyFile = conf.Options.KeyFile; + Regex re = new Regex(".*/"); + keyFile = re.Replace(keyFile, ""); + + string dest = Path.Combine(projectDir, keyFile); + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + } + } + + // Copy compiled, embedded and content files into the project's directory + foreach (string filename in project.Files) + { + string source = Path.Combine(project.FullPath, filename); + string dest = Path.Combine(projectDir, filename); + + if (filename.Contains("AssemblyInfo.cs")) + { + // If we've got an AssemblyInfo.cs, pull the version number from it + string[] sources = { source }; + string[] args = { "" }; + Microsoft.CSharp.CSharpCodeProvider cscp = + new Microsoft.CSharp.CSharpCodeProvider(); + + string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); + System.CodeDom.Compiler.CompilerParameters cparam = + new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); + + System.CodeDom.Compiler.CompilerResults cr = + cscp.CompileAssemblyFromFile(cparam, sources); + + foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) + Console.WriteLine("Error! '{0}'", error.ErrorText); + + try { + string projectFullName = cr.CompiledAssembly.FullName; + Regex verRegex = new Regex("Version=([\\d\\.]+)"); + Match verMatch = verRegex.Match(projectFullName); + if (verMatch.Success) + projectVersion = verMatch.Groups[1].Value; + }catch{ + Console.WriteLine("Couldn't compile AssemblyInfo.cs"); + } + + // Clean up the temp file + try + { + if (File.Exists(tempAssemblyFile)) + File.Delete(tempAssemblyFile); + } + catch + { + Console.WriteLine("Error! '{0}'", e); + } + + } + + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + + switch (project.Files.GetBuildAction(filename)) + { + case BuildAction.Compile: + compiledFiles.Add(filename); + break; + case BuildAction.Content: + contentFiles.Add(filename); + extraDistFiles.Add(filename); + break; + case BuildAction.EmbeddedResource: + embeddedFiles.Add(filename); + break; + } + } + + // Set up references + for (int refNum = 0; refNum < project.References.Count; refNum++) + { + ReferenceNode refr = project.References[refNum]; + Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); + + /* Determine which pkg-config (.pc) file refers to + this assembly */ + + SystemPackage package = null; + + if (packagesHash.ContainsKey(refr.Name)) + { + package = packagesHash[refr.Name]; + + } + else + { + string assemblyFullName = string.Empty; + if (refAssembly != null) + assemblyFullName = refAssembly.FullName; + + string assemblyFileName = string.Empty; + if (assemblyFullName != string.Empty && + assemblyFullNameToPath.ContainsKey(assemblyFullName) + ) + assemblyFileName = + assemblyFullNameToPath[assemblyFullName]; + + if (assemblyFileName != string.Empty && + assemblyPathToPackage.ContainsKey(assemblyFileName) + ) + package = assemblyPathToPackage[assemblyFileName]; + + } + + /* If we know the .pc file and it is not "mono" + (already in the path), add a -pkg: argument */ + + if (package != null && + package.Name != "mono" && + !pkgLibs.Contains(package.Name) + ) + pkgLibs.Add(package.Name); + + string fileRef = + FindFileReference(refr.Name, (ProjectNode)refr.Parent); + + if (refr.LocalCopy || + solution.ProjectsTable.ContainsKey(refr.Name) || + fileRef != null || + refr.Path != null + ) + { + + /* Attempt to copy the referenced lib to the + project's directory */ + + string filename = refr.Name + ".dll"; + string source = filename; + if (refr.Path != null) + source = Path.Combine(refr.Path, source); + source = Path.Combine(project.FullPath, source); + string dest = Path.Combine(projectDir, filename); + + /* Since we depend on this binary dll to build, we + * will add a compile- time dependency on the + * copied dll, and add the dll to the list of + * files distributed with this package + */ + + binaryLibs.Add(refr.Name + ".dll"); + extraDistFiles.Add(refr.Name + ".dll"); + + // TODO: Support copying .config.osx files + // TODO: Support for determining native dependencies + if (File.Exists(source + ".config")) + { + System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); + extraDistFiles.Add(refr.Name + ".dll.config"); + } + + try + { + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException) + { + if (solution.ProjectsTable.ContainsKey(refr.Name)){ + + /* If an assembly is referenced, marked for + * local copy, in the list of projects for + * this solution, but does not exist, put a + * target into the Makefile.am to build the + * assembly and copy it to this project's + * directory + */ + + ProjectNode sourcePrj = + ((solution.ProjectsTable[refr.Name])); + + string target = + String.Format("{0}:\n" + + "\t$(MAKE) -C ../{1}\n" + + "\tln ../{2}/$@ $@\n", + filename, + sourcePrj.Name, + sourcePrj.Name ); + + localCopyTargets.Add(target); + } + } + } + else if( !pkgLibs.Contains(refr.Name) ) + { + // Else, let's assume it's in the GAC or the lib path + string assemName = string.Empty; + int index = refr.Name.IndexOf(","); + + if (index > 0) + assemName = refr.Name.Substring(0, index); + else + assemName = refr.Name; + + m_Kernel.Log.Write(String.Format( + "Warning: Couldn't find an appropriate assembly " + + "for reference:\n'{0}'", refr.Name + )); + systemLibs.Add(assemName); + } + } + + const string lineSep = " \\\n\t"; + string compiledFilesString = string.Empty; + if (compiledFiles.Count > 0) + compiledFilesString = + lineSep + string.Join(lineSep, compiledFiles.ToArray()); + + string embeddedFilesString = ""; + if (embeddedFiles.Count > 0) + embeddedFilesString = + lineSep + string.Join(lineSep, embeddedFiles.ToArray()); + + string contentFilesString = ""; + if (contentFiles.Count > 0) + contentFilesString = + lineSep + string.Join(lineSep, contentFiles.ToArray()); + + string extraDistFilesString = ""; + if (extraDistFiles.Count > 0) + extraDistFilesString = + lineSep + string.Join(lineSep, extraDistFiles.ToArray()); + + string pkgLibsString = ""; + if (pkgLibs.Count > 0) + pkgLibsString = + lineSep + string.Join(lineSep, pkgLibs.ToArray()); + + string binaryLibsString = ""; + if (binaryLibs.Count > 0) + binaryLibsString = + lineSep + string.Join(lineSep, binaryLibs.ToArray()); + + string systemLibsString = ""; + if (systemLibs.Count > 0) + systemLibsString = + lineSep + string.Join(lineSep, systemLibs.ToArray()); + + string localCopyTargetsString = ""; + if (localCopyTargets.Count > 0) + localCopyTargetsString = + string.Join("\n", localCopyTargets.ToArray()); + + string monoPath = ""; + foreach (string runtimeLib in runtimeLibs) + { + monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; + } + + // Add the project name to the list of transformation + // parameters + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("projectName", "", project.Name); + argList.AddParam("solutionName", "", solution.Name); + argList.AddParam("assemblyName", "", projectAssemblyName); + argList.AddParam("compiledFiles", "", compiledFilesString); + argList.AddParam("embeddedFiles", "", embeddedFilesString); + argList.AddParam("contentFiles", "", contentFilesString); + argList.AddParam("extraDistFiles", "", extraDistFilesString); + argList.AddParam("pkgLibs", "", pkgLibsString); + argList.AddParam("binaryLibs", "", binaryLibsString); + argList.AddParam("systemLibs", "", systemLibsString); + argList.AddParam("monoPath", "", monoPath); + argList.AddParam("localCopyTargets", "", localCopyTargetsString); + argList.AddParam("projectVersion", "", projectVersion); + argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); + + // Transform the templates + transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); + transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); + transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); + + if (project.Type == Core.Nodes.ProjectType.Library) + transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); + if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) + transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + m_Kernel.Log.Write("Parsing system pkg-config files"); + RunInitialization(); + + const string streamName = "autotools.xml"; + string fqStreamName = String.Format("Prebuild.data.{0}", + streamName + ); + + // Retrieve stream for the autotools template XML + Stream autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(fqStreamName); + + if(autotoolsStream == null) { + + /* + * try without the default namespace prepended, in + * case prebuild.exe assembly was compiled with + * something other than Visual Studio .NET + */ + + autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(streamName); + if(autotoolsStream == null){ + string errStr = + String.Format("Could not find embedded resource file:\n" + + "'{0}' or '{1}'", + streamName, fqStreamName + ); + + m_Kernel.Log.Write(errStr); + + throw new System.Reflection.TargetException(errStr); + } + } + + // Create an XML URL Resolver with default credentials + xr = new System.Xml.XmlUrlResolver(); + xr.Credentials = CredentialCache.DefaultCredentials; + + // Create a default evidence - no need to limit access + e = new System.Security.Policy.Evidence(); + + // Load the autotools XML + autotoolsDoc = new XmlDocument(); + autotoolsDoc.Load(autotoolsStream); + + /* rootDir is the filesystem location where the Autotools + * build tree will be created - for now we'll make it + * $PWD/autotools + */ + + string pwd = Directory.GetCurrentDirectory(); + //string pwd = System.Environment.GetEnvironmentVariable("PWD"); + //if (pwd.Length != 0) + //{ + string rootDir = Path.Combine(pwd, "autotools"); + //} + //else + //{ + // pwd = Assembly.GetExecutingAssembly() + //} + chkMkDir(rootDir); + + foreach (SolutionNode solution in kern.Solutions) + { + m_Kernel.Log.Write(String.Format("Writing solution: {0}", + solution.Name)); + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "autotools"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs index ea9f736475..b16120c389 100644 --- a/Prebuild/src/Core/Targets/VS2010Target.cs +++ b/Prebuild/src/Core/Targets/VS2010Target.cs @@ -1,138 +1,138 @@ -using System; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - [Target("vs2010")] - public class VS2010Target : VSGenericTarget - { - #region Fields - - string solutionVersion = "11.00"; - string productVersion = "9.0.30729"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2010"; - string name = "vs2010"; - VSVersion version = VSVersion.VS10; - - #endregion - - #region Properties - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v4_0: - case FrameworkVersion.v3_5: - return "ToolsVersion=\"4.0\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2010"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2010Target() - : base() - { - } - - #endregion - } -} +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2010")] + public class VS2010Target : VSGenericTarget + { + #region Fields + + string solutionVersion = "11.00"; + string productVersion = "9.0.30729"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2010"; + string name = "vs2010"; + VSVersion version = VSVersion.VS10; + + #endregion + + #region Properties + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v4_0: + case FrameworkVersion.v3_5: + return "ToolsVersion=\"4.0\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2010"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2010Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs index 6969dd7323..cd3f5bbe1d 100644 --- a/Prebuild/src/Core/Targets/VSGenericTarget.cs +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs @@ -1,922 +1,922 @@ -#region BSD License -/* -Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - public abstract class VSGenericTarget : ITarget - { - #region Fields - - readonly Dictionary tools = new Dictionary(); - Kernel kernel; - #endregion - - #region Properties - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public abstract string SolutionVersion { get; } - /// - /// Gets or sets the product version. - /// - /// The product version. - public abstract string ProductVersion { get; } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public abstract string SchemaVersion { get; } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public abstract string VersionName { get; } - /// - /// Gets or sets the version. - /// - /// The version. - public abstract VSVersion Version { get; } - /// - /// Gets the name. - /// - /// The name. - public abstract string Name { get; } - - protected abstract string GetToolsVersionXml(FrameworkVersion version); - public abstract string SolutionTag { get; } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - protected VSGenericTarget() - { - tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); - tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); - tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); - tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); - tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach (ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if (ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch (ArgumentException) - { - kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) - { - SolutionNode node = solution; - - while (node.Parent is SolutionNode) - node = node.Parent as SolutionNode; - - return FindProjectInSolutionRecursively(name, node); - } - - private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) - { - if (solution.ProjectsTable.ContainsKey(name)) - return solution.ProjectsTable[name]; - - foreach (SolutionNode child in solution.Solutions) - { - ProjectNode node = FindProjectInSolutionRecursively(name, child); - if (node != null) - return node; - } - - return null; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if (!tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - #region Project File - using (ps) - { - ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); - ps.WriteLine(" "); - ps.WriteLine(" Local"); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" {0}", SchemaVersion); - ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); - - // Visual Studio has a hard coded guid for the project type - if (project.Type == ProjectType.Web) - ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); - ps.WriteLine(" Debug"); - ps.WriteLine(" {0}", project.AppIcon); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", project.AssemblyName); - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ps.WriteLine(" {0}", conf.Options.KeyFile); - ps.WriteLine(" true"); - break; - } - } - ps.WriteLine(" JScript"); - ps.WriteLine(" Grid"); - ps.WriteLine(" IE50"); - ps.WriteLine(" false"); - ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); - - ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); - ps.WriteLine(" {0}", project.DesignerFolder); - ps.WriteLine(" {0}", project.RootNamespace); - ps.WriteLine(" {0}", project.StartupObject); - if (string.IsNullOrEmpty(project.DebugStartParameters)) - { - ps.WriteLine(" {0}", project.DebugStartParameters); - } - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" ", conf.Name, conf.Platform); - ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); - ps.WriteLine(" {0}", conf.Options["BaseAddress"]); - ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); - ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); - ps.WriteLine(" {0}", conf.Options["DebugInformation"]); - ps.WriteLine(" {0}", conf.Options["FileAlignment"]); - ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); - if (project.Type != ProjectType.Web) - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); - else - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath("bin\\"))); - - ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); - ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); - ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); - ps.WriteLine(" {0}", conf.Options["WarningLevel"]); - ps.WriteLine(" {0}", conf.Options["NoStdLib"]); - ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); - ps.WriteLine(" {0}", conf.Platform); - ps.WriteLine(" "); - } - - //ps.WriteLine(" "); - - Dictionary projectReferences = new Dictionary(); - List otherReferences = new List(); - - foreach (ReferenceNode refr in project.References) - { - ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); - - if (projectNode == null) - otherReferences.Add(refr); - else - projectReferences.Add(refr, projectNode); - } - // Assembly References - ps.WriteLine(" "); - - foreach (ReferenceNode refr in otherReferences) - { - ps.Write(" "); - ps.Write(" "); - ps.Write(refr.Name); - ps.WriteLine(""); - - if(!String.IsNullOrEmpty(refr.Path)) - { - // Use absolute path to assembly (for determining assembly type) - string absolutePath = Path.Combine(project.FullPath, refr.Path); - if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { - // Assembly is an executable (exe) - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); - } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { - // Assembly is an library (dll) - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); - } else { - string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); - kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); - } - } - - ps.WriteLine(" {0}", refr.LocalCopy); - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - //Project References - ps.WriteLine(" "); - foreach (KeyValuePair pair in projectReferences) - { - ToolInfo tool = tools[pair.Value.Language]; - if (tools == null) - throw new UnknownLanguageException(); - - string path = - Helper.MakePathRelativeTo(project.FullPath, - Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); - ps.WriteLine(" ", path); - - // TODO: Allow reference to visual basic projects - ps.WriteLine(" {0}", pair.Value.Name); - ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); - ps.WriteLine(" {0}", tool.Guid.ToUpper()); - - //This is the Copy Local flag in VS - ps.WriteLine(" {0}", pair.Key.LocalCopy); - - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ps.WriteLine(" "); - - // ps.WriteLine(" "); - List list = new List(); - - foreach (string path in project.Files) - { - string lower = path.ToLower(); - if (lower.EndsWith(".resx")) - { - string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); - if (!list.Contains(codebehind)) - list.Add(codebehind); - } - - } - - foreach (string filePath in project.Files) - { - // if (file == "Properties\\Bind.Designer.cs") - // { - // Console.WriteLine("Wait a minute!"); - // Console.WriteLine(project.Files.GetSubType(file).ToString()); - // } - SubType subType = project.Files.GetSubType(filePath); - - // Visual Studio chokes on file names if forward slash is used as a path separator - // instead of backslash. So we must make sure that all file paths written to the - // project file use \ as a path separator. - string file = filePath.Replace(@"/", @"\"); - - if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer - && subType != SubType.CodeBehind) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ps.WriteLine(" {0}", Path.GetFileName(file)); - ps.WriteLine(" Designer"); - ps.WriteLine(" "); - // - } - - if (subType == SubType.Designer) - { - ps.WriteLine(" ", file); - - string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; - string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; - - // Check for a parent .cs file with the same name as this designer file - if (File.Exists(Helper.NormalizePath(dependent_name))) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" ResXFileCodeGenerator"); - ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); - ps.WriteLine(" " + subType + ""); - } - - ps.WriteLine(" "); - if (File.Exists(Helper.NormalizePath(autogen_name))) - { - ps.WriteLine(" ", autogen_name); - //ps.WriteLine(" True"); - - // If a parent .cs file exists, link this autogen file to it. Otherwise link - // to the designer file - if (File.Exists(dependent_name)) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" True"); - ps.WriteLine(" {0}", Path.GetFileName(filePath)); - } - - ps.WriteLine(" "); - } - list.Add(autogen_name); - } - if (subType == SubType.Settings) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - ps.WriteLine("Include=\"{0}\">", file); - string fileName = Path.GetFileName(filePath); - if (project.Files.GetBuildAction(filePath) == BuildAction.None) - { - ps.WriteLine(" SettingsSingleFileGenerator"); - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - else - { - ps.WriteLine(" Code"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); - string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); - ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); - } - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - else if (subType != SubType.Designer) - { - string path = Helper.NormalizePath(file); - string path_lower = path.ToLower(); - - if (!list.Contains(filePath)) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - - int startPos = 0; - if (project.Files.GetPreservePath(filePath)) - { - while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) - startPos++; - - } - else - { - startPos = file.LastIndexOf(Path.GetFileName(path)); - } - - // be sure to write out the path with backslashes so VS recognizes - // the file properly. - ps.WriteLine("Include=\"{0}\">", file); - - int last_period_index = file.LastIndexOf('.'); - string short_file_name = file.Substring(0, last_period_index); - string extension = Path.GetExtension(path); - // make this upper case, so that when File.Exists tests for the - // existence of a designer file on a case-sensitive platform, - // it is correctly identified. - string designer_format = string.Format(".Designer{0}", extension); - - if (path_lower.EndsWith(designer_format.ToLowerInvariant())) - { - int designer_index = path.IndexOf(designer_format); - string file_name = path.Substring(0, designer_index); - - // There are two corrections to the next lines: - // 1. Fix the connection between a designer file and a form - // or usercontrol that don't have an associated resx file. - // 2. Connect settings files to associated designer files. - if (File.Exists(file_name + extension)) - ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); - else if (File.Exists(file_name + ".resx")) - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); - else if (File.Exists(file_name + ".settings")) - { - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - } - } - else if (subType == SubType.CodeBehind) - { - ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); - } - if (project.Files.GetIsLink(filePath)) - { - string alias = project.Files.GetLinkPath(filePath); - alias += file.Substring(startPos); - alias = Helper.NormalizePath(alias); - ps.WriteLine(" {0}", alias); - } - else if (project.Files.GetBuildAction(filePath) != BuildAction.None) - { - if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) - { - ps.WriteLine(" {0}", subType); - } - } - - if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) - { - ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); - } - - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - } - } - - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(""); - } - #endregion - - #region User File - - ps = new StreamWriter(projectFile + ".user"); - using (ps) - { - // Get the first configuration from the project. - ConfigurationNode firstConfiguration = null; - - if (project.Configurations.Count > 0) - { - firstConfiguration = project.Configurations[0]; - } - - ps.WriteLine(""); - //ps.WriteLine( "" ); - //ps.WriteLine(" <{0}>", toolInfo.XMLTag); - //ps.WriteLine(" "); - ps.WriteLine(" "); - //ps.WriteLine(" ", MakeRefPath(project)); - - if (firstConfiguration != null) - { - ps.WriteLine(" {0}", firstConfiguration.Name); - ps.WriteLine(" {0}", firstConfiguration.Platform); - } - - ps.WriteLine(" {0}", MakeRefPath(project)); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" ProjectFiles"); - ps.WriteLine(" 0"); - ps.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" "); - } - ps.WriteLine(""); - } - #endregion - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) - { - kernel.Log.Write("Creating {0} solution and project files", VersionName); - - foreach (SolutionNode child in solution.Solutions) - { - kernel.Log.Write("...Creating folder: {0}", child.Name); - WriteSolution(child, false); - } - - foreach (ProjectNode project in solution.Projects) - { - kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - - foreach (DatabaseProjectNode project in solution.DatabaseProjects) - { - kernel.Log.Write("...Creating database project: {0}", project.Name); - WriteDatabaseProject(solution, project); - } - - if (writeSolutionToDisk) // only write main solution - { - kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - - using (StreamWriter ss = new StreamWriter(solutionFile)) - { - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); - ss.WriteLine(SolutionTag); - - WriteProjectDeclarations(ss, solution, solution); - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); - WriteConfigurationLines(solution.Configurations, solution, ss); - ss.WriteLine("\tEndGlobalSection"); - - if (solution.Solutions.Count > 0) - { - ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); - foreach (SolutionNode embeddedSolution in solution.Solutions) - { - WriteNestedProjectMap(ss, embeddedSolution); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("EndGlobal"); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - } - - private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) - { - foreach (SolutionNode childSolution in embeddedSolution.Solutions) - { - WriteEmbeddedSolution(writer, childSolution); - WriteProjectDeclarations(writer, actualSolution, childSolution); - } - - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteProject(actualSolution, writer, project); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteProject(actualSolution, writer, dbProject); - } - - if (actualSolution.Guid == embeddedSolution.Guid) - { - WriteSolutionFiles(actualSolution, writer); - } - } - - private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) - { - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteNestedProject(writer, embeddedSolution, project.Guid); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteNestedProject(writer, embeddedSolution, dbProject.Guid); - } - - foreach (SolutionNode child in embeddedSolution.Solutions) - { - WriteNestedProject(writer, embeddedSolution, child.Guid); - WriteNestedProjectMap(writer, child); - } - } - - private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) - { - WriteNestedFolder(writer, solution.Guid, projectGuid); - } - - private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) - { - writer.WriteLine("\t\t{0} = {1}", - childGuid.ToString("B").ToUpper(), - parentGuid.ToString("B").ToUpper()); - } - - private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) - { - foreach (ProjectNode project in solution.Projects) - { - foreach (ConfigurationNode conf in configurations) - { - ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - - ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - } - } - - foreach (SolutionNode child in solution.Solutions) - { - WriteConfigurationLines(configurations, child, ss); - } - } - - private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) - { - if(solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); - } - - private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) - { - WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) - { - WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) - { - if (solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); - } - - const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; - const string ProjectDeclarationEndFormat = "EndProject"; - - private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); - - path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); - - WriteProject(ss, language, guid, name, path); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) - { - WriteProject(writer, language, projectGuid, name, location, null); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - writer.WriteLine(ProjectDeclarationBeginFormat, - toolInfo.Guid, - name, - location, - projectGuid.ToString("B").ToUpper()); - - if (files != null) - { - writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); - - foreach (string file in files) - writer.WriteLine("\t\t{0} = {0}", file); - - writer.WriteLine("\tEndProjectSection"); - } - - writer.WriteLine(ProjectDeclarationEndFormat); - } - - private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) - { - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); - IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); - - kernel.CurrentWorkingDirectory.Push(); - - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - using (ps) - { - ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); - ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); - ps.Indent++; - ps.WriteLine("MSDTVersion = \"80\""); - // TODO: Use the project.Files property - if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) - WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); - - ps.WriteLine("Begin DBRefFolder = \"Database References\""); - ps.Indent++; - foreach (DatabaseReferenceNode reference in project.References) - { - ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); - ps.Indent++; - ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); - ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); - //ps.WriteLine("Colorizer = 5"); - ps.Indent--; - ps.WriteLine("End"); - } - ps.Indent--; - ps.WriteLine("End"); - ps.Indent--; - ps.WriteLine("End"); - - ps.Flush(); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - - private static bool ContainsSqlFiles(string folder) - { - if(Directory.GetFiles(folder, "*.sql").Length > 0) - return true; // if the folder contains 1 .sql file, that's good enough - - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - return true; // if 1 child folder contains a .sql file, still good enough - } - - return false; - } - - private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) - { - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - { - writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); - writer.Indent++; - WriteDatabaseFoldersAndFiles(writer, child); - writer.Indent--; - writer.WriteLine("End"); - } - } - foreach (string file in Directory.GetFiles(folder, "*.sql")) - { - writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); - } - } - - private void CleanProject(ProjectNode project) - { - kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - WriteSolution(sol, true); - } - kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - CleanSolution(sol); - } - kernel = null; - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + public abstract class VSGenericTarget : ITarget + { + #region Fields + + readonly Dictionary tools = new Dictionary(); + Kernel kernel; + #endregion + + #region Properties + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public abstract string SolutionVersion { get; } + /// + /// Gets or sets the product version. + /// + /// The product version. + public abstract string ProductVersion { get; } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public abstract string SchemaVersion { get; } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public abstract string VersionName { get; } + /// + /// Gets or sets the version. + /// + /// The version. + public abstract VSVersion Version { get; } + /// + /// Gets the name. + /// + /// The name. + public abstract string Name { get; } + + protected abstract string GetToolsVersionXml(FrameworkVersion version); + public abstract string SolutionTag { get; } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + protected VSGenericTarget() + { + tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); + tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); + tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); + tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); + tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach (ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if (ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch (ArgumentException) + { + kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) + { + SolutionNode node = solution; + + while (node.Parent is SolutionNode) + node = node.Parent as SolutionNode; + + return FindProjectInSolutionRecursively(name, node); + } + + private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) + { + if (solution.ProjectsTable.ContainsKey(name)) + return solution.ProjectsTable[name]; + + foreach (SolutionNode child in solution.Solutions) + { + ProjectNode node = FindProjectInSolutionRecursively(name, child); + if (node != null) + return node; + } + + return null; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if (!tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + #region Project File + using (ps) + { + ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); + ps.WriteLine(" "); + ps.WriteLine(" Local"); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" {0}", SchemaVersion); + ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); + + // Visual Studio has a hard coded guid for the project type + if (project.Type == ProjectType.Web) + ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); + ps.WriteLine(" Debug"); + ps.WriteLine(" {0}", project.AppIcon); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", project.AssemblyName); + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != "") + { + ps.WriteLine(" {0}", conf.Options.KeyFile); + ps.WriteLine(" true"); + break; + } + } + ps.WriteLine(" JScript"); + ps.WriteLine(" Grid"); + ps.WriteLine(" IE50"); + ps.WriteLine(" false"); + ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); + + ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); + ps.WriteLine(" {0}", project.DesignerFolder); + ps.WriteLine(" {0}", project.RootNamespace); + ps.WriteLine(" {0}", project.StartupObject); + if (string.IsNullOrEmpty(project.DebugStartParameters)) + { + ps.WriteLine(" {0}", project.DebugStartParameters); + } + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" ", conf.Name, conf.Platform); + ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); + ps.WriteLine(" {0}", conf.Options["BaseAddress"]); + ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); + ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); + ps.WriteLine(" {0}", conf.Options["DebugInformation"]); + ps.WriteLine(" {0}", conf.Options["FileAlignment"]); + ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); + if (project.Type != ProjectType.Web) + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); + else + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath("bin\\"))); + + ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); + ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); + ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); + ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); + ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); + ps.WriteLine(" {0}", conf.Platform); + ps.WriteLine(" "); + } + + //ps.WriteLine(" "); + + Dictionary projectReferences = new Dictionary(); + List otherReferences = new List(); + + foreach (ReferenceNode refr in project.References) + { + ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); + + if (projectNode == null) + otherReferences.Add(refr); + else + projectReferences.Add(refr, projectNode); + } + // Assembly References + ps.WriteLine(" "); + + foreach (ReferenceNode refr in otherReferences) + { + ps.Write(" "); + ps.Write(" "); + ps.Write(refr.Name); + ps.WriteLine(""); + + if(!String.IsNullOrEmpty(refr.Path)) + { + // Use absolute path to assembly (for determining assembly type) + string absolutePath = Path.Combine(project.FullPath, refr.Path); + if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { + // Assembly is an executable (exe) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); + } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { + // Assembly is an library (dll) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } else { + string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); + kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } + } + + ps.WriteLine(" {0}", refr.LocalCopy); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + //Project References + ps.WriteLine(" "); + foreach (KeyValuePair pair in projectReferences) + { + ToolInfo tool = tools[pair.Value.Language]; + if (tools == null) + throw new UnknownLanguageException(); + + string path = + Helper.MakePathRelativeTo(project.FullPath, + Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); + ps.WriteLine(" ", path); + + // TODO: Allow reference to visual basic projects + ps.WriteLine(" {0}", pair.Value.Name); + ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); + ps.WriteLine(" {0}", tool.Guid.ToUpper()); + + //This is the Copy Local flag in VS + ps.WriteLine(" {0}", pair.Key.LocalCopy); + + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + // ps.WriteLine(" "); + ps.WriteLine(" "); + + // ps.WriteLine(" "); + List list = new List(); + + foreach (string path in project.Files) + { + string lower = path.ToLower(); + if (lower.EndsWith(".resx")) + { + string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); + if (!list.Contains(codebehind)) + list.Add(codebehind); + } + + } + + foreach (string filePath in project.Files) + { + // if (file == "Properties\\Bind.Designer.cs") + // { + // Console.WriteLine("Wait a minute!"); + // Console.WriteLine(project.Files.GetSubType(file).ToString()); + // } + SubType subType = project.Files.GetSubType(filePath); + + // Visual Studio chokes on file names if forward slash is used as a path separator + // instead of backslash. So we must make sure that all file paths written to the + // project file use \ as a path separator. + string file = filePath.Replace(@"/", @"\"); + + if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer + && subType != SubType.CodeBehind) + { + ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ps.WriteLine(" {0}", Path.GetFileName(file)); + ps.WriteLine(" Designer"); + ps.WriteLine(" "); + // + } + + if (subType == SubType.Designer) + { + ps.WriteLine(" ", file); + + string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; + string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; + + // Check for a parent .cs file with the same name as this designer file + if (File.Exists(Helper.NormalizePath(dependent_name))) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" ResXFileCodeGenerator"); + ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); + ps.WriteLine(" " + subType + ""); + } + + ps.WriteLine(" "); + if (File.Exists(Helper.NormalizePath(autogen_name))) + { + ps.WriteLine(" ", autogen_name); + //ps.WriteLine(" True"); + + // If a parent .cs file exists, link this autogen file to it. Otherwise link + // to the designer file + if (File.Exists(dependent_name)) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" True"); + ps.WriteLine(" {0}", Path.GetFileName(filePath)); + } + + ps.WriteLine(" "); + } + list.Add(autogen_name); + } + if (subType == SubType.Settings) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + ps.WriteLine("Include=\"{0}\">", file); + string fileName = Path.GetFileName(filePath); + if (project.Files.GetBuildAction(filePath) == BuildAction.None) + { + ps.WriteLine(" SettingsSingleFileGenerator"); + ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); + } + else + { + ps.WriteLine(" Code"); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); + string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); + ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); + } + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + else if (subType != SubType.Designer) + { + string path = Helper.NormalizePath(file); + string path_lower = path.ToLower(); + + if (!list.Contains(filePath)) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + + int startPos = 0; + if (project.Files.GetPreservePath(filePath)) + { + while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) + startPos++; + + } + else + { + startPos = file.LastIndexOf(Path.GetFileName(path)); + } + + // be sure to write out the path with backslashes so VS recognizes + // the file properly. + ps.WriteLine("Include=\"{0}\">", file); + + int last_period_index = file.LastIndexOf('.'); + string short_file_name = file.Substring(0, last_period_index); + string extension = Path.GetExtension(path); + // make this upper case, so that when File.Exists tests for the + // existence of a designer file on a case-sensitive platform, + // it is correctly identified. + string designer_format = string.Format(".Designer{0}", extension); + + if (path_lower.EndsWith(designer_format.ToLowerInvariant())) + { + int designer_index = path.IndexOf(designer_format); + string file_name = path.Substring(0, designer_index); + + // There are two corrections to the next lines: + // 1. Fix the connection between a designer file and a form + // or usercontrol that don't have an associated resx file. + // 2. Connect settings files to associated designer files. + if (File.Exists(file_name + extension)) + ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); + else if (File.Exists(file_name + ".resx")) + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); + else if (File.Exists(file_name + ".settings")) + { + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + } + } + else if (subType == SubType.CodeBehind) + { + ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); + } + if (project.Files.GetIsLink(filePath)) + { + string alias = project.Files.GetLinkPath(filePath); + alias += file.Substring(startPos); + alias = Helper.NormalizePath(alias); + ps.WriteLine(" {0}", alias); + } + else if (project.Files.GetBuildAction(filePath) != BuildAction.None) + { + if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) + { + ps.WriteLine(" {0}", subType); + } + } + + if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) + { + ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); + } + + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + } + } + + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(""); + } + #endregion + + #region User File + + ps = new StreamWriter(projectFile + ".user"); + using (ps) + { + // Get the first configuration from the project. + ConfigurationNode firstConfiguration = null; + + if (project.Configurations.Count > 0) + { + firstConfiguration = project.Configurations[0]; + } + + ps.WriteLine(""); + //ps.WriteLine( "" ); + //ps.WriteLine(" <{0}>", toolInfo.XMLTag); + //ps.WriteLine(" "); + ps.WriteLine(" "); + //ps.WriteLine(" ", MakeRefPath(project)); + + if (firstConfiguration != null) + { + ps.WriteLine(" {0}", firstConfiguration.Name); + ps.WriteLine(" {0}", firstConfiguration.Platform); + } + + ps.WriteLine(" {0}", MakeRefPath(project)); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" ProjectFiles"); + ps.WriteLine(" 0"); + ps.WriteLine(" "); + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" "); + } + ps.WriteLine(""); + } + #endregion + + kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) + { + kernel.Log.Write("Creating {0} solution and project files", VersionName); + + foreach (SolutionNode child in solution.Solutions) + { + kernel.Log.Write("...Creating folder: {0}", child.Name); + WriteSolution(child, false); + } + + foreach (ProjectNode project in solution.Projects) + { + kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + + foreach (DatabaseProjectNode project in solution.DatabaseProjects) + { + kernel.Log.Write("...Creating database project: {0}", project.Name); + WriteDatabaseProject(solution, project); + } + + if (writeSolutionToDisk) // only write main solution + { + kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + + using (StreamWriter ss = new StreamWriter(solutionFile)) + { + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + ss.WriteLine(SolutionTag); + + WriteProjectDeclarations(ss, solution, solution); + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + WriteConfigurationLines(solution.Configurations, solution, ss); + ss.WriteLine("\tEndGlobalSection"); + + if (solution.Solutions.Count > 0) + { + ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); + foreach (SolutionNode embeddedSolution in solution.Solutions) + { + WriteNestedProjectMap(ss, embeddedSolution); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("EndGlobal"); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + } + + private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) + { + foreach (SolutionNode childSolution in embeddedSolution.Solutions) + { + WriteEmbeddedSolution(writer, childSolution); + WriteProjectDeclarations(writer, actualSolution, childSolution); + } + + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteProject(actualSolution, writer, project); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteProject(actualSolution, writer, dbProject); + } + + if (actualSolution.Guid == embeddedSolution.Guid) + { + WriteSolutionFiles(actualSolution, writer); + } + } + + private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) + { + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteNestedProject(writer, embeddedSolution, project.Guid); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteNestedProject(writer, embeddedSolution, dbProject.Guid); + } + + foreach (SolutionNode child in embeddedSolution.Solutions) + { + WriteNestedProject(writer, embeddedSolution, child.Guid); + WriteNestedProjectMap(writer, child); + } + } + + private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) + { + WriteNestedFolder(writer, solution.Guid, projectGuid); + } + + private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) + { + writer.WriteLine("\t\t{0} = {1}", + childGuid.ToString("B").ToUpper(), + parentGuid.ToString("B").ToUpper()); + } + + private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) + { + foreach (ProjectNode project in solution.Projects) + { + foreach (ConfigurationNode conf in configurations) + { + ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + + ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + } + } + + foreach (SolutionNode child in solution.Solutions) + { + WriteConfigurationLines(configurations, child, ss); + } + } + + private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) + { + if(solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); + } + + private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) + { + WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) + { + WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) + { + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + } + + const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; + const string ProjectDeclarationEndFormat = "EndProject"; + + private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); + + path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); + + WriteProject(ss, language, guid, name, path); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) + { + WriteProject(writer, language, projectGuid, name, location, null); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + writer.WriteLine(ProjectDeclarationBeginFormat, + toolInfo.Guid, + name, + location, + projectGuid.ToString("B").ToUpper()); + + if (files != null) + { + writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); + + foreach (string file in files) + writer.WriteLine("\t\t{0} = {0}", file); + + writer.WriteLine("\tEndProjectSection"); + } + + writer.WriteLine(ProjectDeclarationEndFormat); + } + + private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) + { + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); + IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); + + kernel.CurrentWorkingDirectory.Push(); + + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using (ps) + { + ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); + ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); + ps.Indent++; + ps.WriteLine("MSDTVersion = \"80\""); + // TODO: Use the project.Files property + if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) + WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); + + ps.WriteLine("Begin DBRefFolder = \"Database References\""); + ps.Indent++; + foreach (DatabaseReferenceNode reference in project.References) + { + ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); + ps.Indent++; + ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); + ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); + //ps.WriteLine("Colorizer = 5"); + ps.Indent--; + ps.WriteLine("End"); + } + ps.Indent--; + ps.WriteLine("End"); + ps.Indent--; + ps.WriteLine("End"); + + ps.Flush(); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + + private static bool ContainsSqlFiles(string folder) + { + if(Directory.GetFiles(folder, "*.sql").Length > 0) + return true; // if the folder contains 1 .sql file, that's good enough + + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + return true; // if 1 child folder contains a .sql file, still good enough + } + + return false; + } + + private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) + { + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + { + writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); + writer.Indent++; + WriteDatabaseFoldersAndFiles(writer, child); + writer.Indent--; + writer.WriteLine("End"); + } + } + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); + } + } + + private void CleanProject(ProjectNode project) + { + kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + WriteSolution(sol, true); + } + kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + CleanSolution(sol); + } + kernel = null; + } + + #endregion + } +} From 47a5e2633c4a5cb5e0e89e4b8ffc42bf5996c4e6 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 11 Sep 2010 20:22:10 +0100 Subject: [PATCH 25/35] Prevent child agents from being blacklisted in the kill record. --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index cdf8cb1b23..a6315a9a1e 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1519,10 +1519,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP kill.Header.Reliable = true; kill.Header.Zerocoded = true; - lock (m_entityUpdates.SyncRoot) + if (m_scene.GetScenePresence(localID) == null) { - m_killRecord.Add(localID); - OutPacket(kill, ThrottleOutPacketType.State); + lock (m_entityUpdates.SyncRoot) + { + m_killRecord.Add(localID); + OutPacket(kill, ThrottleOutPacketType.State); + } } } From a9acc6730d4dc33b81da567778cac32517b2068c Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sat, 11 Sep 2010 18:26:59 -0700 Subject: [PATCH 26/35] Removing .svn directories under Prebuild/ from source control --- Prebuild/doc/.svn/all-wcprops | 35 - Prebuild/doc/.svn/dir-prop-base | 5 - Prebuild/doc/.svn/entries | 198 --- .../prop-base/prebuild-example1.xml.svn-base | 9 - .../prop-base/prebuild-example2.xml.svn-base | 9 - .../prop-base/prebuild-example3.xml.svn-base | 9 - .../prop-base/prebuild-example4.xml.svn-base | 9 - .../text-base/prebuild-example1.xml.svn-base | 300 ----- .../text-base/prebuild-example2.xml.svn-base | 72 -- .../text-base/prebuild-example3.xml.svn-base | 113 -- .../text-base/prebuild-example4.xml.svn-base | 715 ----------- .../text-base/prebuild-example5.xml.svn-base | 187 --- Prebuild/scripts/.svn/all-wcprops | 125 -- Prebuild/scripts/.svn/dir-prop-base | 6 - Prebuild/scripts/.svn/entries | 708 ----------- .../scripts/.svn/prop-base/Clean.bat.svn-base | 13 - .../scripts/.svn/prop-base/Clean.sh.svn-base | 9 - .../scripts/.svn/prop-base/Help.bat.svn-base | 13 - .../.svn/prop-base/MonoDevelop.sh.svn-base | 13 - .../.svn/prop-base/Prebuild.nsi.svn-base | 9 - .../.svn/prop-base/SharpDevelop.bat.svn-base | 13 - .../.svn/prop-base/SharpDevelop2.bat.svn-base | 5 - .../.svn/prop-base/VS2002.bat.svn-base | 13 - .../.svn/prop-base/VS2003.bat.svn-base | 13 - .../.svn/prop-base/VS2005.bat.svn-base | 13 - .../.svn/prop-base/VS2008.bat.svn-base | 5 - .../.svn/prop-base/autotools.bat.svn-base | 5 - .../.svn/prop-base/autotools.sh.svn-base | 5 - .../.svn/prop-base/makefile.bat.svn-base | 9 - .../.svn/prop-base/makefile.sh.svn-base | 9 - .../scripts/.svn/prop-base/nant.bat.svn-base | 13 - .../scripts/.svn/prop-base/nant.sh.svn-base | 13 - .../scripts/.svn/prop-base/xcode.bat.svn-base | 9 - .../scripts/.svn/prop-base/xcode.sh.svn-base | 9 - .../scripts/.svn/text-base/Clean.bat.svn-base | 2 - .../scripts/.svn/text-base/Clean.sh.svn-base | 4 - .../scripts/.svn/text-base/Help.bat.svn-base | 2 - .../.svn/text-base/MonoDevelop.sh.svn-base | 2 - .../.svn/text-base/Prebuild.nsi.svn-base | 231 ---- .../.svn/text-base/SharpDevelop.bat.svn-base | 4 - .../.svn/text-base/SharpDevelop2.bat.svn-base | 4 - .../.svn/text-base/VS2002.bat.svn-base | 4 - .../.svn/text-base/VS2003.bat.svn-base | 4 - .../.svn/text-base/VS2005.bat.svn-base | 4 - .../.svn/text-base/VS2008.bat.svn-base | 4 - .../.svn/text-base/VS2010.bat.svn-base | 4 - .../.svn/text-base/autotools.bat.svn-base | 4 - .../.svn/text-base/autotools.sh.svn-base | 5 - .../.svn/text-base/makefile.bat.svn-base | 4 - .../.svn/text-base/makefile.sh.svn-base | 10 - .../scripts/.svn/text-base/nant.bat.svn-base | 4 - .../scripts/.svn/text-base/nant.sh.svn-base | 2 - .../scripts/.svn/text-base/xcode.bat.svn-base | 4 - .../scripts/.svn/text-base/xcode.sh.svn-base | 2 - Prebuild/src/.svn/all-wcprops | 23 - Prebuild/src/.svn/dir-prop-base | 16 - Prebuild/src/.svn/entries | 139 --- Prebuild/src/.svn/prop-base/App.ico.svn-base | 5 - .../src/.svn/prop-base/Prebuild.cs.svn-base | 9 - .../src/.svn/prop-base/Prebuild.snk.svn-base | 5 - Prebuild/src/.svn/text-base/App.ico.svn-base | Bin 4286 -> 0 bytes .../src/.svn/text-base/Prebuild.cs.svn-base | 165 --- .../src/.svn/text-base/Prebuild.snk.svn-base | Bin 596 -> 0 bytes Prebuild/src/Core/.svn/all-wcprops | 29 - Prebuild/src/Core/.svn/dir-prop-base | 5 - Prebuild/src/Core/.svn/entries | 182 --- .../.svn/prop-base/FatalException.cs.svn-base | 9 - .../Core/.svn/prop-base/Kernel.cs.svn-base | 9 - .../UnknownLanguageException.cs.svn-base | 9 - .../prop-base/WarningException.cs.svn-base | 9 - .../.svn/text-base/FatalException.cs.svn-base | 85 -- .../Core/.svn/text-base/Kernel.cs.svn-base | 832 ------------- .../UnknownLanguageException.cs.svn-base | 63 - .../text-base/WarningException.cs.svn-base | 84 -- Prebuild/src/Core/Attributes/.svn/all-wcprops | 23 - .../src/Core/Attributes/.svn/dir-prop-base | 5 - Prebuild/src/Core/Attributes/.svn/entries | 130 -- .../prop-base/DataNodeAttribute.cs.svn-base | 9 - .../prop-base/OptionNodeAttribute.cs.svn-base | 9 - .../prop-base/TargetAttribute.cs.svn-base | 9 - .../text-base/DataNodeAttribute.cs.svn-base | 72 -- .../text-base/OptionNodeAttribute.cs.svn-base | 71 -- .../text-base/TargetAttribute.cs.svn-base | 71 -- Prebuild/src/Core/Interfaces/.svn/all-wcprops | 17 - .../src/Core/Interfaces/.svn/dir-prop-base | 5 - Prebuild/src/Core/Interfaces/.svn/entries | 96 -- .../.svn/prop-base/IDataNode.cs.svn-base | 9 - .../.svn/prop-base/ITarget.cs.svn-base | 9 - .../.svn/text-base/IDataNode.cs.svn-base | 47 - .../.svn/text-base/ITarget.cs.svn-base | 51 - Prebuild/src/Core/Nodes/.svn/all-wcprops | 119 -- Prebuild/src/Core/Nodes/.svn/dir-prop-base | 5 - Prebuild/src/Core/Nodes/.svn/entries | 674 ----------- .../prop-base/ConfigurationNode.cs.svn-base | 9 - .../Nodes/.svn/prop-base/DataNode.cs.svn-base | 9 - .../.svn/prop-base/ExcludeNode.cs.svn-base | 9 - .../Nodes/.svn/prop-base/FileNode.cs.svn-base | 9 - .../.svn/prop-base/FilesNode.cs.svn-base | 9 - .../.svn/prop-base/MatchNode.cs.svn-base | 9 - .../.svn/prop-base/OptionsNode.cs.svn-base | 9 - .../.svn/prop-base/ProcessNode.cs.svn-base | 9 - .../.svn/prop-base/ProjectNode.cs.svn-base | 9 - .../.svn/prop-base/ReferenceNode.cs.svn-base | 9 - .../prop-base/ReferencePathNode.cs.svn-base | 9 - .../.svn/prop-base/SolutionNode.cs.svn-base | 9 - .../.svn/text-base/AuthorNode.cs.svn-base | 87 -- .../.svn/text-base/CleanFilesNode.cs.svn-base | 80 -- .../.svn/text-base/CleanupNode.cs.svn-base | 85 -- .../text-base/ConfigurationNode.cs.svn-base | 225 ---- .../ConfigurationNodeCollection.cs.svn-base | 71 -- .../Nodes/.svn/text-base/DataNode.cs.svn-base | 117 -- .../text-base/DatabaseProjectNode.cs.svn-base | 93 -- .../DatabaseReferenceNode.cs.svn-base | 63 - .../text-base/DescriptionNode.cs.svn-base | 87 -- .../.svn/text-base/ExcludeNode.cs.svn-base | 89 -- .../Nodes/.svn/text-base/FileNode.cs.svn-base | 285 ----- .../.svn/text-base/FilesNode.cs.svn-base | 204 ---- .../.svn/text-base/MatchNode.cs.svn-base | 367 ------ .../.svn/text-base/OptionsNode.cs.svn-base | 634 ---------- .../.svn/text-base/ProcessNode.cs.svn-base | 108 -- .../.svn/text-base/ProjectNode.cs.svn-base | 579 --------- .../.svn/text-base/ReferenceNode.cs.svn-base | 144 --- .../text-base/ReferencePathNode.cs.svn-base | 97 -- .../.svn/text-base/SolutionNode.cs.svn-base | 382 ------ Prebuild/src/Core/Parse/.svn/all-wcprops | 17 - Prebuild/src/Core/Parse/.svn/dir-prop-base | 5 - Prebuild/src/Core/Parse/.svn/entries | 96 -- .../.svn/prop-base/IfContext.cs.svn-base | 9 - .../.svn/prop-base/Preprocessor.cs.svn-base | 9 - .../.svn/text-base/IfContext.cs.svn-base | 154 --- .../.svn/text-base/Preprocessor.cs.svn-base | 652 ---------- Prebuild/src/Core/Targets/.svn/all-wcprops | 101 -- Prebuild/src/Core/Targets/.svn/dir-prop-base | 5 - Prebuild/src/Core/Targets/.svn/entries | 572 --------- .../.svn/prop-base/DebugTarget.cs.svn-base | 9 - .../.svn/prop-base/MakefileTarget.cs.svn-base | 9 - .../prop-base/MonoDevelopTarget.cs.svn-base | 9 - .../.svn/prop-base/NAntTarget.cs.svn-base | 9 - .../prop-base/SharpDevelopTarget.cs.svn-base | 9 - .../.svn/prop-base/VS2002Target.cs.svn-base | 9 - .../.svn/prop-base/VS2003Target.cs.svn-base | 9 - .../.svn/prop-base/VS2005Target.cs.svn-base | 9 - .../.svn/prop-base/XcodeTarget.cs.svn-base | 9 - .../text-base/AutotoolsTarget.cs.svn-base | 1070 ----------------- .../.svn/text-base/DebugTarget.cs.svn-base | 102 -- .../.svn/text-base/MakefileTarget.cs.svn-base | 469 -------- .../text-base/MonoDevelopTarget.cs.svn-base | 515 -------- .../.svn/text-base/NAntTarget.cs.svn-base | 776 ------------ .../text-base/SharpDevelop2Target.cs.svn-base | 82 -- .../text-base/SharpDevelopTarget.cs.svn-base | 425 ------- .../.svn/text-base/ToolInfo.cs.svn-base | 197 --- .../.svn/text-base/VS2002Target.cs.svn-base | 87 -- .../.svn/text-base/VS2003Target.cs.svn-base | 593 --------- .../.svn/text-base/VS2005Target.cs.svn-base | 147 --- .../.svn/text-base/VS2008Target.cs.svn-base | 127 -- .../.svn/text-base/VS2010Target.cs.svn-base | 138 --- .../text-base/VSGenericTarget.cs.svn-base | 922 -------------- .../.svn/text-base/VSVersion.cs.svn-base | 54 - .../.svn/text-base/XcodeTarget.cs.svn-base | 594 --------- Prebuild/src/Core/Utilities/.svn/all-wcprops | 29 - .../src/Core/Utilities/.svn/dir-prop-base | 5 - Prebuild/src/Core/Utilities/.svn/entries | 164 --- .../CommandLineCollection.cs.svn-base | 9 - .../prop-base/CurrentDirectory.cs.svn-base | 9 - .../.svn/prop-base/Helper.cs.svn-base | 9 - .../Utilities/.svn/prop-base/Log.cs.svn-base | 9 - .../CommandLineCollection.cs.svn-base | 152 --- .../text-base/CurrentDirectory.cs.svn-base | 68 -- .../.svn/text-base/Helper.cs.svn-base | 575 --------- .../Utilities/.svn/text-base/Log.cs.svn-base | 276 ----- Prebuild/src/Properties/.svn/all-wcprops | 11 - Prebuild/src/Properties/.svn/entries | 62 - .../.svn/prop-base/AssemblyInfo.cs.svn-base | 9 - .../.svn/text-base/AssemblyInfo.cs.svn-base | 113 -- Prebuild/src/data/.svn/all-wcprops | 71 -- Prebuild/src/data/.svn/dir-prop-base | 6 - Prebuild/src/data/.svn/entries | 402 ------- .../data/.svn/prop-base/dnpb-1.0.xsd.svn-base | 9 - .../data/.svn/prop-base/dnpb-1.1.xsd.svn-base | 9 - .../data/.svn/prop-base/dnpb-1.2.xsd.svn-base | 9 - .../data/.svn/prop-base/dnpb-1.3.xsd.svn-base | 9 - .../data/.svn/prop-base/dnpb-1.4.xsd.svn-base | 9 - .../data/.svn/prop-base/dnpb-1.5.xsd.svn-base | 9 - .../.svn/prop-base/prebuild-1.6.xsd.svn-base | 9 - .../.svn/text-base/autotools.xml.svn-base | 790 ------------ .../data/.svn/text-base/dnpb-1.0.xsd.svn-base | 183 --- .../data/.svn/text-base/dnpb-1.1.xsd.svn-base | 184 --- .../data/.svn/text-base/dnpb-1.2.xsd.svn-base | 198 --- .../data/.svn/text-base/dnpb-1.3.xsd.svn-base | 206 ---- .../data/.svn/text-base/dnpb-1.4.xsd.svn-base | 212 ---- .../data/.svn/text-base/dnpb-1.5.xsd.svn-base | 215 ---- .../.svn/text-base/prebuild-1.6.xsd.svn-base | 231 ---- .../.svn/text-base/prebuild-1.7.xsd.svn-base | 350 ------ .../.svn/text-base/prebuild-1.8.xsd.svn-base | 331 ----- .../.svn/text-base/prebuild-1.9.xsd.svn-base | 336 ------ Prebuild/tests/.svn/all-wcprops | 59 - Prebuild/tests/.svn/entries | 334 ----- .../tests/.svn/text-base/Makefile.svn-base | 24 - .../tests/.svn/text-base/README.txt.svn-base | 5 - .../text-base/include-001.expected.svn-base | 46 - .../text-base/include-001.include.svn-base | 33 - .../text-base/include-001.prebuild.svn-base | 22 - .../text-base/include-002-2.include.svn-base | 8 - .../text-base/include-002.expected.svn-base | 26 - .../text-base/include-002.include.svn-base | 14 - .../text-base/include-002.prebuild.svn-base | 7 - 206 files changed, 23864 deletions(-) delete mode 100644 Prebuild/doc/.svn/all-wcprops delete mode 100644 Prebuild/doc/.svn/dir-prop-base delete mode 100644 Prebuild/doc/.svn/entries delete mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example1.xml.svn-base delete mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example2.xml.svn-base delete mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example3.xml.svn-base delete mode 100644 Prebuild/doc/.svn/prop-base/prebuild-example4.xml.svn-base delete mode 100644 Prebuild/doc/.svn/text-base/prebuild-example1.xml.svn-base delete mode 100644 Prebuild/doc/.svn/text-base/prebuild-example2.xml.svn-base delete mode 100644 Prebuild/doc/.svn/text-base/prebuild-example3.xml.svn-base delete mode 100644 Prebuild/doc/.svn/text-base/prebuild-example4.xml.svn-base delete mode 100644 Prebuild/doc/.svn/text-base/prebuild-example5.xml.svn-base delete mode 100644 Prebuild/scripts/.svn/all-wcprops delete mode 100644 Prebuild/scripts/.svn/dir-prop-base delete mode 100644 Prebuild/scripts/.svn/entries delete mode 100644 Prebuild/scripts/.svn/prop-base/Clean.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/Clean.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/Help.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/MonoDevelop.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/Prebuild.nsi.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/SharpDevelop.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/SharpDevelop2.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/VS2002.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/VS2003.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/VS2005.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/VS2008.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/autotools.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/autotools.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/makefile.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/makefile.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/nant.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/nant.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/xcode.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/prop-base/xcode.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/Clean.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/Clean.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/Help.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/MonoDevelop.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/Prebuild.nsi.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/SharpDevelop.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/SharpDevelop2.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/VS2002.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/VS2003.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/VS2005.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/VS2008.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/VS2010.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/autotools.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/autotools.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/makefile.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/makefile.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/nant.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/nant.sh.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/xcode.bat.svn-base delete mode 100644 Prebuild/scripts/.svn/text-base/xcode.sh.svn-base delete mode 100644 Prebuild/src/.svn/all-wcprops delete mode 100644 Prebuild/src/.svn/dir-prop-base delete mode 100644 Prebuild/src/.svn/entries delete mode 100644 Prebuild/src/.svn/prop-base/App.ico.svn-base delete mode 100644 Prebuild/src/.svn/prop-base/Prebuild.cs.svn-base delete mode 100644 Prebuild/src/.svn/prop-base/Prebuild.snk.svn-base delete mode 100644 Prebuild/src/.svn/text-base/App.ico.svn-base delete mode 100644 Prebuild/src/.svn/text-base/Prebuild.cs.svn-base delete mode 100644 Prebuild/src/.svn/text-base/Prebuild.snk.svn-base delete mode 100644 Prebuild/src/Core/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/.svn/entries delete mode 100644 Prebuild/src/Core/.svn/prop-base/FatalException.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/prop-base/Kernel.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/prop-base/UnknownLanguageException.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/prop-base/WarningException.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/text-base/FatalException.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base delete mode 100644 Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/Attributes/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/entries delete mode 100644 Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base delete mode 100644 Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base delete mode 100644 Prebuild/src/Core/Interfaces/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/Interfaces/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/Interfaces/.svn/entries delete mode 100644 Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/Nodes/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/entries delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base delete mode 100644 Prebuild/src/Core/Parse/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/Parse/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/Parse/.svn/entries delete mode 100644 Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base delete mode 100644 Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base delete mode 100644 Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base delete mode 100644 Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/Targets/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/Targets/.svn/entries delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/DebugTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/MakefileTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/MonoDevelopTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/NAntTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/SharpDevelopTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/VS2002Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/VS2003Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/VS2005Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/prop-base/XcodeTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/AutotoolsTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base delete mode 100644 Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/all-wcprops delete mode 100644 Prebuild/src/Core/Utilities/.svn/dir-prop-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/entries delete mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base delete mode 100644 Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base delete mode 100644 Prebuild/src/Properties/.svn/all-wcprops delete mode 100644 Prebuild/src/Properties/.svn/entries delete mode 100644 Prebuild/src/Properties/.svn/prop-base/AssemblyInfo.cs.svn-base delete mode 100644 Prebuild/src/Properties/.svn/text-base/AssemblyInfo.cs.svn-base delete mode 100644 Prebuild/src/data/.svn/all-wcprops delete mode 100644 Prebuild/src/data/.svn/dir-prop-base delete mode 100644 Prebuild/src/data/.svn/entries delete mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/autotools.xml.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base delete mode 100644 Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base delete mode 100644 Prebuild/tests/.svn/all-wcprops delete mode 100644 Prebuild/tests/.svn/entries delete mode 100644 Prebuild/tests/.svn/text-base/Makefile.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/README.txt.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-001.expected.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-001.include.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-002-2.include.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-002.expected.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-002.include.svn-base delete mode 100644 Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base diff --git a/Prebuild/doc/.svn/all-wcprops b/Prebuild/doc/.svn/all-wcprops deleted file mode 100644 index c9ded3c62d..0000000000 --- a/Prebuild/doc/.svn/all-wcprops +++ /dev/null @@ -1,35 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 45 -/svnroot/dnpb/!svn/ver/153/trunk/Prebuild/doc -END -prebuild-example1.xml -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/100/trunk/Prebuild/doc/prebuild-example1.xml -END -prebuild-example2.xml -K 25 -svn:wc:ra_dav:version-url -V 66 -/svnroot/dnpb/!svn/ver/97/trunk/Prebuild/doc/prebuild-example2.xml -END -prebuild-example3.xml -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/100/trunk/Prebuild/doc/prebuild-example3.xml -END -prebuild-example4.xml -K 25 -svn:wc:ra_dav:version-url -V 66 -/svnroot/dnpb/!svn/ver/97/trunk/Prebuild/doc/prebuild-example4.xml -END -prebuild-example5.xml -K 25 -svn:wc:ra_dav:version-url -V 66 -/svnroot/dnpb/!svn/ver/99/trunk/Prebuild/doc/prebuild-example5.xml -END diff --git a/Prebuild/doc/.svn/dir-prop-base b/Prebuild/doc/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/doc/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/doc/.svn/entries b/Prebuild/doc/.svn/entries deleted file mode 100644 index d03fd5fc27..0000000000 --- a/Prebuild/doc/.svn/entries +++ /dev/null @@ -1,198 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/doc -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2006-09-08T16:00:28.737339Z -153 -jendave -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -prebuild-example1.xml -file - - - - -2010-09-10T22:51:45.000000Z -269ac712fc217a7089e20814b745f795 -2006-02-28T23:34:17.574397Z -100 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -11393 - -prebuild-example2.xml -file - - - - -2010-09-10T22:51:45.000000Z -6c1661ff5b85340a3b46029f9db227dd -2006-02-28T18:35:03.849682Z -97 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -2478 - -prebuild-example3.xml -file - - - - -2010-09-10T22:51:45.000000Z -c0110f3960385a9ab2bc42d8a0e896dd -2006-02-28T23:34:17.574397Z -100 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -6557 - -prebuild-example4.xml -file - - - - -2010-09-10T22:51:45.000000Z -19099aca218b707397307e59eccccf94 -2006-02-28T18:35:03.849682Z -97 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -29159 - -prebuild-example5.xml -file - - - - -2010-09-10T22:51:45.000000Z -b55f1c716d581bb711ae1ea0f8f3a239 -2006-02-28T23:25:30.475451Z -99 -jendave - - - - - - - - - - - - - - - - - - - - - -6482 - diff --git a/Prebuild/doc/.svn/prop-base/prebuild-example1.xml.svn-base b/Prebuild/doc/.svn/prop-base/prebuild-example1.xml.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/doc/.svn/prop-base/prebuild-example1.xml.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/doc/.svn/prop-base/prebuild-example2.xml.svn-base b/Prebuild/doc/.svn/prop-base/prebuild-example2.xml.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/doc/.svn/prop-base/prebuild-example2.xml.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/doc/.svn/prop-base/prebuild-example3.xml.svn-base b/Prebuild/doc/.svn/prop-base/prebuild-example3.xml.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/doc/.svn/prop-base/prebuild-example3.xml.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/doc/.svn/prop-base/prebuild-example4.xml.svn-base b/Prebuild/doc/.svn/prop-base/prebuild-example4.xml.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/doc/.svn/prop-base/prebuild-example4.xml.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/doc/.svn/text-base/prebuild-example1.xml.svn-base b/Prebuild/doc/.svn/text-base/prebuild-example1.xml.svn-base deleted file mode 100644 index a2cee42cd3..0000000000 --- a/Prebuild/doc/.svn/text-base/prebuild-example1.xml.svn-base +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - TRACE;DEBUG - false - false - false - 4 - false - 1591;219;1573;1572;168 - ..\bin - true - false - true - 285212672 - 4096 - false - Docs.xml - - - - - TRACE - true - false - false - 4 - false - 1591;219;1573;1572;168 - ..\bin - false - false - true - 285212672 - 4096 - false - Docs.xml - - - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - ../bin - - - - - - - - - - - - - - - ..\bin\lib\Framework - RealmForge.Framework.xml - - - - - ..\bin\lib\Framework - RealmForge.Framework.xml - - - ../bin - - - - - - - - - - - - - - - - - - - - - ..\bin\lib\Genres - RealmForge.Genres.xml - - - - - ..\bin\lib\Genres - RealmForge.Genres.xml - - - ../bin - - - - - - - - - - - - - - - - - ..\bin\lib\Forms - RealmForge.UI.Forms.xml - true - - - - - ..\bin\lib\Forms - RealmForge.UI.Forms.xml - true - - - ../bin - - - - - - - - - - - - IDE\Resources\ImagesCaptionIDE.bmp - IDE\Resources\ImagesCaptionPlain.bmp - IDE\Resources\ImagesMenuControl.bmp - IDE\Resources\ImagesPopupMenu.bmp - IDE\Resources\ImagesTabbedGroups.bmp - IDE\Resources\ImagesTabControl.bmp - IDE\Resources\LibraryIcon.ico - IDE\Resources\TabbedInvalid.cur - IDE\Resources\TabbedValid.cur - IDE\Resources\WizardPicture.bmp - Controls\Trees\tv_minus.bmp - Controls\Trees\tv_plus.bmp - Controls\Trees\treeview.bmp - Controls\Trees\listview.bmp - IDE\Menus\MenuControl.bmp - IDE\Controls\InertButton.bmp - IDE\Controls\TabbedGroups.bmp - IDE\Controls\TabCOntrol.bmp - IDE\Controls\WizardControl.bmp - Forms\IDETest.resx - Forms\IDEWindow.resx - Forms\Launcher.resx - Forms\MainRenderFrame.resx - - - - - - - - ..\bin\lib\RAGE - RealmForge.RAGE.xml - - - - - ..\bin\lib\RAGE - RealmForge.RAGE.xml - - - ../bin - ../bin - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\bin\ScriptLibrary - RealmForge.ScriptLibrary.xml - - - - - ..\bin\ScriptLibrary - RealmForge.ScriptLibrary.xml - - - ../bin - - - - - - - - - - - - - - - - - - - - ..\bin\lib\Updater - Updater.xml - - - - - ..\bin\lib\Updater - Updater.xml - - - ../bin - - - - - - - - - - - - - - ..\bin - DemoGame.xml - - - - - ..\bin - DemoGame.xml - - - ../bin - - - - - - - - - - - - - - - diff --git a/Prebuild/doc/.svn/text-base/prebuild-example2.xml.svn-base b/Prebuild/doc/.svn/text-base/prebuild-example2.xml.svn-base deleted file mode 100644 index bd23c4fab2..0000000000 --- a/Prebuild/doc/.svn/text-base/prebuild-example2.xml.svn-base +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - DEBUG;TRACE;WIN32;NET - - DEBUG;TRACE;POSIX - - false - bin\Debug - true - 1595 - - - - - - TRACE;WIN32;NET - - TRACE;POSIX - - bin\Release - true - false - 1595 - - - - prebuild.xml - - - - - - - DEBUG;TRACE;WIN32;NET - - DEBUG;TRACE;POSIX - - false - bin\Debug - true - Prebuild.xml - 1595 - - - - - - TRACE;WIN32;NET - - TRACE;POSIX - - bin\Release - true - false - Prebuild.xml - 1595 - - - - - - - - - - - - diff --git a/Prebuild/doc/.svn/text-base/prebuild-example3.xml.svn-base b/Prebuild/doc/.svn/text-base/prebuild-example3.xml.svn-base deleted file mode 100644 index 0111562fd7..0000000000 --- a/Prebuild/doc/.svn/text-base/prebuild-example3.xml.svn-base +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - DEBUG;TRACE;WIN32 - - DEBUG;TRACE;POSIX - - false - false - false - 4 - - - false - 1591;219;1573;1572;168 - - - ..\bin - true - false - true - 285212672 - 4096 - false - Docs.xml - - - - - TRACE - true - false - false - 4 - false - 1591;219;1573;1572;168 - ..\bin - false - false - true - 285212672 - 4096 - false - Docs.xml - - - - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - - - ..\bin\lib\Utility - RealmForge.Utility.xml - - - ../bin - - - - - - - - - - - - - - - - - - - ..\bin - DemoGame.xml - - - - - ..\bin - DemoGame.xml - - - ../bin - - - - - - - - - - - - - - - - diff --git a/Prebuild/doc/.svn/text-base/prebuild-example4.xml.svn-base b/Prebuild/doc/.svn/text-base/prebuild-example4.xml.svn-base deleted file mode 100644 index e5861b89a4..0000000000 --- a/Prebuild/doc/.svn/text-base/prebuild-example4.xml.svn-base +++ /dev/null @@ -1,715 +0,0 @@ - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - 1 - 1595 - - - - SdlDotNet.build - prebuild.xml - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SdlDotNet.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - SdlDotNet.xml - false - 1 - 1595 - - - - - - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - Rectangles.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - Rectangles.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - Gears.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - Gears.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - CDPlayer.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - CDPlayer.xml - 1 - 1595 - - - - - - - - App.ico - CDPlayer.cs - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - MoviePlayer.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - MoviePlayer.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SimpleGame.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SimpleGame.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - BombRun.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - BombRun.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SnowDemo.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SnowDemo.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - BounceSprites.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - BounceSprites.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - Triad.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - Triad.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - GuiExample.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - GuiExample.xml - 1 - 1595 - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SpriteGuiDemos.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SpriteGuiDemos.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SdlDotNet.Tests.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SdlDotNet.Tests.xml - 1 - 1595 - - - - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - AudioExample.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - AudioExample.xml - 1 - 1595 - - - - - - - App.ico - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - SdlDotNet.Particles.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - SdlDotNet.Particles.xml - 1 - 1595 - - - - - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - ParticlesExample.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - ParticlesExample.xml - 1 - 1595 - - - - - - - - App.ico - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - NeHe.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - NeHe.xml - 1 - 1595 - - - - - - - - - - - App.ico - NeHe.cs - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - RedBook.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - RedBook.xml - 1 - 1595 - - - - - - - - - - - App.ico - RedBook.cs - - - - - - - - - DEBUG;TRACE - false - false - bin\Debug - true - PhysFsTest.xml - 4 - 1595 - - - - - TRACE - true - false - bin\Release - false - PhysFsTest.xml - 1 - 1595 - - - - - - - - App.ico - - - - - diff --git a/Prebuild/doc/.svn/text-base/prebuild-example5.xml.svn-base b/Prebuild/doc/.svn/text-base/prebuild-example5.xml.svn-base deleted file mode 100644 index 52215477eb..0000000000 --- a/Prebuild/doc/.svn/text-base/prebuild-example5.xml.svn-base +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - DEBUG;TRACE;WIN32 - false - true - bin\Debug - Tao.Sdl.xml - true - - - - - TRACE;WIN32 - true - true - bin\Release - Tao.Sdl.xml - false - - - - Tao.Sdl.License.txt - Tao.Sdl.Readme.txt - Tao.Sdl.snk - Tao.Sdl.dll.config - - - - - AssemblyInfo.cs - Sdl.cs - SdlImage.cs - SdlMixer.cs - SdlTtf.cs - SdlNet.cs - SdlGfx.cs - Smpeg.cs - DelegateCallingConventionCdeclAttribute.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - Tao.Sdl.Tests.xml - true - - - - - TRACE;WIN32 - true - false - bin\Release - Tao.Sdl.Tests.xml - false - - - - - - - AssemblyInfo.cs - SdlTest.cs - SdlTestVideo.cs - SdlTestImage.cs - SdlTestTtf.cs - SdlTestMixer.cs - SdlTestGfx.cs - SmpegTest.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - - AssemblyInfo.cs - Rectangles.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - - AssemblyInfo.cs - SmpegPlayer.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - - AssemblyInfo.cs - GfxPrimitives.cs - - - - - - DEBUG;TRACE;WIN32 - false - false - bin\Debug - true - - - - - TRACE;WIN32 - true - false - bin\Release - false - - - - - AssemblyInfo.cs - AppMain.cs - BuildProcessor.cs - Options.cs - ReleaseBuildProcessor.cs - UsageHelp.cs - - - - diff --git a/Prebuild/scripts/.svn/all-wcprops b/Prebuild/scripts/.svn/all-wcprops deleted file mode 100644 index b59b6a2fc0..0000000000 --- a/Prebuild/scripts/.svn/all-wcprops +++ /dev/null @@ -1,125 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 49 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/scripts -END -makefile.bat -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/240/trunk/Prebuild/scripts/makefile.bat -END -SharpDevelop2.bat -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/SharpDevelop2.bat -END -makefile.sh -K 25 -svn:wc:ra_dav:version-url -V 61 -/svnroot/dnpb/!svn/ver/240/trunk/Prebuild/scripts/makefile.sh -END -Clean.bat -K 25 -svn:wc:ra_dav:version-url -V 59 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/Clean.bat -END -Clean.sh -K 25 -svn:wc:ra_dav:version-url -V 58 -/svnroot/dnpb/!svn/ver/240/trunk/Prebuild/scripts/Clean.sh -END -Help.bat -K 25 -svn:wc:ra_dav:version-url -V 58 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/Help.bat -END -autotools.bat -K 25 -svn:wc:ra_dav:version-url -V 63 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/autotools.bat -END -Prebuild.nsi -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/116/trunk/Prebuild/scripts/Prebuild.nsi -END -VS2010.bat -K 25 -svn:wc:ra_dav:version-url -V 60 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/scripts/VS2010.bat -END -MonoDevelop.sh -K 25 -svn:wc:ra_dav:version-url -V 64 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/MonoDevelop.sh -END -VS2002.bat -K 25 -svn:wc:ra_dav:version-url -V 60 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/VS2002.bat -END -SharpDevelop.bat -K 25 -svn:wc:ra_dav:version-url -V 66 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/SharpDevelop.bat -END -autotools.sh -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/256/trunk/Prebuild/scripts/autotools.sh -END -VS2003.bat -K 25 -svn:wc:ra_dav:version-url -V 60 -/svnroot/dnpb/!svn/ver/196/trunk/Prebuild/scripts/VS2003.bat -END -VS2005.bat -K 25 -svn:wc:ra_dav:version-url -V 60 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/VS2005.bat -END -nant.bat -K 25 -svn:wc:ra_dav:version-url -V 58 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/nant.bat -END -VS2008.bat -K 25 -svn:wc:ra_dav:version-url -V 60 -/svnroot/dnpb/!svn/ver/288/trunk/Prebuild/scripts/VS2008.bat -END -xcode.bat -K 25 -svn:wc:ra_dav:version-url -V 59 -/svnroot/dnpb/!svn/ver/240/trunk/Prebuild/scripts/xcode.bat -END -nant.sh -K 25 -svn:wc:ra_dav:version-url -V 57 -/svnroot/dnpb/!svn/ver/205/trunk/Prebuild/scripts/nant.sh -END -xcode.sh -K 25 -svn:wc:ra_dav:version-url -V 58 -/svnroot/dnpb/!svn/ver/240/trunk/Prebuild/scripts/xcode.sh -END diff --git a/Prebuild/scripts/.svn/dir-prop-base b/Prebuild/scripts/.svn/dir-prop-base deleted file mode 100644 index 48246b7a5e..0000000000 --- a/Prebuild/scripts/.svn/dir-prop-base +++ /dev/null @@ -1,6 +0,0 @@ -K 10 -svn:ignore -V 12 -*.cmbx -*.swp -END diff --git a/Prebuild/scripts/.svn/entries b/Prebuild/scripts/.svn/entries deleted file mode 100644 index ee476a53c1..0000000000 --- a/Prebuild/scripts/.svn/entries +++ /dev/null @@ -1,708 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/scripts -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-05-08T05:43:01.449559Z -316 -jhurliman -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -makefile.bat -file - - - - -2010-09-10T22:51:44.000000Z -f6d151aad764b5bdb4113a119c9f3750 -2007-05-08T15:42:58.740059Z -240 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -102 - -SharpDevelop2.bat -file - - - - -2010-09-10T22:51:44.000000Z -432bf7063141f24bcc4e4a13ede3b6cf -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -210 - -makefile.sh -file - - - - -2010-09-10T22:51:44.000000Z -70db5cccbafa4f0019d3d9e0fbb6d884 -2007-05-08T15:42:58.740059Z -240 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -155 - -Clean.bat -file - - - - -2010-09-10T22:51:44.000000Z -f33b6d088290350f0d7cbc44e6c26854 -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -87 - -Clean.sh -file - - - - -2010-09-10T22:51:44.000000Z -0d402c1dc3ba5fa92a22721ee7faf47c -2007-05-08T15:42:58.740059Z -240 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -92 - -Help.bat -file - - - - -2010-09-10T22:51:44.000000Z -237f9b0bc08ef577209cf7119efbd456 -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -32 - -autotools.bat -file - - - - -2010-09-10T22:51:44.000000Z -3604bb1d38df33793e62c25e08362f59 -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -112 - -Prebuild.nsi -file - - - - -2010-09-10T22:51:44.000000Z -572ab49b75b83aece148667c55cb800b -2006-06-28T00:12:05.085067Z -116 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -6208 - -VS2010.bat -file - - - - -2010-09-10T22:51:44.000000Z -f6f61e3b45a19c4c011c9143da1ab274 -2010-05-08T05:43:01.449559Z -316 -jhurliman - - - - - - - - - - - - - - - - - - - - - -192 - -MonoDevelop.sh -file - - - - -2010-09-10T22:51:44.000000Z -1499f30edeaae42e200fa27a7c605fba -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -79 - -VS2002.bat -file - - - - -2010-09-10T22:51:44.000000Z -3ebbd6c68560aaf1ec9089cdd64f5fcd -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -189 - -SharpDevelop.bat -file - - - - -2010-09-10T22:51:44.000000Z -68ebe8c542c03966bf15bfae465c6616 -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -220 - -autotools.sh -file - - - - -2010-09-10T22:51:44.000000Z -3e82233011b4b61378fdfafec75105c3 -2008-02-07T16:31:29.630257Z -256 -cjcollier -has-props - - - - - - - - - - - - - - - - - - - - -163 - -VS2003.bat -file - - - - -2010-09-10T22:51:44.000000Z -d98909ce1a987763796c2d51bd51e861 -2006-12-30T09:17:33.472696Z -196 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -189 - -VS2005.bat -file - - - - -2010-09-10T22:51:44.000000Z -3a9c76a2bc4a7b72dacb5f9080b212a4 -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -203 - -nant.bat -file - - - - -2010-09-10T22:51:44.000000Z -b42b576139291f54b283c4e557f02140 -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -103 - -VS2008.bat -file - - - - -2010-09-10T22:51:44.000000Z -b239b3d67274fdac817fa0b41864bb01 -2009-02-09T18:52:49.114435Z -288 -diakopter -has-props - - - - - - - - - - - - - - - - - - - - -192 - -xcode.bat -file - - - - -2010-09-10T22:51:44.000000Z -adbdd25e0777620fafc9d087142d0747 -2007-05-08T15:42:58.740059Z -240 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -103 - -nant.sh -file - - - - -2010-09-10T22:51:44.000000Z -94a22105b89b89938829d63f70a628dc -2007-02-13T20:58:03.716560Z -205 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -61 - -xcode.sh -file - - - - -2010-09-10T22:51:44.000000Z -7f7b529278d58af6d9313e2a93f7f296 -2007-05-08T15:42:58.740059Z -240 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -62 - diff --git a/Prebuild/scripts/.svn/prop-base/Clean.bat.svn-base b/Prebuild/scripts/.svn/prop-base/Clean.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/Clean.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/Clean.sh.svn-base b/Prebuild/scripts/.svn/prop-base/Clean.sh.svn-base deleted file mode 100644 index 03b5bfa0ff..0000000000 --- a/Prebuild/scripts/.svn/prop-base/Clean.sh.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/Help.bat.svn-base b/Prebuild/scripts/.svn/prop-base/Help.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/Help.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/MonoDevelop.sh.svn-base b/Prebuild/scripts/.svn/prop-base/MonoDevelop.sh.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/MonoDevelop.sh.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/Prebuild.nsi.svn-base b/Prebuild/scripts/.svn/prop-base/Prebuild.nsi.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/scripts/.svn/prop-base/Prebuild.nsi.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/SharpDevelop.bat.svn-base b/Prebuild/scripts/.svn/prop-base/SharpDevelop.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/SharpDevelop.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/SharpDevelop2.bat.svn-base b/Prebuild/scripts/.svn/prop-base/SharpDevelop2.bat.svn-base deleted file mode 100644 index 869ac71cf7..0000000000 --- a/Prebuild/scripts/.svn/prop-base/SharpDevelop2.bat.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/VS2002.bat.svn-base b/Prebuild/scripts/.svn/prop-base/VS2002.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/VS2002.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/VS2003.bat.svn-base b/Prebuild/scripts/.svn/prop-base/VS2003.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/VS2003.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/VS2005.bat.svn-base b/Prebuild/scripts/.svn/prop-base/VS2005.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/VS2005.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/VS2008.bat.svn-base b/Prebuild/scripts/.svn/prop-base/VS2008.bat.svn-base deleted file mode 100644 index 869ac71cf7..0000000000 --- a/Prebuild/scripts/.svn/prop-base/VS2008.bat.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/autotools.bat.svn-base b/Prebuild/scripts/.svn/prop-base/autotools.bat.svn-base deleted file mode 100644 index 869ac71cf7..0000000000 --- a/Prebuild/scripts/.svn/prop-base/autotools.bat.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/autotools.sh.svn-base b/Prebuild/scripts/.svn/prop-base/autotools.sh.svn-base deleted file mode 100644 index 869ac71cf7..0000000000 --- a/Prebuild/scripts/.svn/prop-base/autotools.sh.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/makefile.bat.svn-base b/Prebuild/scripts/.svn/prop-base/makefile.bat.svn-base deleted file mode 100644 index 03b5bfa0ff..0000000000 --- a/Prebuild/scripts/.svn/prop-base/makefile.bat.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/makefile.sh.svn-base b/Prebuild/scripts/.svn/prop-base/makefile.sh.svn-base deleted file mode 100644 index 03b5bfa0ff..0000000000 --- a/Prebuild/scripts/.svn/prop-base/makefile.sh.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/nant.bat.svn-base b/Prebuild/scripts/.svn/prop-base/nant.bat.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/nant.bat.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/nant.sh.svn-base b/Prebuild/scripts/.svn/prop-base/nant.sh.svn-base deleted file mode 100644 index 5336d1069f..0000000000 --- a/Prebuild/scripts/.svn/prop-base/nant.sh.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/scripts/.svn/prop-base/xcode.bat.svn-base b/Prebuild/scripts/.svn/prop-base/xcode.bat.svn-base deleted file mode 100644 index 03b5bfa0ff..0000000000 --- a/Prebuild/scripts/.svn/prop-base/xcode.bat.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/prop-base/xcode.sh.svn-base b/Prebuild/scripts/.svn/prop-base/xcode.sh.svn-base deleted file mode 100644 index 03b5bfa0ff..0000000000 --- a/Prebuild/scripts/.svn/prop-base/xcode.sh.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 14 -svn:executable -V 1 -* -END diff --git a/Prebuild/scripts/.svn/text-base/Clean.bat.svn-base b/Prebuild/scripts/.svn/text-base/Clean.bat.svn-base deleted file mode 100644 index 806bbe8bd6..0000000000 --- a/Prebuild/scripts/.svn/text-base/Clean.bat.svn-base +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -Prebuild.exe /clean /yes /removedir obj /file prebuild.xml /build NET_2_0 /pause diff --git a/Prebuild/scripts/.svn/text-base/Clean.sh.svn-base b/Prebuild/scripts/.svn/text-base/Clean.sh.svn-base deleted file mode 100644 index b0a6530d80..0000000000 --- a/Prebuild/scripts/.svn/text-base/Clean.sh.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -./prebuild /clean /removedir obj /file ../prebuild.xml /pause -rm -rf ../Makefile diff --git a/Prebuild/scripts/.svn/text-base/Help.bat.svn-base b/Prebuild/scripts/.svn/text-base/Help.bat.svn-base deleted file mode 100644 index 7c843c46f8..0000000000 --- a/Prebuild/scripts/.svn/text-base/Help.bat.svn-base +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -Prebuild.exe /usage /pause \ No newline at end of file diff --git a/Prebuild/scripts/.svn/text-base/MonoDevelop.sh.svn-base b/Prebuild/scripts/.svn/text-base/MonoDevelop.sh.svn-base deleted file mode 100644 index fbd7669659..0000000000 --- a/Prebuild/scripts/.svn/text-base/MonoDevelop.sh.svn-base +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -prebuild /target monodev /file ../prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/.svn/text-base/Prebuild.nsi.svn-base b/Prebuild/scripts/.svn/text-base/Prebuild.nsi.svn-base deleted file mode 100644 index 8f9854e0ea..0000000000 --- a/Prebuild/scripts/.svn/text-base/Prebuild.nsi.svn-base +++ /dev/null @@ -1,231 +0,0 @@ -!verbose 3 - -!define PRODUCT_NAME "Prebuild" -!define PRODUCT_VERSION "1.3.1" -!define PRODUCT_PUBLISHER "Prebuild" -!define PRODUCT_PACKAGE "prebuild" -!define PRODUCT_WEB_SITE "http://dnpb.sourceforge.net" -!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Prebuild" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\Prebuild" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" -!define PRODUCT_PATH ".." - -;!define MUI_WELCOMEFINISHPAGE_BITMAP "PrebuildLogo.bmp" -;!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH -;!define MUI_UNWELCOMEFINISHPAGE_BITMAP "PrebuildLogo.bmp" -;!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH - -BrandingText "© 2003-2006 David Hudson, http://dnpb.sourceforge.net/" -SetCompressor lzma -CRCCheck on - -; File Association defines -;!include "fileassoc.nsh" - -; MUI 1.67 compatible ------ -!include "MUI.nsh" - -; MUI Settings -!define MUI_ABORTWARNING -!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" - -;-------------------------------- -;Variables - -;-------------------------------- -;Installer Pages - -; Welcome page -!insertmacro MUI_PAGE_WELCOME -; License page -!insertmacro MUI_PAGE_LICENSE "..\doc\license.txt" -; Directory page -!insertmacro MUI_PAGE_DIRECTORY - -; Instfiles page -!insertmacro MUI_PAGE_INSTFILES - -; Finish page -!insertmacro MUI_PAGE_FINISH - -;------------------------------------ -; Uninstaller pages -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH -;------------------------------------ - -; Language files -!insertmacro MUI_LANGUAGE "English" - -; Reserve files -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -; MUI end ------ - -Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -OutFile "..\${PRODUCT_PACKAGE}-${PRODUCT_VERSION}-setup.exe" -InstallDir "$PROGRAMFILES\Prebuild" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show - -; .NET Framework check -; http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dnnetdep/html/redistdeploy1_1.asp -; Section "Detecting that the .NET Framework 1.1 is installed" -Function .onInit - ReadRegDWORD $R0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" Install - StrCmp $R0 "" 0 CheckPreviousVersion - MessageBox MB_OK "Microsoft .NET Framework 1.1 was not found on this system.$\r$\n$\r$\nUnable to continue this installation." - Abort - - CheckPreviousVersion: - ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" - StrCmp $R0 "" CheckOSVersion 0 - MessageBox MB_OK "An old version of Prebuild is installed on this computer, please uninstall first.$\r$\n$\r$\nUnable to continue this installation." - Abort - - CheckOSVersion: - Call IsSupportedWindowsVersion - Pop $R0 - StrCmp $R0 "False" NoAbort 0 - MessageBox MB_OK "The operating system you are using is not supported by Prebuild (95/98/ME/NT3.x/NT4.x)." - Abort - - NoAbort: -FunctionEnd - -Section "Source" SecSource - SetOverwrite ifnewer - SetOutPath "$INSTDIR\src" - File /r /x *.swp /x .svn /x *.xml /x *.csproj /x *.user /x *.build /x *.prjx /x *.mdp /x bin /x obj /x *.nsi ${PRODUCT_PATH}\src\*.* - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR - -SectionEnd - -Section "Runtime" SecRuntime - SetOverwrite ifnewer - SetOutPath "$INSTDIR" - File /r /x *.swp /x .svn /x *.nsi /x src /x *.sln /x *.cmbx /x *.mds ${PRODUCT_PATH}\Prebuild.exe ${PRODUCT_PATH}\prebuild.xml - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR - -SectionEnd - -Section "Documentation" SecDocs - SetOverwrite ifnewer - SetOutPath "$INSTDIR\doc" - File /r /x *.swp /x .svn /x *.exe ${PRODUCT_PATH}\doc\*.* - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR -SectionEnd - -Section "Scripts" SecScripts - SetOverwrite ifnewer - SetOutPath "$INSTDIR\scripts" - File /r /x *.swp /x .svn /x *.nsi /x *.exe ${PRODUCT_PATH}\scripts\*.* - - ;Store installation folder - WriteRegStr HKCU "Software\Prebuild" "" $INSTDIR -SectionEnd - -;Language strings - -Section -AdditionalIcons - WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" -SectionEnd - -Section -Post - WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" -SectionEnd - -Section Uninstall - - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" - RMDir /r "$INSTDIR" - -SectionEnd - -; GetWindowsVersion, taken from NSIS help, modified for our purposes -Function IsSupportedWindowsVersion - - Push $R0 - Push $R1 - - ReadRegStr $R0 HKLM \ - "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - - IfErrors 0 lbl_winnt - - ; we are not NT - ReadRegStr $R0 HKLM \ - "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber - - StrCpy $R1 $R0 1 - StrCmp $R1 '4' 0 lbl_error - - StrCpy $R1 $R0 3 - - StrCmp $R1 '4.0' lbl_win32_95 - StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 - - lbl_win32_95: - StrCpy $R0 'False' - Goto lbl_done - - lbl_win32_98: - StrCpy $R0 'False' - Goto lbl_done - - lbl_win32_ME: - StrCpy $R0 'False' - Goto lbl_done - - lbl_winnt: - - StrCpy $R1 $R0 1 - - StrCmp $R1 '3' lbl_winnt_x - StrCmp $R1 '4' lbl_winnt_x - - StrCpy $R1 $R0 3 - - StrCmp $R1 '5.0' lbl_winnt_2000 - StrCmp $R1 '5.1' lbl_winnt_XP - StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error - - lbl_winnt_x: - StrCpy $R0 'False' - Goto lbl_done - - lbl_winnt_2000: - Strcpy $R0 'True' - Goto lbl_done - - lbl_winnt_XP: - Strcpy $R0 'True' - Goto lbl_done - - lbl_winnt_2003: - Strcpy $R0 'True' - Goto lbl_done - - lbl_error: - Strcpy $R0 'False' - lbl_done: - - Pop $R1 - Exch $R0 - -FunctionEnd diff --git a/Prebuild/scripts/.svn/text-base/SharpDevelop.bat.svn-base b/Prebuild/scripts/.svn/text-base/SharpDevelop.bat.svn-base deleted file mode 100644 index 08fea0bd16..0000000000 --- a/Prebuild/scripts/.svn/text-base/SharpDevelop.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a combine (.cmbx) and a set of project files (.prjx) -@rem for SharpDevelop (http://icsharpcode.net/OpenSource/SD/Default.aspx) -cd .. -Prebuild.exe /target sharpdev /file prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/.svn/text-base/SharpDevelop2.bat.svn-base b/Prebuild/scripts/.svn/text-base/SharpDevelop2.bat.svn-base deleted file mode 100644 index 49120abb7a..0000000000 --- a/Prebuild/scripts/.svn/text-base/SharpDevelop2.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a combine (.cmbx) and a set of project files (.prjx) -@rem for SharpDevelop (http://icsharpcode.net/OpenSource/SD/Default.aspx) -cd .. -Prebuild.exe /target sharpdev2 /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/VS2002.bat.svn-base b/Prebuild/scripts/.svn/text-base/VS2002.bat.svn-base deleted file mode 100644 index dc5b6a7cfd..0000000000 --- a/Prebuild/scripts/.svn/text-base/VS2002.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj) -@rem for Microsoft Visual Studio .NET 2002 -cd .. -Prebuild.exe /target vs2002 /file prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/.svn/text-base/VS2003.bat.svn-base b/Prebuild/scripts/.svn/text-base/VS2003.bat.svn-base deleted file mode 100644 index 929a480a16..0000000000 --- a/Prebuild/scripts/.svn/text-base/VS2003.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj) -@rem for Microsoft Visual Studio .NET 2002 -cd .. -Prebuild.exe /target vs2003 /file prebuild.xml /build NET_1_1 /pause diff --git a/Prebuild/scripts/.svn/text-base/VS2005.bat.svn-base b/Prebuild/scripts/.svn/text-base/VS2005.bat.svn-base deleted file mode 100644 index 7a7af1dafd..0000000000 --- a/Prebuild/scripts/.svn/text-base/VS2005.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) -@rem for Microsoft Visual Studio .NET 2005 -cd .. -Prebuild.exe /target vs2005 /file prebuild.xml /build NET_2_0 /pause diff --git a/Prebuild/scripts/.svn/text-base/VS2008.bat.svn-base b/Prebuild/scripts/.svn/text-base/VS2008.bat.svn-base deleted file mode 100644 index eb51a820cb..0000000000 --- a/Prebuild/scripts/.svn/text-base/VS2008.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) -@rem for Microsoft Visual Studio .NET 2008 -cd .. -Prebuild.exe /target vs2008 /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/VS2010.bat.svn-base b/Prebuild/scripts/.svn/text-base/VS2010.bat.svn-base deleted file mode 100644 index 1b98818b4b..0000000000 --- a/Prebuild/scripts/.svn/text-base/VS2010.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) -@rem for Microsoft Visual Studio .NET 2010 -cd .. -Prebuild.exe /target vs2010 /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/autotools.bat.svn-base b/Prebuild/scripts/.svn/text-base/autotools.bat.svn-base deleted file mode 100644 index 43f9a74647..0000000000 --- a/Prebuild/scripts/.svn/text-base/autotools.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates Makefiles -@rem for autotools -cd .. -Prebuild.exe /target autotools /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/autotools.sh.svn-base b/Prebuild/scripts/.svn/text-base/autotools.sh.svn-base deleted file mode 100644 index 4d140cebcf..0000000000 --- a/Prebuild/scripts/.svn/text-base/autotools.sh.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -RUNTIME=`which mono` - -SCRIPTDIR=`dirname $0` -${RUNTIME} ${SCRIPTDIR}/../Prebuild.exe /target autotools /file ${SCRIPTDIR}/../prebuild.xml /build NET_2_0 diff --git a/Prebuild/scripts/.svn/text-base/makefile.bat.svn-base b/Prebuild/scripts/.svn/text-base/makefile.bat.svn-base deleted file mode 100644 index eef9a69443..0000000000 --- a/Prebuild/scripts/.svn/text-base/makefile.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates makefiles -@rem for make -cd .. -Prebuild.exe /target makefile /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/makefile.sh.svn-base b/Prebuild/scripts/.svn/text-base/makefile.sh.svn-base deleted file mode 100644 index 2e656cba7b..0000000000 --- a/Prebuild/scripts/.svn/text-base/makefile.sh.svn-base +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -./prebuild /target makefile /file ../prebuild.xml /pause - -if [ -f ../Makefile ] -then - rm -rf ../Makefile -fi - -mv ../Prebuild.make ../Makefile diff --git a/Prebuild/scripts/.svn/text-base/nant.bat.svn-base b/Prebuild/scripts/.svn/text-base/nant.bat.svn-base deleted file mode 100644 index 925467d687..0000000000 --- a/Prebuild/scripts/.svn/text-base/nant.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a .build files -@rem for NAnt -cd .. -Prebuild.exe /target nant /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/nant.sh.svn-base b/Prebuild/scripts/.svn/text-base/nant.sh.svn-base deleted file mode 100644 index 0311971421..0000000000 --- a/Prebuild/scripts/.svn/text-base/nant.sh.svn-base +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -prebuild /target nant /file ../prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/xcode.bat.svn-base b/Prebuild/scripts/.svn/text-base/xcode.bat.svn-base deleted file mode 100644 index 9883edf0a1..0000000000 --- a/Prebuild/scripts/.svn/text-base/xcode.bat.svn-base +++ /dev/null @@ -1,4 +0,0 @@ -@rem Generates a Xcode files -@rem for NAnt -cd .. -Prebuild.exe /target xcode /file prebuild.xml /pause diff --git a/Prebuild/scripts/.svn/text-base/xcode.sh.svn-base b/Prebuild/scripts/.svn/text-base/xcode.sh.svn-base deleted file mode 100644 index e9b58f99d1..0000000000 --- a/Prebuild/scripts/.svn/text-base/xcode.sh.svn-base +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -prebuild /target xcode /file ../prebuild.xml /pause diff --git a/Prebuild/src/.svn/all-wcprops b/Prebuild/src/.svn/all-wcprops deleted file mode 100644 index bafaca9351..0000000000 --- a/Prebuild/src/.svn/all-wcprops +++ /dev/null @@ -1,23 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 45 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src -END -Prebuild.snk -K 25 -svn:wc:ra_dav:version-url -V 57 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/Prebuild.snk -END -App.ico -K 25 -svn:wc:ra_dav:version-url -V 52 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/App.ico -END -Prebuild.cs -K 25 -svn:wc:ra_dav:version-url -V 57 -/svnroot/dnpb/!svn/ver/308/trunk/Prebuild/src/Prebuild.cs -END diff --git a/Prebuild/src/.svn/dir-prop-base b/Prebuild/src/.svn/dir-prop-base deleted file mode 100644 index 68e5483c73..0000000000 --- a/Prebuild/src/.svn/dir-prop-base +++ /dev/null @@ -1,16 +0,0 @@ -K 10 -svn:ignore -V 121 -*.mdp -*.mds -*.pidb -bin -obj -Include.am -Prebuild.csproj -Prebuild.csproj.user -Prebuild.exe.build -Prebuild.prjx -Prebuild.xml - -END diff --git a/Prebuild/src/.svn/entries b/Prebuild/src/.svn/entries deleted file mode 100644 index 828496617b..0000000000 --- a/Prebuild/src/.svn/entries +++ /dev/null @@ -1,139 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-09-10T17:51:36.189738Z -323 -jhurliman -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -Prebuild.snk -file - - - - -2010-09-10T22:51:45.000000Z -89097ad015e09b35fc896e2128dea94d -2006-01-19T19:45:13.000000Z -45 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -596 - -Core -dir - -data -dir - -App.ico -file - - - - -2010-09-10T22:51:45.000000Z -4ee5c8b292635af0bf1247d425ba2c0d -2006-01-27T21:30:44.000000Z -68 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -4286 - -Prebuild.cs -file - - - - -2010-09-10T22:51:45.000000Z -55ae2c874ce7e9ab7f33cd6f75926733 -2009-04-15T01:33:14.373570Z -308 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -5040 - -Properties -dir - diff --git a/Prebuild/src/.svn/prop-base/App.ico.svn-base b/Prebuild/src/.svn/prop-base/App.ico.svn-base deleted file mode 100644 index 5e9587e658..0000000000 --- a/Prebuild/src/.svn/prop-base/App.ico.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/Prebuild/src/.svn/prop-base/Prebuild.cs.svn-base b/Prebuild/src/.svn/prop-base/Prebuild.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/.svn/prop-base/Prebuild.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/.svn/prop-base/Prebuild.snk.svn-base b/Prebuild/src/.svn/prop-base/Prebuild.snk.svn-base deleted file mode 100644 index 5e9587e658..0000000000 --- a/Prebuild/src/.svn/prop-base/Prebuild.snk.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/Prebuild/src/.svn/text-base/App.ico.svn-base b/Prebuild/src/.svn/text-base/App.ico.svn-base deleted file mode 100644 index ac4ea6f3c0b8554e84fb478312ec0e294a30aea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 - /// - /// - class Prebuild - { - #region Main - - [STAThread] - static void Main(string[] args) - { - Kernel kernel = null; - try - { - kernel = Kernel.Instance; - kernel.Initialize(LogTargets.File | LogTargets.Console, args); - bool exit = false; - - if(kernel.CommandLine.WasPassed("usage")) - { - exit = true; - OutputUsage(); - } - if(kernel.CommandLine.WasPassed("showtargets")) - { - exit = true; - OutputTargets(kernel); - } - if(kernel.CommandLine.WasPassed("install")) - { - exit = true; - InstallAssembly(kernel); - } - if(kernel.CommandLine.WasPassed("remove")) - { - exit = true; - RemoveAssembly(kernel); - } - - if(!exit) - { - kernel.Process(); - } - } -#if !DEBUG - catch (Exception ex) - { - Console.WriteLine("Unhandled error: {0}", ex.Message); - Console.WriteLine("{0}", ex.StackTrace); - } -#endif - finally - { - if(kernel != null && kernel.PauseAfterFinish) - { - Console.WriteLine("\nPress enter to continue..."); - Console.ReadLine(); - } - } - } - - #endregion - - #region Private Methods - - private static void InstallAssembly(Kernel kernel) - { - Publish publish = new Publish(); - string file = kernel.CommandLine["install"]; - //Console.WriteLine(".."+file+".."); - publish.GacInstall(file); - } - - private static void RemoveAssembly(Kernel kernel) - { - Publish publish = new Publish(); - string file = kernel.CommandLine["remove"]; - publish.GacRemove(file); - } - - private static void OutputUsage() - { - Console.WriteLine("Usage: prebuild /target [options]"); - Console.WriteLine("Available command-line switches:"); - Console.WriteLine(); - Console.WriteLine("/target Target for Prebuild"); - Console.WriteLine("/clean Clean the build files for the given target"); - Console.WriteLine("/file XML file to process"); - Console.WriteLine("/log Log file to write to"); - Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); - Console.WriteLine("/pause Pauses the application after execution to view the output"); - Console.WriteLine("/yes Default to yes to any questions asked"); - Console.WriteLine("/install Install assembly into the GAC"); - Console.WriteLine("/remove Remove assembly from the GAC"); - Console.WriteLine(); - Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); - Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); - Console.WriteLine(); - } - - private static void OutputTargets(Kernel kern) - { - Console.WriteLine("Targets available in Prebuild:"); - Console.WriteLine(""); - if(kern.Targets.Keys.Count > 0) - { - string[] targs = new string[kern.Targets.Keys.Count]; - kern.Targets.Keys.CopyTo(targs, 0); - Array.Sort(targs); - foreach(string target in targs) - { - Console.WriteLine(target); - } - } - Console.WriteLine(""); - } - - #endregion - } -} diff --git a/Prebuild/src/.svn/text-base/Prebuild.snk.svn-base b/Prebuild/src/.svn/text-base/Prebuild.snk.svn-base deleted file mode 100644 index f9dce054ffae7c79dce7d3ba0b790904bdb36831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097%QdipZe+P78+gioe1FL>Pm`A%NYNJjT zvr&utrO*Bz`;(~1&v7SLbo#8h8*Eu!T1$f&*Z!JD(@sjU;6;rE+#4q{`Ci_P6X~Os zsqTl*?$f+z`P@h&-Z=SV9gYc!udqrVAH@hG`xHwT1SMQBX^U%@gPO$V6JX)9KT9Ww>?9GKft(b~3CsqH2^BHX{_&xGMn ztAW9|iLO>;#yB;wrHus##d%AZDeNPu@F_TTzUscSGU=aLSyvelLiSJps^FvCxcYHV z4Y1$J$Wu2ek`e>_>d43PbVJq8mILALAW%&DDsyb=|xUms2{~U~!hI$4*kXem7!Hk=k zc1qQS!>`bZbL}5fr* - /// - /// - [Serializable()] - public class FatalException : Exception - { - #region Constructors - - - /// - /// Initializes a new instance of the class. - /// - public FatalException() - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The format. - /// The args. - public FatalException(string format, params object[] args) - : base(String.Format(format, args)) - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public FatalException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public FatalException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base b/Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base deleted file mode 100644 index 67051d5747..0000000000 --- a/Prebuild/src/Core/.svn/text-base/Kernel.cs.svn-base +++ /dev/null @@ -1,832 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Rob Loach (http://www.robloach.net), -C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -#define NO_VALIDATE - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Xml; -using System.Xml.Schema; -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core -{ - /// - /// - /// - public class Kernel : IDisposable - { - #region Inner Classes - - private struct NodeEntry - { - public Type Type; - public DataNodeAttribute Attribute; - } - - #endregion - - #region Fields - - private static readonly Kernel m_Instance = new Kernel(); - - /// - /// This must match the version of the schema that is embeeded - /// - private const string m_SchemaVersion = "1.9"; - private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; - private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; - bool disposed; - private Version m_Version; - private const string m_Revision = ""; - private CommandLineCollection m_CommandLine; - private Log m_Log; - private CurrentDirectory m_CurrentWorkingDirectory; - private XmlSchemaCollection m_Schemas; - - private readonly Dictionary m_Targets = new Dictionary(); - private readonly Dictionary m_Nodes = new Dictionary(); - - readonly List m_Solutions = new List(); - string m_Target; - string m_Clean; - string[] m_RemoveDirectories; - XmlDocument m_CurrentDoc; - bool m_PauseAfterFinish; - string[] m_ProjectGroups; - - #endregion - - #region Constructors - - private Kernel() - { - } - - #endregion - - #region Properties - - /// - /// Gets a value indicating whether [pause after finish]. - /// - /// true if [pause after finish]; otherwise, false. - public bool PauseAfterFinish - { - get - { - return m_PauseAfterFinish; - } - } - - /// - /// Gets the instance. - /// - /// The instance. - public static Kernel Instance - { - get - { - return m_Instance; - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); - } - } - - /// - /// Gets the command line. - /// - /// The command line. - public CommandLineCollection CommandLine - { - get - { - return m_CommandLine; - } - } - - /// - /// Gets the targets. - /// - /// The targets. - public Dictionary Targets - { - get - { - return m_Targets; - } - } - - /// - /// Gets the log. - /// - /// The log. - public Log Log - { - get - { - return m_Log; - } - } - - /// - /// Gets the current working directory. - /// - /// The current working directory. - public CurrentDirectory CurrentWorkingDirectory - { - get - { - return m_CurrentWorkingDirectory; - } - } - - /// - /// Gets the solutions. - /// - /// The solutions. - public List Solutions - { - get - { - return m_Solutions; - } - } - - /// - /// Gets the XmlDocument object representing the prebuild.xml - /// being processed - /// - /// The XmlDocument object - public XmlDocument CurrentDoc - { - get - { - return m_CurrentDoc; - } - } - - #endregion - - #region Private Methods - - private static void RemoveDirectories(string rootDir, string[] dirNames) - { - foreach(string dir in Directory.GetDirectories(rootDir)) - { - string simpleName = Path.GetFileName(dir); - - if(Array.IndexOf(dirNames, simpleName) != -1) - { - //delete if the name matches one of the directory names to delete - string fullDirPath = Path.GetFullPath(dir); - Directory.Delete(fullDirPath,true); - } - else//not a match, so check children - { - RemoveDirectories(dir,dirNames); - //recurse, checking children for them - } - } - } - -// private void RemoveDirectoryMatches(string rootDir, string dirPattern) -// { -// foreach(string dir in Directory.GetDirectories(rootDir)) -// { -// foreach(string match in Directory.GetDirectories(dir)) -// {//delete all child directories that match -// Directory.Delete(Path.GetFullPath(match),true); -// } -// //recure through the rest checking for nested matches to delete -// RemoveDirectoryMatches(dir,dirPattern); -// } -// } - - private void LoadSchema() - { - Assembly assembly = GetType().Assembly; - Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); - if(stream == null) - { - //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET - stream = assembly.GetManifestResourceStream(m_Schema); - if(stream == null) - { - throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); - } - } - XmlReader schema = new XmlTextReader(stream); - - m_Schemas = new XmlSchemaCollection(); - m_Schemas.Add(m_SchemaURI, schema); - } - - private void CacheVersion() - { - m_Version = Assembly.GetEntryAssembly().GetName().Version; - } - - private void CacheTargets(Assembly assm) - { - foreach(Type t in assm.GetTypes()) - { - TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); - - if(ta == null) - continue; - - if (t.IsAbstract) - continue; - - ITarget target = (ITarget)assm.CreateInstance(t.FullName); - if (target == null) - { - throw new MissingMethodException("Could not create ITarget instance"); - } - - m_Targets[ta.Name] = target; - } - } - - private void CacheNodeTypes(Assembly assm) - { - foreach(Type t in assm.GetTypes()) - { - foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) - { - NodeEntry ne = new NodeEntry(); - ne.Type = t; - ne.Attribute = dna; - m_Nodes[dna.Name] = ne; - } - } - } - - private void LogBanner() - { - m_Log.Write("Prebuild v" + Version); - m_Log.Write("Copyright (c) 2004-2010"); - m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); - m_Log.Write("Dan Moorehead (dan05a@gmail.com),"); - m_Log.Write("David Hudson (jendave@yahoo.com),"); - m_Log.Write("Rob Loach (http://www.robloach.net),"); - m_Log.Write("C.J. Adams-Collier (cjac@colliertech.org),"); - m_Log.Write("John Hurliman (john.hurliman@intel.com),"); - - m_Log.Write("See 'prebuild /usage' for help"); - m_Log.Write(); - } - - - - private void ProcessFile(string file) - { - ProcessFile(file, m_Solutions); - } - - public void ProcessFile(ProcessNode node, SolutionNode parent) - { - if (node.IsValid) - { - List list = new List(); - ProcessFile(node.Path, list); - - foreach (SolutionNode solution in list) - parent.SolutionsTable[solution.Name] = solution; - } - } - - /// - /// - /// - /// - /// - /// - public void ProcessFile(string file, IList solutions) - { - m_CurrentWorkingDirectory.Push(); - - string path = file; - try - { - try - { - path = Helper.ResolvePath(path); - } - catch(ArgumentException) - { - m_Log.Write("Could not open Prebuild file: " + path); - m_CurrentWorkingDirectory.Pop(); - return; - } - - Helper.SetCurrentDir(Path.GetDirectoryName(path)); - - XmlTextReader reader = new XmlTextReader(path); - - Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); - - //register command line arguments as XML variables - IEnumerator> dict = m_CommandLine.GetEnumerator(); - while (dict.MoveNext()) - { - string name = dict.Current.Key.Trim(); - if (name.Length > 0) - pre.RegisterVariable(name, dict.Current.Value); - } - - string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML - - // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the - // output before the system processes it. - if (m_CommandLine.WasPassed("ppi")) - { - // Get the filename if there is one, otherwise use a default. - string ppiFile = m_CommandLine["ppi"]; - if (ppiFile == null || ppiFile.Trim().Length == 0) - { - ppiFile = "preprocessed-input.xml"; - } - - // Write out the string to the given stream. - try - { - using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) - { - ppiWriter.WriteLine(xml); - } - } - catch(IOException ex) - { - Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); - } - - // Finish processing this special tag. - return; - } - - m_CurrentDoc = new XmlDocument(); - try - { -#if NO_VALIDATE - XmlReader validator = XmlReader.Create(new StringReader(xml)); - m_CurrentDoc.Load(validator); -#else - XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); - - //validate while reading from string into XmlDocument DOM structure in memory - foreach(XmlSchema schema in m_Schemas) - { - validator.Schemas.Add(schema); - } - m_CurrentDoc.Load(validator); -#endif - } - catch(XmlException e) - { - throw new XmlException(e.ToString()); - } - - //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details - if(m_CommandLine.WasPassed("ppo")) - { - string ppoFile = m_CommandLine["ppo"]; - if(ppoFile == null || ppoFile.Trim().Length < 1) - { - ppoFile = "preprocessed.xml"; - } - - StreamWriter writer = null; - try - { - writer = new StreamWriter(ppoFile); - writer.Write(xml); - } - catch(IOException ex) - { - Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); - } - finally - { - if(writer != null) - { - writer.Close(); - } - } - return; - } - //start reading the xml config file - XmlElement rootNode = m_CurrentDoc.DocumentElement; - //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); - Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); - - foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions - { - IDataNode dataNode = ParseNode(node, null); - if(dataNode is ProcessNode) - { - ProcessNode proc = (ProcessNode)dataNode; - if(proc.IsValid) - { - ProcessFile(proc.Path); - } - } - else if(dataNode is SolutionNode) - { - solutions.Add((SolutionNode)dataNode); - } - } - } - catch(XmlSchemaException xse) - { - m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", - xse.LineNumber, path, xse.Message); - } - finally - { - m_CurrentWorkingDirectory.Pop(); - } - } - - #endregion - - #region Public Methods - - /// - /// Allows the project. - /// - /// The project groups flags. - /// - public bool AllowProject(string projectGroupsFlags) - { - if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) - { - if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) - { - foreach(string group in projectGroupsFlags.Split('|')) - { - if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list - { - return true; - } - } - } - return false;//not included in the list or no groups specified for the project - } - return true;//no filter specified in the command line args - } - - /// - /// Gets the type of the node. - /// - /// The node. - /// - public Type GetNodeType(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(!m_Nodes.ContainsKey(node.Name)) - { - return null; - } - - NodeEntry ne = m_Nodes[node.Name]; - return ne.Type; - } - - /// - /// - /// - /// - /// - /// - public IDataNode ParseNode(XmlNode node, IDataNode parent) - { - return ParseNode(node, parent, null); - } - - //Create an instance of the data node type that is mapped to the name of the xml DOM node - /// - /// Parses the node. - /// - /// The node. - /// The parent. - /// The pre node. - /// - public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) - { - IDataNode dataNode; - - try - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(preNode == null) - { - if(!m_Nodes.ContainsKey(node.Name)) - { - Console.WriteLine("WARNING: Unknown XML node: " + node.Name); - return null; - } - - NodeEntry ne = m_Nodes[node.Name]; - Type type = ne.Type; - //DataNodeAttribute dna = ne.Attribute; - - dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); - if(dataNode == null) - { - throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); - } - } - else - dataNode = preNode; - - dataNode.Parent = parent; - dataNode.Parse(node); - } - catch(WarningException wex) - { - m_Log.Write(LogType.Warning, wex.Message); - return null; - } - catch(FatalException fex) - { - m_Log.WriteException(LogType.Error, fex); - throw; - } - catch(Exception ex) - { - m_Log.WriteException(LogType.Error, ex); - throw; - } - - return dataNode; - } - - /// - /// Initializes the specified target. - /// - /// The target. - /// The args. - public void Initialize(LogTargets target, string[] args) - { - CacheTargets(GetType().Assembly); - CacheNodeTypes(GetType().Assembly); - CacheVersion(); - - m_CommandLine = new CommandLineCollection(args); - - string logFile = null; - if(m_CommandLine.WasPassed("log")) - { - logFile = m_CommandLine["log"]; - - if(logFile != null && logFile.Length == 0) - { - logFile = "Prebuild.log"; - } - } - else - { - target = target & ~LogTargets.File; //dont output to a file - } - - m_Log = new Log(target, logFile); - LogBanner(); - - m_CurrentWorkingDirectory = new CurrentDirectory(); - - m_Target = m_CommandLine["target"]; - m_Clean = m_CommandLine["clean"]; - string removeDirs = m_CommandLine["removedir"]; - if(removeDirs != null && removeDirs.Length == 0) - { - m_RemoveDirectories = removeDirs.Split('|'); - } - - string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include - if(flags != null && flags.Length == 0) - { - m_ProjectGroups = flags.Split('|'); - } - m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); - - LoadSchema(); - } - - /// - /// Processes this instance. - /// - public void Process() - { - bool perfomedOtherTask = false; - if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) - { - try - { - RemoveDirectories(".",m_RemoveDirectories); - } - catch(IOException e) - { - m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); - m_Log.WriteException(LogType.Error,e); - } - catch(UnauthorizedAccessException e) - { - m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); - m_Log.WriteException(LogType.Error,e); - } - perfomedOtherTask = true; - } - - if(m_Target != null && m_Clean != null) - { - m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); - return; - } - - if(m_Target == null && m_Clean == null) - { - if(perfomedOtherTask) //finished - { - return; - } - m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); - return; - } - - string file = "./prebuild.xml"; - if(m_CommandLine.WasPassed("file")) - { - file = m_CommandLine["file"]; - } - - ProcessFile(file); - - string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); - bool clean = (m_Target == null); - if(clean && target != null && target.Length == 0) - { - target = "all"; - } - if(clean && target == "all")//default to all if no target was specified for clean - { - //check if they passed yes - if (!m_CommandLine.WasPassed("yes")) - { - Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); - string ret = Console.ReadLine(); - if(ret == null) - { - return; - } - ret = ret.Trim().ToLower(); - if((ret.ToLower() != "y" && ret.ToLower() != "yes")) - { - return; - } - } - //clean all targets (just cleaning vs2002 target didn't clean nant) - foreach(ITarget targ in m_Targets.Values) - { - targ.Clean(this); - } - } - else - { - if (!m_Targets.ContainsKey(target)) { - m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); - return; - } - ITarget targ = m_Targets[target]; - - if(clean) - { - targ.Clean(this); - } - else - { - targ.Write(this); - } - } - - m_Log.Flush(); - } - - #endregion - - #region IDisposable Members - - /// - /// - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose objects - /// - /// - /// If true, it will dispose close the handle - /// - /// - /// Will dispose managed and unmanaged resources. - /// - protected virtual void Dispose(bool disposing) - { - if (!disposed) - { - if (disposing) - { - GC.SuppressFinalize(this); - if (m_Log != null) - { - m_Log.Close(); - m_Log = null; - } - } - } - disposed = true; - } - - /// - /// - /// - ~Kernel() - { - Dispose(false); - } - - /// - /// Closes and destroys this object - /// - /// - /// Same as Dispose(true) - /// - public void Close() - { - Dispose(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base b/Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base deleted file mode 100644 index 607b66c022..0000000000 --- a/Prebuild/src/Core/.svn/text-base/UnknownLanguageException.cs.svn-base +++ /dev/null @@ -1,63 +0,0 @@ -/* - * $RCSfile$ - * Copyright (C) 2004, 2005 David Hudson (jendave@yahoo.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - [Serializable()] - public class UnknownLanguageException : Exception - { - /// - /// Basic exception. - /// - public UnknownLanguageException() - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public UnknownLanguageException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public UnknownLanguageException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - } -} diff --git a/Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base b/Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base deleted file mode 100644 index b7c3668cce..0000000000 --- a/Prebuild/src/Core/.svn/text-base/WarningException.cs.svn-base +++ /dev/null @@ -1,84 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - /// - [Serializable] - public class WarningException : Exception - { - #region Constructors - - /// - /// - /// - public WarningException() - { - } - - /// - /// - /// - /// - /// - public WarningException(string format, params object[] args) - : base(String.Format(format, args)) - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public WarningException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public WarningException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Attributes/.svn/all-wcprops b/Prebuild/src/Core/Attributes/.svn/all-wcprops deleted file mode 100644 index bb28016b6a..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/all-wcprops +++ /dev/null @@ -1,23 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 61 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes -END -OptionNodeAttribute.cs -K 25 -svn:wc:ra_dav:version-url -V 84 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs -END -DataNodeAttribute.cs -K 25 -svn:wc:ra_dav:version-url -V 82 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes/DataNodeAttribute.cs -END -TargetAttribute.cs -K 25 -svn:wc:ra_dav:version-url -V 80 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Attributes/TargetAttribute.cs -END diff --git a/Prebuild/src/Core/Attributes/.svn/dir-prop-base b/Prebuild/src/Core/Attributes/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/src/Core/Attributes/.svn/entries b/Prebuild/src/Core/Attributes/.svn/entries deleted file mode 100644 index 1ce535ee50..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/entries +++ /dev/null @@ -1,130 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Attributes -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -OptionNodeAttribute.cs -file - - - - -2010-09-10T22:51:44.000000Z -fe1b8740374f76dcb84f73de54376d48 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2240 - -DataNodeAttribute.cs -file - - - - -2010-09-10T22:51:44.000000Z -7988716ebc1c723842814e3eec197831 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2270 - -TargetAttribute.cs -file - - - - -2010-09-10T22:51:44.000000Z -766d4782c2b50f82a7c98e1eb968f42d -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2194 - diff --git a/Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/prop-base/DataNodeAttribute.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/prop-base/OptionNodeAttribute.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/prop-base/TargetAttribute.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base deleted file mode 100644 index f1938a2e20..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/text-base/DataNodeAttribute.cs.svn-base +++ /dev/null @@ -1,72 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Specialized; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] - public sealed class DataNodeAttribute : Attribute - { - #region Fields - - private string m_Name = "unknown"; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - public DataNodeAttribute(string name) - { - m_Name = name; - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base deleted file mode 100644 index 2d6a6a7bfc..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/text-base/OptionNodeAttribute.cs.svn-base +++ /dev/null @@ -1,71 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Field)] - public sealed class OptionNodeAttribute : Attribute - { - #region Fields - - private string m_NodeName; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// Name of the node. - public OptionNodeAttribute(string nodeName) - { - m_NodeName = nodeName; - } - - #endregion - - #region Properties - - /// - /// Gets the name of the node. - /// - /// The name of the node. - public string NodeName - { - get - { - return m_NodeName; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base b/Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base deleted file mode 100644 index 5ad62ee033..0000000000 --- a/Prebuild/src/Core/Attributes/.svn/text-base/TargetAttribute.cs.svn-base +++ /dev/null @@ -1,71 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] - public sealed class TargetAttribute : Attribute - { - #region Fields - - private string m_Name; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - public TargetAttribute(string name) - { - m_Name = name; - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Interfaces/.svn/all-wcprops b/Prebuild/src/Core/Interfaces/.svn/all-wcprops deleted file mode 100644 index 0359de207a..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/all-wcprops +++ /dev/null @@ -1,17 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 61 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Interfaces -END -ITarget.cs -K 25 -svn:wc:ra_dav:version-url -V 72 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Interfaces/ITarget.cs -END -IDataNode.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Interfaces/IDataNode.cs -END diff --git a/Prebuild/src/Core/Interfaces/.svn/dir-prop-base b/Prebuild/src/Core/Interfaces/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/src/Core/Interfaces/.svn/entries b/Prebuild/src/Core/Interfaces/.svn/entries deleted file mode 100644 index 0ff8913c37..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/entries +++ /dev/null @@ -1,96 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Interfaces -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -ITarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -52c732d42919f00330b2c4ed8b6360f8 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -1984 - -IDataNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -0ff6737b55b9bc4c63f9143c367a7e62 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -1900 - diff --git a/Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/prop-base/IDataNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/prop-base/ITarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base deleted file mode 100644 index 986dd2de8c..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/text-base/IDataNode.cs.svn-base +++ /dev/null @@ -1,47 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -namespace Prebuild.Core.Interfaces -{ - /// - /// - /// - public interface IDataNode - { - /// - /// Gets or sets the parent. - /// - /// The parent. - IDataNode Parent { get; set; } - /// - /// Parses the specified node. - /// - /// The node. - void Parse(XmlNode node); - } -} diff --git a/Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base b/Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base deleted file mode 100644 index 47115c658b..0000000000 --- a/Prebuild/src/Core/Interfaces/.svn/text-base/ITarget.cs.svn-base +++ /dev/null @@ -1,51 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Interfaces -{ - /// - /// - /// - public interface ITarget - { - /// - /// Writes the specified kern. - /// - /// The kern. - void Write(Kernel kern); - /// - /// Cleans the specified kern. - /// - /// The kern. - void Clean(Kernel kern); - /// - /// Gets the name. - /// - /// The name. - string Name { get; } - } -} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/.svn/all-wcprops b/Prebuild/src/Core/Nodes/.svn/all-wcprops deleted file mode 100644 index 6565f05bd7..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/all-wcprops +++ /dev/null @@ -1,119 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 56 -/svnroot/dnpb/!svn/ver/321/trunk/Prebuild/src/Core/Nodes -END -CleanFilesNode.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/CleanFilesNode.cs -END -ProjectNode.cs -K 25 -svn:wc:ra_dav:version-url -V 71 -/svnroot/dnpb/!svn/ver/319/trunk/Prebuild/src/Core/Nodes/ProjectNode.cs -END -ConfigurationNode.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/Core/Nodes/ConfigurationNode.cs -END -DataNode.cs -K 25 -svn:wc:ra_dav:version-url -V 68 -/svnroot/dnpb/!svn/ver/321/trunk/Prebuild/src/Core/Nodes/DataNode.cs -END -ReferencePathNode.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/ReferencePathNode.cs -END -SolutionNode.cs -K 25 -svn:wc:ra_dav:version-url -V 72 -/svnroot/dnpb/!svn/ver/315/trunk/Prebuild/src/Core/Nodes/SolutionNode.cs -END -ProcessNode.cs -K 25 -svn:wc:ra_dav:version-url -V 71 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/ProcessNode.cs -END -FileNode.cs -K 25 -svn:wc:ra_dav:version-url -V 68 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/Core/Nodes/FileNode.cs -END -DescriptionNode.cs -K 25 -svn:wc:ra_dav:version-url -V 75 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/DescriptionNode.cs -END -DatabaseReferenceNode.cs -K 25 -svn:wc:ra_dav:version-url -V 81 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs -END -ConfigurationNodeCollection.cs -K 25 -svn:wc:ra_dav:version-url -V 87 -/svnroot/dnpb/!svn/ver/315/trunk/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs -END -CleanupNode.cs -K 25 -svn:wc:ra_dav:version-url -V 71 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/CleanupNode.cs -END -ExcludeNode.cs -K 25 -svn:wc:ra_dav:version-url -V 71 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Nodes/ExcludeNode.cs -END -OptionsNode.cs -K 25 -svn:wc:ra_dav:version-url -V 71 -/svnroot/dnpb/!svn/ver/315/trunk/Prebuild/src/Core/Nodes/OptionsNode.cs -END -DatabaseProjectNode.cs -K 25 -svn:wc:ra_dav:version-url -V 79 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs -END -MatchNode.cs -K 25 -svn:wc:ra_dav:version-url -V 69 -/svnroot/dnpb/!svn/ver/318/trunk/Prebuild/src/Core/Nodes/MatchNode.cs -END -ReferenceNode.cs -K 25 -svn:wc:ra_dav:version-url -V 73 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Nodes/ReferenceNode.cs -END -FilesNode.cs -K 25 -svn:wc:ra_dav:version-url -V 69 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/FilesNode.cs -END -AuthorNode.cs -K 25 -svn:wc:ra_dav:version-url -V 70 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Nodes/AuthorNode.cs -END diff --git a/Prebuild/src/Core/Nodes/.svn/dir-prop-base b/Prebuild/src/Core/Nodes/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/src/Core/Nodes/.svn/entries b/Prebuild/src/Core/Nodes/.svn/entries deleted file mode 100644 index b60f190c46..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/entries +++ /dev/null @@ -1,674 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Nodes -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-08-12T16:58:08.825470Z -321 -jhurliman -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -CleanFilesNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -c798b3c4167ec1a3815ddae93a552427 -2009-04-15T01:28:16.827957Z -307 -kunnis - - - - - - - - - - - - - - - - - - - - - -2666 - -ProjectNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -be9ade7048917117783a06508fa4d378 -2010-05-09T23:19:49.063286Z -319 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -13444 - -ConfigurationNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -e42a548bfaba22cf94dbb203b2b28352 -2010-05-08T05:43:01.449559Z -316 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -5222 - -DataNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -39b1d83bff018fce9f616ae2e6f1be82 -2010-08-12T16:58:08.825470Z -321 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -3294 - -ReferencePathNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -409c91bafff2572218a6cdefcc6ec48c -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2677 - -SolutionNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -79bdf34c92682dc5ba8b5db15aaa95d6 -2009-06-06T19:47:31.451428Z -315 -dmoonfire -has-props - - - - - - - - - - - - - - - - - - - - -9720 - -ProcessNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -1816314797ef66235c58938b33ea2b3b -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2900 - -FileNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -43f98599da19618be6c6ed74f36fceae -2010-05-08T05:43:01.449559Z -316 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -6043 - -DescriptionNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -3f8a8b8cc4b3a94b94109276ad2222d3 -2009-04-15T01:28:16.827957Z -307 -kunnis - - - - - - - - - - - - - - - - - - - - - -2493 - -DatabaseReferenceNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -4104ed953ae9105ac6498ce7882ed8ee -2009-02-19T06:47:52.218324Z -295 -kunnis - - - - - - - - - - - - - - - - - - - - - -2390 - -ConfigurationNodeCollection.cs -file - - - - -2010-09-10T22:51:44.000000Z -8620885fc85bdc06288acf6b8f58b3ff -2009-06-06T19:47:31.451428Z -315 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -2406 - -CleanupNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -198fb1e15cd545655978686277e39d96 -2009-04-15T01:28:16.827957Z -307 -kunnis - - - - - - - - - - - - - - - - - - - - - -2689 - -ExcludeNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -810fc73f537028052471239c72f41c11 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2608 - -OptionsNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -691dd5f7e7ce2a06814cdcae611fc40e -2009-06-06T19:47:31.451428Z -315 -dmoonfire -has-props - - - - - - - - - - - - - - - - - - - - -10949 - -DatabaseProjectNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -18995e6577e6bb3622fe41f5bfe01b48 -2009-04-15T01:28:16.827957Z -307 -kunnis - - - - - - - - - - - - - - - - - - - - - -2476 - -MatchNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -3344ef3bdb7db2006eb987a80128cd06 -2010-05-09T08:21:52.307305Z -318 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -10846 - -ReferenceNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -18d76c27d53a4d54f16f57a855a21916 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -3705 - -FilesNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -e6ddefd5fff49958f77b5ef96f06c09e -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -6036 - -AuthorNode.cs -file - - - - -2010-09-10T22:51:44.000000Z -07607d8988fc1236ab8bef5fc12f8cd5 -2009-04-15T01:28:16.827957Z -307 -kunnis - - - - - - - - - - - - - - - - - - - - - -2425 - diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/ConfigurationNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/DataNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/ExcludeNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/FileNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/FilesNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/MatchNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/OptionsNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/ProcessNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/ProjectNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/ReferenceNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/ReferencePathNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/prop-base/SolutionNode.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base deleted file mode 100644 index 4c415bb6b1..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/AuthorNode.cs.svn-base +++ /dev/null @@ -1,87 +0,0 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Author")] - public class AuthorNode : DataNode - { - #region Fields - - private string m_Signature; - - #endregion - - #region Properties - - /// - /// Gets the signature. - /// - /// The signature. - public string Signature - { - get - { - return m_Signature; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Signature = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Signature == null) - { - m_Signature = ""; - } - - m_Signature = m_Signature.Trim(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base deleted file mode 100644 index 71405f9aaa..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/CleanFilesNode.cs.svn-base +++ /dev/null @@ -1,80 +0,0 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("CleanFiles")] - public class CleanFilesNode : DataNode - { - #region Fields - - private string m_Pattern; - - #endregion - - #region Properties - - /// - /// Gets the signature. - /// - /// The signature. - public string Pattern - { - get - { - return m_Pattern; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; - m_Pattern = m_Pattern.Trim(); - } - - #endregion - } -} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base deleted file mode 100644 index b8131b0ebb..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/CleanupNode.cs.svn-base +++ /dev/null @@ -1,85 +0,0 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; - -namespace Prebuild.Core.Nodes -{ - [DataNode("Cleanup")] - public class CleanupNode : DataNode - { - #region Fields - - private List m_CleanFiles = new List(); - - #endregion - - #region Properties - - /// - /// Gets the signature. - /// - /// The signature. - public List CleanFiles - { - get - { - return m_CleanFiles; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach (XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if (dataNode is CleanFilesNode) - { - m_CleanFiles.Add((CleanFilesNode)dataNode); - } - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base deleted file mode 100644 index cd2f740ae7..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNode.cs.svn-base +++ /dev/null @@ -1,225 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Configuration")] - public class ConfigurationNode : DataNode, ICloneable, IComparable - { - #region Fields - - private string m_Name = "unknown"; - private string m_Platform = "AnyCPU"; - private OptionsNode m_Options; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public ConfigurationNode() - { - m_Options = new OptionsNode(); - } - - #endregion - - #region Properties - - /// - /// Gets or sets the parent. - /// - /// The parent. - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - base.Parent = value; - if(base.Parent is SolutionNode) - { - SolutionNode node = (SolutionNode)base.Parent; - if(node != null && node.Options != null) - { - node.Options.CopyTo(m_Options); - } - } - } - } - - /// - /// Identifies the platform for this specific configuration. - /// - public string Platform - { - get - { - return m_Platform; - } - set - { - switch ((value + "").ToLower()) - { - case "x86": - case "x64": - m_Platform = value; - break; - case "itanium": - m_Platform = "Itanium"; - break; - default: - m_Platform = "AnyCPU"; - break; - } - } - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the name and platform for the configuration. - /// - /// The name and platform. - public string NameAndPlatform - { - get - { - string platform = m_Platform; - if (platform == "AnyCPU") - platform = "Any CPU"; - - return String.Format("{0}|{1}", m_Name, platform); - } - } - - /// - /// Gets or sets the options. - /// - /// The options. - public OptionsNode Options - { - get - { - return m_Options; - } - set - { - m_Options = value; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - Platform = Helper.AttributeValue(node, "platform", m_Platform); - - if (node == null) - { - throw new ArgumentNullException("node"); - } - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is OptionsNode) - { - ((OptionsNode)dataNode).CopyTo(m_Options); - } - } - } - - /// - /// Copies to. - /// - /// The conf. - public void CopyTo(ConfigurationNode conf) - { - m_Options.CopyTo(conf.m_Options); - } - - #endregion - - #region ICloneable Members - - /// - /// Creates a new object that is a copy of the current instance. - /// - /// - /// A new object that is a copy of this instance. - /// - public object Clone() - { - ConfigurationNode ret = new ConfigurationNode(); - ret.m_Name = m_Name; - ret.m_Platform = m_Platform; - m_Options.CopyTo(ret.m_Options); - return ret; - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ConfigurationNode that = (ConfigurationNode) obj; - return this.m_Name.CompareTo(that.m_Name); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base deleted file mode 100644 index 1c38d9e443..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ConfigurationNodeCollection.cs.svn-base +++ /dev/null @@ -1,71 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System.Collections.Generic; - -namespace Prebuild.Core.Nodes -{ - /// - /// Implements a specialized list of configuration nodes which allows for lookup via - /// configuration name and platform. - /// - public class ConfigurationNodeCollection : List - { - #region Properties - - public ConfigurationNode this[string nameAndPlatform] - { - get - { - foreach (ConfigurationNode configurationNode in this) - { - if (configurationNode.NameAndPlatform == nameAndPlatform) - { - return configurationNode; - } - } - - return null; - } - - set - { - // See if the node - ConfigurationNode configurationNode = this[nameAndPlatform]; - - if (configurationNode != null) - { - this[IndexOf(configurationNode)] = value; - } - else - { - Add(value); - } - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base deleted file mode 100644 index 318b13ccb9..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/DataNode.cs.svn-base +++ /dev/null @@ -1,117 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using System.IO; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - public abstract class DataNode : IDataNode - { - #region Fields - - private IDataNode parent; - string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; - - #endregion - - #region IDataNode Members - - /// - /// Gets or sets the parent. - /// - /// The parent. - public virtual IDataNode Parent - { - get - { - return parent; - } - set - { - parent = value; - } - } - public string[] WebTypes - { - get { return m_WebTypes; } - } - /// - /// Parses the specified node. - /// - /// The node. - public virtual void Parse(XmlNode node) - { - } - public BuildAction GetBuildActionByFileName(string fileName) - { - string extension = Path.GetExtension(fileName).ToLower(); - foreach (string type in WebTypes) - { - if (extension == type) - return BuildAction.Content; - } - return BuildAction.Compile; - } - /// - /// Parses the file type to figure out what type it is - /// - /// - public SubType GetSubTypeByFileName(string fileName) - { - string extension = System.IO.Path.GetExtension(fileName).ToLower(); - string designer = String.Format(".designer{0}", extension); - string path = fileName.ToLower(); - if (extension == ".resx") - { - return SubType.Designer; - } - else if (path.EndsWith(".settings")) - { - return SubType.Settings; - } - else - { - - foreach (string type in WebTypes) - { - if (path.EndsWith(type)) - { - return SubType.CodeBehind; - } - } - } - return SubType.Code; - } - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base deleted file mode 100644 index 278ecd81ce..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseProjectNode.cs.svn-base +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("DatabaseProject")] - public class DatabaseProjectNode : DataNode - { - string name; - string path; - string fullpath; - Guid guid = Guid.NewGuid(); - readonly List authors = new List(); - readonly List references = new List(); - - public Guid Guid - { - get { return guid; } - } - - public string Name - { - get { return name; } - } - - public string Path - { - get { return path; } - } - - public string FullPath - { - get { return fullpath; } - } - - public IEnumerable References - { - get { return references; } - } - - public override void Parse(XmlNode node) - { - name = Helper.AttributeValue(node, "name", name); - path = Helper.AttributeValue(node, "path", name); - - try - { - fullpath = Helper.ResolvePath(path); - } - catch - { - throw new WarningException("Could not resolve Solution path: {0}", path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - - try - { - Helper.SetCurrentDir(fullpath); - - if (node == null) - { - throw new ArgumentNullException("node"); - } - - foreach (XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - - if (dataNode == null) - continue; - - if (dataNode is AuthorNode) - authors.Add((AuthorNode)dataNode); - else if (dataNode is DatabaseReferenceNode) - references.Add((DatabaseReferenceNode)dataNode); - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - - base.Parse(node); - } - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base deleted file mode 100644 index 845db24b12..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/DatabaseReferenceNode.cs.svn-base +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using Prebuild.Core.Attributes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("DatabaseReference")] - public class DatabaseReferenceNode : DataNode - { - string name; - Guid providerId; - string connectionString; - - public string Name - { - get { return name; } - } - - public Guid ProviderId - { - get { return providerId; } - } - - public string ConnectionString - { - get { return connectionString; } - } - - public override void Parse(System.Xml.XmlNode node) - { - name = Helper.AttributeValue(node, "name", name); - - string providerName = Helper.AttributeValue(node, "providerName", string.Empty); - if (providerName != null) - { - switch (providerName) - { - // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* - // Not sure if these will help other operating systems, or if there's a better way. - case "Microsoft.SqlServerCe.Client.3.5": - providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; - case "System.Data.OleDb": - providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; - case "System.Data.OracleClient": - providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; - case "System.Data.SqlClient": - providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; - case "System.Data.Odbc": - providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; - - default: - throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); - } - } - else - providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); - - connectionString = Helper.AttributeValue(node, "connectionString", connectionString); - - base.Parse(node); - } - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base deleted file mode 100644 index d1293a0c80..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/DescriptionNode.cs.svn-base +++ /dev/null @@ -1,87 +0,0 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// The object representing the /Prebuild/Solution/Project/Description element - /// - [DataNode("Description")] - public class DescriptionNode : DataNode - { - #region Fields - - private string m_Value; - - #endregion - - #region Properties - - /// - /// Gets the description Value. - /// - /// The description Value. - public string Value - { - get - { - return m_Value; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Value = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Value == null) - { - m_Value = ""; - } - - m_Value = m_Value.Trim(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base deleted file mode 100644 index 7f04cba72f..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ExcludeNode.cs.svn-base +++ /dev/null @@ -1,89 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Exclude")] - public class ExcludeNode : DataNode - { - #region Fields - - private string m_Pattern = ""; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Pattern; - } - } - - /// - /// Gets the pattern. - /// - /// The pattern. - public string Pattern - { - get - { - return m_Pattern; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); - m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base deleted file mode 100644 index 01cea1ebdb..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/FileNode.cs.svn-base +++ /dev/null @@ -1,285 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; -using Prebuild.Core.Targets; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - public enum BuildAction - { - /// - /// - /// - None, - /// - /// - /// - Compile, - /// - /// - /// - Content, - /// - /// - /// - EmbeddedResource, - /// - /// - /// - ApplicationDefinition, - /// - /// - /// - Page - } - - /// - /// - /// - public enum SubType - { - /// - /// - /// - Code, - /// - /// - /// - Component, - /// - /// - /// - Designer, - /// - /// - /// - Form, - /// - /// - /// - Settings, - /// - /// - /// - UserControl, - /// - /// - /// - CodeBehind, - } - - public enum CopyToOutput - { - Never, - Always, - PreserveNewest - } - - /// - /// - /// - [DataNode("File")] - public class FileNode : DataNode - { - #region Fields - - private string m_Path; - private string m_ResourceName = ""; - private BuildAction? m_BuildAction; - private bool m_Valid; - private SubType? m_SubType; - private CopyToOutput m_CopyToOutput = CopyToOutput.Never; - private bool m_Link = false; - private string m_LinkPath = string.Empty; - private bool m_PreservePath = false; - - - #endregion - - #region Properties - - /// - /// - /// - public string Path - { - get - { - return m_Path; - } - } - - /// - /// - /// - public string ResourceName - { - get - { - return m_ResourceName; - } - } - - /// - /// - /// - public BuildAction BuildAction - { - get - { - if (m_BuildAction != null) - return m_BuildAction.Value; - else - return GetBuildActionByFileName(this.Path); - - } - } - - public CopyToOutput CopyToOutput - { - get - { - return this.m_CopyToOutput; - } - } - - public bool IsLink - { - get - { - return this.m_Link; - } - } - - public string LinkPath - { - get - { - return this.m_LinkPath; - } - } - /// - /// - /// - public SubType SubType - { - get - { - if (m_SubType != null) - return m_SubType.Value; - else - return GetSubTypeByFileName(this.Path); - } - } - - /// - /// - /// - public bool IsValid - { - get - { - return m_Valid; - } - } - - /// - /// - /// - /// - /// - public bool PreservePath - { - get - { - return m_PreservePath; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); - if (buildAction != string.Empty) - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - string subType = Helper.AttributeValue(node, "subType", string.Empty); - if (subType != String.Empty) - m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); - - m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); - this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); - if ( this.m_Link == true ) - { - this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); - } - this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); - this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - m_Path = m_Path.Trim(); - m_Valid = true; - if(!File.Exists(m_Path)) - { - m_Valid = false; - Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); - } - - if (System.IO.Path.GetExtension(m_Path) == ".settings") - { - m_SubType = SubType.Settings; - m_BuildAction = BuildAction.None; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base deleted file mode 100644 index 23a716cfde..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/FilesNode.cs.svn-base +++ /dev/null @@ -1,204 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using System.IO; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Files")] - public class FilesNode : DataNode - { - #region Fields - - private readonly List m_Files = new List(); - private readonly Dictionary m_BuildActions = new Dictionary(); - private readonly Dictionary m_SubTypes = new Dictionary(); - private readonly Dictionary m_ResourceNames = new Dictionary(); - private readonly Dictionary m_CopyToOutputs = new Dictionary(); - private readonly Dictionary m_Links = new Dictionary(); - private readonly Dictionary m_LinkPaths = new Dictionary(); - private readonly Dictionary m_PreservePaths = new Dictionary(); - - #endregion - - #region Properties - - public int Count - { - get - { - return m_Files.Count; - } - } - - #endregion - - #region Public Methods - - public BuildAction GetBuildAction(string file) - { - if(!m_BuildActions.ContainsKey(file)) - { - return BuildAction.Compile; - } - - return m_BuildActions[file]; - } - - public CopyToOutput GetCopyToOutput(string file) - { - if (!m_CopyToOutputs.ContainsKey(file)) - { - return CopyToOutput.Never; - } - return m_CopyToOutputs[file]; - } - - public bool GetIsLink(string file) - { - if (!m_Links.ContainsKey(file)) - { - return false; - } - return m_Links[file]; - } - - public bool Contains(string file) - { - return m_Files.Contains(file); - } - - public string GetLinkPath( string file ) - { - if ( !m_LinkPaths.ContainsKey( file ) ) - { - return string.Empty; - } - return m_LinkPaths[ file ]; - } - - public SubType GetSubType(string file) - { - if(!m_SubTypes.ContainsKey(file)) - { - return SubType.Code; - } - - return m_SubTypes[file]; - } - - public string GetResourceName(string file) - { - if(!m_ResourceNames.ContainsKey(file)) - { - return string.Empty; - } - - return m_ResourceNames[file]; - } - - public bool GetPreservePath( string file ) - { - if ( !m_PreservePaths.ContainsKey( file ) ) - { - return false; - } - - return m_PreservePaths[ file ]; - } - - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is FileNode) - { - FileNode fileNode = (FileNode)dataNode; - if(fileNode.IsValid) - { - if (!m_Files.Contains(fileNode.Path)) - { - m_Files.Add(fileNode.Path); - m_BuildActions[fileNode.Path] = fileNode.BuildAction; - m_SubTypes[fileNode.Path] = fileNode.SubType; - m_ResourceNames[fileNode.Path] = fileNode.ResourceName; - m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; - m_Links[ fileNode.Path ] = fileNode.IsLink; - m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; - m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; - - } - } - } - else if(dataNode is MatchNode) - { - foreach(string file in ((MatchNode)dataNode).Files) - { - MatchNode matchNode = (MatchNode)dataNode; - if (!m_Files.Contains(file)) - { - m_Files.Add(file); - if (matchNode.BuildAction == null) - m_BuildActions[file] = GetBuildActionByFileName(file); - else - m_BuildActions[file] = matchNode.BuildAction.Value; - m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; - m_ResourceNames[ file ] = matchNode.ResourceName; - m_PreservePaths[ file ] = matchNode.PreservePath; - m_Links[ file ] = matchNode.IsLink; - m_LinkPaths[ file ] = matchNode.LinkPath; - m_CopyToOutputs[ file ] = matchNode.CopyToOutput; - - } - } - } - } - } - - // TODO: Check in to why StringCollection's enumerator doesn't implement - // IEnumerator? - public IEnumerator GetEnumerator() - { - return m_Files.GetEnumerator(); - } - - #endregion - - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base deleted file mode 100644 index 9735265f05..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/MatchNode.cs.svn-base +++ /dev/null @@ -1,367 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Match")] - public class MatchNode : DataNode - { - #region Fields - - private readonly List m_Files = new List(); - private Regex m_Regex; - private BuildAction? m_BuildAction; - private SubType? m_SubType; - string m_ResourceName = ""; - private CopyToOutput m_CopyToOutput; - private bool m_Link; - private string m_LinkPath; - private bool m_PreservePath; - private readonly List m_Exclusions = new List(); - - #endregion - - #region Properties - - /// - /// - /// - public IEnumerable Files - { - get - { - return m_Files; - } - } - - /// - /// - /// - public BuildAction? BuildAction - { - get - { - return m_BuildAction; - } - } - - /// - /// - /// - public SubType? SubType - { - get - { - return m_SubType; - } - } - - public CopyToOutput CopyToOutput - { - get - { - return m_CopyToOutput; - } - } - - public bool IsLink - { - get - { - return m_Link; - } - } - - public string LinkPath - { - get - { - return m_LinkPath; - } - } - /// - /// - /// - public string ResourceName - { - get - { - return m_ResourceName; - } - } - - public bool PreservePath - { - get - { - return m_PreservePath; - } - } - - #endregion - - #region Private Methods - - /// - /// Recurses the directories. - /// - /// The path. - /// The pattern. - /// if set to true [recurse]. - /// if set to true [use regex]. - private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List exclusions) - { - Match match; - try - { - string[] files; - - Boolean excludeFile; - if(!useRegex) - { - try - { - files = Directory.GetFiles(path, pattern); - } - catch (IOException) - { - // swallow weird IOException error when running in a virtual box - // guest OS on a network share when the host OS is not Windows. - // This seems to happen on network shares - // when no files match, and may be related to this report: - // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=254546 - - files = null; - } - - if(files != null) - { - foreach (string file in files) - { - excludeFile = false; - string fileTemp; - if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") - { - fileTemp = file.Substring(2); - } - else - { - fileTemp = file; - } - - // Check all excludions and set flag if there are any hits. - foreach ( ExcludeNode exclude in exclusions ) - { - Regex exRegEx = new Regex( exclude.Pattern ); - match = exRegEx.Match( file ); - excludeFile |= match.Success; - } - - if ( !excludeFile ) - { - m_Files.Add( fileTemp ); - } - - } - } - - // don't call return here, because we may need to recursively search directories below - // this one, even if no matches were found in this directory. - } - else - { - try - { - files = Directory.GetFiles(path); - } - catch (IOException) - { - // swallow weird IOException error when running in a virtual box - // guest OS on a network share. - files = null; - } - - if (files != null) - { - foreach (string file in files) - { - excludeFile = false; - - match = m_Regex.Match(file); - if (match.Success) - { - // Check all excludions and set flag if there are any hits. - foreach (ExcludeNode exclude in exclusions) - { - Regex exRegEx = new Regex(exclude.Pattern); - match = exRegEx.Match(file); - excludeFile |= !match.Success; - } - - if (!excludeFile) - { - m_Files.Add(file); - } - } - } - } - } - - if(recurse) - { - string[] dirs = Directory.GetDirectories(path); - if(dirs != null && dirs.Length > 0) - { - foreach (string str in dirs) - { - // hack to skip subversion folders. Not having this can cause - // a significant performance hit when running on a network drive. - if (str.EndsWith(".svn")) - continue; - - RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); - } - } - } - } - catch(DirectoryNotFoundException) - { - return; - } - catch(ArgumentException) - { - return; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - string path = Helper.AttributeValue(node, "path", "."); - string pattern = Helper.AttributeValue(node, "pattern", "*"); - bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); - bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); - string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); - if (buildAction != string.Empty) - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - - //TODO: Figure out where the subtype node is being assigned - //string subType = Helper.AttributeValue(node, "subType", string.Empty); - //if (subType != String.Empty) - // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); - m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName); - m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", m_CopyToOutput.ToString())); - m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); - if ( m_Link ) - { - m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); - } - m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); - - - if(path != null && path.Length == 0) - { - path = ".";//use current directory - } - //throw new WarningException("Match must have a 'path' attribute"); - - if(pattern == null) - { - throw new WarningException("Match must have a 'pattern' attribute"); - } - - path = Helper.NormalizePath(path); - if(!Directory.Exists(path)) - { - throw new WarningException("Match path does not exist: {0}", path); - } - - try - { - if(useRegex) - { - m_Regex = new Regex(pattern); - } - } - catch(ArgumentException ex) - { - throw new WarningException("Could not compile regex pattern: {0}", ex.Message); - } - - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is ExcludeNode) - { - ExcludeNode excludeNode = (ExcludeNode)dataNode; - m_Exclusions.Add( excludeNode ); - } - } - - RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); - - if (m_Files.Count < 1) - { - // Include the project name when the match node returns no matches to provide extra - // debug info. - ProjectNode project = Parent.Parent as ProjectNode; - string projectName = ""; - - if (project != null) - projectName = " in project " + project.AssemblyName; - - throw new WarningException("Match" + projectName + " returned no files: {0}{1}", Helper.EndPath(path), pattern); - } - m_Regex = null; - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base deleted file mode 100644 index 577de710ed..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/OptionsNode.cs.svn-base +++ /dev/null @@ -1,634 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Options")] - public class OptionsNode : DataNode - { - #region Fields - - private static readonly Dictionary m_OptionFields = new Dictionary(); - - [OptionNode("CompilerDefines")] - private string m_CompilerDefines = ""; - - /// - /// - /// - public string CompilerDefines - { - get - { - return m_CompilerDefines; - } - set - { - m_CompilerDefines = value; - } - } - - [OptionNode("OptimizeCode")] - private bool m_OptimizeCode; - - /// - /// - /// - public bool OptimizeCode - { - get - { - return m_OptimizeCode; - } - set - { - m_OptimizeCode = value; - } - } - - [OptionNode("CheckUnderflowOverflow")] - private bool m_CheckUnderflowOverflow; - - /// - /// - /// - public bool CheckUnderflowOverflow - { - get - { - return m_CheckUnderflowOverflow; - } - set - { - m_CheckUnderflowOverflow = value; - } - } - - [OptionNode("AllowUnsafe")] - private bool m_AllowUnsafe; - - /// - /// - /// - public bool AllowUnsafe - { - get - { - return m_AllowUnsafe; - } - set - { - m_AllowUnsafe = value; - } - } - - [OptionNode("PreBuildEvent")] - private string m_PreBuildEvent; - - /// - /// - /// - public string PreBuildEvent - { - get - { - return m_PreBuildEvent; - } - set - { - m_PreBuildEvent = value; - } - } - - [OptionNode("PostBuildEvent")] - private string m_PostBuildEvent; - - /// - /// - /// - public string PostBuildEvent - { - get - { - return m_PostBuildEvent; - } - set - { - m_PostBuildEvent = value; - } - } - - [OptionNode("PreBuildEventArgs")] - private string m_PreBuildEventArgs; - - /// - /// - /// - public string PreBuildEventArgs - { - get - { - return m_PreBuildEventArgs; - } - set - { - m_PreBuildEventArgs = value; - } - } - - [OptionNode("PostBuildEventArgs")] - private string m_PostBuildEventArgs; - - /// - /// - /// - public string PostBuildEventArgs - { - get - { - return m_PostBuildEventArgs; - } - set - { - m_PostBuildEventArgs = value; - } - } - - [OptionNode("RunPostBuildEvent")] - private string m_RunPostBuildEvent; - - /// - /// - /// - public string RunPostBuildEvent - { - get - { - return m_RunPostBuildEvent; - } - set - { - m_RunPostBuildEvent = value; - } - } - - [OptionNode("RunScript")] - private string m_RunScript; - - /// - /// - /// - public string RunScript - { - get - { - return m_RunScript; - } - set - { - m_RunScript = value; - } - } - - [OptionNode("WarningLevel")] - private int m_WarningLevel = 4; - - /// - /// - /// - public int WarningLevel - { - get - { - return m_WarningLevel; - } - set - { - m_WarningLevel = value; - } - } - - [OptionNode("WarningsAsErrors")] - private bool m_WarningsAsErrors; - - /// - /// - /// - public bool WarningsAsErrors - { - get - { - return m_WarningsAsErrors; - } - set - { - m_WarningsAsErrors = value; - } - } - - [OptionNode("SuppressWarnings")] - private string m_SuppressWarnings = ""; - - /// - /// - /// - public string SuppressWarnings - { - get - { - return m_SuppressWarnings; - } - set - { - m_SuppressWarnings = value; - } - } - - [OptionNode("OutputPath")] - private string m_OutputPath = "bin/"; - - /// - /// - /// - public string OutputPath - { - get - { - return m_OutputPath; - } - set - { - m_OutputPath = value; - } - } - - [OptionNode("GenerateDocumentation")] - private bool m_GenerateDocumentation; - - /// - /// - /// - public bool GenerateDocumentation - { - get - { - return m_GenerateDocumentation; - } - set - { - m_GenerateDocumentation = value; - } - } - - [OptionNode("GenerateXmlDocFile")] - private bool m_GenerateXmlDocFile; - - /// - /// - /// - public bool GenerateXmlDocFile - { - get - { - return m_GenerateXmlDocFile; - } - set - { - m_GenerateXmlDocFile = value; - } - } - - [OptionNode("XmlDocFile")] - private string m_XmlDocFile = ""; - - /// - /// - /// - public string XmlDocFile - { - get - { - return m_XmlDocFile; - } - set - { - m_XmlDocFile = value; - } - } - - [OptionNode("KeyFile")] - private string m_KeyFile = ""; - - /// - /// - /// - public string KeyFile - { - get - { - return m_KeyFile; - } - set - { - m_KeyFile = value; - } - } - - [OptionNode("DebugInformation")] - private bool m_DebugInformation; - - /// - /// - /// - public bool DebugInformation - { - get - { - return m_DebugInformation; - } - set - { - m_DebugInformation = value; - } - } - - [OptionNode("RegisterComInterop")] - private bool m_RegisterComInterop; - - /// - /// - /// - public bool RegisterComInterop - { - get - { - return m_RegisterComInterop; - } - set - { - m_RegisterComInterop = value; - } - } - - [OptionNode("RemoveIntegerChecks")] - private bool m_RemoveIntegerChecks; - - /// - /// - /// - public bool RemoveIntegerChecks - { - get - { - return m_RemoveIntegerChecks; - } - set - { - m_RemoveIntegerChecks = value; - } - } - - [OptionNode("IncrementalBuild")] - private bool m_IncrementalBuild; - - /// - /// - /// - public bool IncrementalBuild - { - get - { - return m_IncrementalBuild; - } - set - { - m_IncrementalBuild = value; - } - } - - [OptionNode("BaseAddress")] - private string m_BaseAddress = "285212672"; - - /// - /// - /// - public string BaseAddress - { - get - { - return m_BaseAddress; - } - set - { - m_BaseAddress = value; - } - } - - [OptionNode("FileAlignment")] - private int m_FileAlignment = 4096; - - /// - /// - /// - public int FileAlignment - { - get - { - return m_FileAlignment; - } - set - { - m_FileAlignment = value; - } - } - - [OptionNode("NoStdLib")] - private bool m_NoStdLib; - - /// - /// - /// - public bool NoStdLib - { - get - { - return m_NoStdLib; - } - set - { - m_NoStdLib = value; - } - } - - private readonly List m_FieldsDefined = new List(); - - #endregion - - #region Constructors - - /// - /// Initializes the class. - /// - static OptionsNode() - { - Type t = typeof(OptionsNode); - - foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) - { - object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); - if(attrs == null || attrs.Length < 1) - { - continue; - } - - OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; - m_OptionFields[ona.NodeName] = f; - } - } - - #endregion - - #region Properties - - /// - /// Gets the at the specified index. - /// - /// - public object this[string index] - { - get - { - if(!m_OptionFields.ContainsKey(index)) - { - return null; - } - - FieldInfo f = m_OptionFields[index]; - return f.GetValue(this); - } - } - - /// - /// Gets the at the specified index. - /// - /// - public object this[string index, object defaultValue] - { - get - { - object valueObject = this[index]; - if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) - { - return defaultValue; - } - return valueObject; - } - } - - - #endregion - - #region Private Methods - - private void FlagDefined(string name) - { - if(!m_FieldsDefined.Contains(name)) - { - m_FieldsDefined.Add(name); - } - } - - private void SetOption(string nodeName, string val) - { - lock(m_OptionFields) - { - if(!m_OptionFields.ContainsKey(nodeName)) - { - return; - } - - FieldInfo f = m_OptionFields[nodeName]; - f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); - FlagDefined(f.Name); - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); - } - } - - /// - /// Copies to. - /// - /// The opt. - public void CopyTo(OptionsNode opt) - { - if(opt == null) - { - return; - } - - foreach(FieldInfo f in m_OptionFields.Values) - { - if(m_FieldsDefined.Contains(f.Name)) - { - f.SetValue(opt, f.GetValue(this)); - opt.m_FieldsDefined.Add(f.Name); - } - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base deleted file mode 100644 index 8ca8e493d2..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ProcessNode.cs.svn-base +++ /dev/null @@ -1,108 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Process")] - public class ProcessNode : DataNode - { - #region Fields - - private string m_Path; - private bool m_IsValid = true; - - #endregion - - #region Properties - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets a value indicating whether this instance is valid. - /// - /// true if this instance is valid; otherwise, false. - public bool IsValid - { - get - { - return m_IsValid; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - try - { - m_Path = Helper.ResolvePath(m_Path); - } - catch(ArgumentException) - { - Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); - m_IsValid = false; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base deleted file mode 100644 index fb92b32e73..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ProjectNode.cs.svn-base +++ /dev/null @@ -1,579 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// A set of values that the Project's type can be - /// - public enum ProjectType - { - /// - /// The project is a console executable - /// - Exe, - /// - /// The project is a windows executable - /// - WinExe, - /// - /// The project is a library - /// - Library, - /// - /// The project is a website - /// - Web, - } - - /// - /// - /// - public enum ClrRuntime - { - /// - /// - /// - Microsoft, - /// - /// - /// - Mono - } - /// - /// The version of the .NET framework to use (Required for VS2008) - /// We don't need .NET 1.1 in here, it'll default when using vs2003. - /// - public enum FrameworkVersion - { - /// - /// .NET 2.0 - /// - v2_0, - /// - /// .NET 3.0 - /// - v3_0, - /// - /// .NET 3.5 - /// - v3_5, - /// - /// .NET 4.0 - /// - v4_0, - } - /// - /// The Node object representing /Prebuild/Solution/Project elements - /// - [DataNode("Project")] - public class ProjectNode : DataNode, IComparable - { - #region Fields - - private string m_Name = "unknown"; - private string m_Path = ""; - private string m_FullPath = ""; - private string m_AssemblyName; - private string m_AppIcon = ""; - private string m_ConfigFile = ""; - private string m_DesignerFolder = ""; - private string m_Language = "C#"; - private ProjectType m_Type = ProjectType.Exe; - private ClrRuntime m_Runtime = ClrRuntime.Microsoft; - private FrameworkVersion m_Framework = FrameworkVersion.v2_0; - private string m_StartupObject = ""; - private string m_RootNamespace; - private string m_FilterGroups = ""; - private string m_Version = ""; - private Guid m_Guid; - private string m_DebugStartParameters; - - private readonly Dictionary m_Configurations = new Dictionary(); - private readonly List m_ReferencePaths = new List(); - private readonly List m_References = new List(); - private readonly List m_Authors = new List(); - private FilesNode m_Files; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - /// - /// The version of the .NET Framework to compile under - /// - public FrameworkVersion FrameworkVersion - { - get - { - return m_Framework; - } - } - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets the filter groups. - /// - /// The filter groups. - public string FilterGroups - { - get - { - return m_FilterGroups; - } - } - - /// - /// Gets the project's version - /// - /// The project's version. - public string Version - { - get - { - return m_Version; - } - } - - /// - /// Gets the full path. - /// - /// The full path. - public string FullPath - { - get - { - return m_FullPath; - } - } - - /// - /// Gets the name of the assembly. - /// - /// The name of the assembly. - public string AssemblyName - { - get - { - return m_AssemblyName; - } - } - - /// - /// Gets the app icon. - /// - /// The app icon. - public string AppIcon - { - get - { - return m_AppIcon; - } - } - - /// - /// Gets the app icon. - /// - /// The app icon. - public string ConfigFile - { - get - { - return m_ConfigFile; - } - } - - /// - /// - /// - public string DesignerFolder - { - get - { - return m_DesignerFolder; - } - } - - /// - /// Gets the language. - /// - /// The language. - public string Language - { - get - { - return m_Language; - } - } - - /// - /// Gets the type. - /// - /// The type. - public ProjectType Type - { - get - { - return m_Type; - } - } - - /// - /// Gets the runtime. - /// - /// The runtime. - public ClrRuntime Runtime - { - get - { - return m_Runtime; - } - } - - private bool m_GenerateAssemblyInfoFile; - - /// - /// - /// - public bool GenerateAssemblyInfoFile - { - get - { - return m_GenerateAssemblyInfoFile; - } - set - { - m_GenerateAssemblyInfoFile = value; - } - } - - /// - /// Gets the startup object. - /// - /// The startup object. - public string StartupObject - { - get - { - return m_StartupObject; - } - } - - /// - /// Gets the root namespace. - /// - /// The root namespace. - public string RootNamespace - { - get - { - return m_RootNamespace; - } - } - - /// - /// Gets the configurations. - /// - /// The configurations. - public List Configurations - { - get - { - List tmp = new List(ConfigurationsTable.Values); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the configurations table. - /// - /// The configurations table. - public Dictionary ConfigurationsTable - { - get - { - return m_Configurations; - } - } - - /// - /// Gets the reference paths. - /// - /// The reference paths. - public List ReferencePaths - { - get - { - List tmp = new List(m_ReferencePaths); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the references. - /// - /// The references. - public List References - { - get - { - List tmp = new List(m_References); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the Authors list. - /// - /// The list of the project's authors. - public List Authors - { - get - { - return m_Authors; - } - } - - /// - /// Gets the files. - /// - /// The files. - public FilesNode Files - { - get - { - return m_Files; - } - } - - /// - /// Gets or sets the parent. - /// - /// The parent. - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - base.Parent = value; - if(base.Parent is SolutionNode && m_Configurations.Count < 1) - { - SolutionNode parent = (SolutionNode)base.Parent; - foreach(ConfigurationNode conf in parent.Configurations) - { - m_Configurations[conf.NameAndPlatform] = (ConfigurationNode) conf.Clone(); - } - } - } - } - - /// - /// Gets the GUID. - /// - /// The GUID. - public Guid Guid - { - get - { - return m_Guid; - } - } - - public string DebugStartParameters - { - get - { - return m_DebugStartParameters; - } - } - - #endregion - - #region Private Methods - - private void HandleConfiguration(ConfigurationNode conf) - { - if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, - //so it *may* override changes to the same properties for configurations defines at the project level - { - foreach(ConfigurationNode confNode in m_Configurations.Values) - { - conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides - } - } - if(m_Configurations.ContainsKey(conf.NameAndPlatform)) - { - ConfigurationNode parentConf = m_Configurations[conf.NameAndPlatform]; - conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides - } - else - { - m_Configurations[conf.NameAndPlatform] = conf; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); - m_Version = Helper.AttributeValue(node, "version", m_Version); - m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); - m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); - m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); - m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); - m_Language = Helper.AttributeValue(node, "language", m_Language); - m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); - m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); - m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); - m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); - m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); - - int hash = m_Name.GetHashCode(); - Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString()); - m_Guid = new Guid(guid); - - m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); - m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty); - - if(string.IsNullOrEmpty(m_AssemblyName)) - { - m_AssemblyName = m_Name; - } - - if(string.IsNullOrEmpty(m_RootNamespace)) - { - m_RootNamespace = m_Name; - } - - m_FullPath = m_Path; - try - { - m_FullPath = Helper.ResolvePath(m_FullPath); - } - catch - { - throw new WarningException("Could not resolve Solution path: {0}", m_Path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - try - { - Helper.SetCurrentDir(m_FullPath); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is ConfigurationNode) - { - HandleConfiguration((ConfigurationNode)dataNode); - } - else if(dataNode is ReferencePathNode) - { - m_ReferencePaths.Add((ReferencePathNode)dataNode); - } - else if(dataNode is ReferenceNode) - { - m_References.Add((ReferenceNode)dataNode); - } - else if(dataNode is AuthorNode) - { - m_Authors.Add((AuthorNode)dataNode); - } - else if(dataNode is FilesNode) - { - m_Files = (FilesNode)dataNode; - } - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ProjectNode that = (ProjectNode)obj; - return m_Name.CompareTo(that.m_Name); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base deleted file mode 100644 index 9c5d1a3491..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ReferenceNode.cs.svn-base +++ /dev/null @@ -1,144 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Reference")] - public class ReferenceNode : DataNode, IComparable - { - #region Fields - - private string m_Name = "unknown"; - private string m_Path; - private string m_LocalCopy; - private string m_Version; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets a value indicating whether [local copy specified]. - /// - /// true if [local copy specified]; otherwise, false. - public bool LocalCopySpecified - { - get - { - return ( m_LocalCopy != null && m_LocalCopy.Length == 0); - } - } - - /// - /// Gets a value indicating whether [local copy]. - /// - /// true if [local copy]; otherwise, false. - public bool LocalCopy - { - get - { - if( m_LocalCopy == null) - { - return false; - } - return bool.Parse(m_LocalCopy); - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return m_Version; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); - m_Version = Helper.AttributeValue(node, "version", m_Version); - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ReferenceNode that = (ReferenceNode)obj; - return this.m_Name.CompareTo(that.m_Name); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base deleted file mode 100644 index 7331cd7b58..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/ReferencePathNode.cs.svn-base +++ /dev/null @@ -1,97 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("ReferencePath")] - public class ReferencePathNode : DataNode, IComparable - { - #region Fields - - private string m_Path; - - #endregion - - #region Properties - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - m_Path = m_Path.Trim(); - } - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - ReferencePathNode that = (ReferencePathNode)obj; - return this.m_Path.CompareTo(that.m_Path); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base b/Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base deleted file mode 100644 index 10c02234da..0000000000 --- a/Prebuild/src/Core/Nodes/.svn/text-base/SolutionNode.cs.svn-base +++ /dev/null @@ -1,382 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Solution")] - [DataNode("EmbeddedSolution")] - [DebuggerDisplay("{Name}")] - public class SolutionNode : DataNode - { - #region Fields - - private Guid m_Guid = Guid.NewGuid(); - private string m_Name = "unknown"; - private string m_Path = ""; - private string m_FullPath = ""; - private string m_ActiveConfig; - private string m_Version = "1.0.0"; - - private OptionsNode m_Options; - private FilesNode m_Files; - private readonly ConfigurationNodeCollection m_Configurations = new ConfigurationNodeCollection(); - private readonly Dictionary m_Projects = new Dictionary(); - private readonly Dictionary m_DatabaseProjects = new Dictionary(); - private readonly List m_ProjectsOrder = new List(); - private readonly Dictionary m_Solutions = new Dictionary(); - private CleanupNode m_Cleanup; - - #endregion - - #region Properties - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - if (value is SolutionNode) - { - SolutionNode solution = (SolutionNode)value; - foreach (ConfigurationNode conf in solution.Configurations) - { - m_Configurations[conf.Name] = (ConfigurationNode) conf.Clone(); - } - } - - base.Parent = value; - } - } - - public CleanupNode Cleanup - { - get - { - return m_Cleanup; - } - set - { - m_Cleanup = value; - } - } - - public Guid Guid - { - get - { - return m_Guid; - } - set - { - m_Guid = value; - } - } - /// - /// Gets or sets the active config. - /// - /// The active config. - public string ActiveConfig - { - get - { - return m_ActiveConfig; - } - set - { - m_ActiveConfig = value; - } - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets the full path. - /// - /// The full path. - public string FullPath - { - get - { - return m_FullPath; - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return m_Version; - } - } - - /// - /// Gets the options. - /// - /// The options. - public OptionsNode Options - { - get - { - return m_Options; - } - } - - /// - /// Gets the files. - /// - /// The files. - public FilesNode Files - { - get - { - return m_Files; - } - } - - /// - /// Gets the configurations. - /// - /// The configurations. - public ConfigurationNodeCollection Configurations - { - get - { - ConfigurationNodeCollection tmp = new ConfigurationNodeCollection(); - tmp.AddRange(ConfigurationsTable); - return tmp; - } - } - - /// - /// Gets the configurations table. - /// - /// The configurations table. - public ConfigurationNodeCollection ConfigurationsTable - { - get - { - return m_Configurations; - } - } - /// - /// Gets the database projects. - /// - public ICollection DatabaseProjects - { - get - { - return m_DatabaseProjects.Values; - } - } - /// - /// Gets the nested solutions. - /// - public ICollection Solutions - { - get - { - return m_Solutions.Values; - } - } - /// - /// Gets the nested solutions hash table. - /// - public Dictionary SolutionsTable - { - get - { - return m_Solutions; - } - } - /// - /// Gets the projects. - /// - /// The projects. - public ICollection Projects - { - get - { - List tmp = new List(m_Projects.Values); - tmp.Sort(); - return tmp; - } - } - - /// - /// Gets the projects table. - /// - /// The projects table. - public Dictionary ProjectsTable - { - get - { - return m_Projects; - } - } - - /// - /// Gets the projects table. - /// - /// The projects table. - public List ProjectsTableOrder - { - get - { - return m_ProjectsOrder; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_Version = Helper.AttributeValue(node, "version", m_Version); - - m_FullPath = m_Path; - try - { - m_FullPath = Helper.ResolvePath(m_FullPath); - } - catch - { - throw new WarningException("Could not resolve solution path: {0}", m_Path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - try - { - Helper.SetCurrentDir(m_FullPath); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is OptionsNode) - { - m_Options = (OptionsNode)dataNode; - } - else if(dataNode is FilesNode) - { - m_Files = (FilesNode)dataNode; - } - else if(dataNode is ConfigurationNode) - { - ConfigurationNode configurationNode = (ConfigurationNode) dataNode; - m_Configurations[configurationNode.NameAndPlatform] = configurationNode; - - // If the active configuration is null, then we populate it. - if (ActiveConfig == null) - { - ActiveConfig = configurationNode.Name; - } - } - else if(dataNode is ProjectNode) - { - m_Projects[((ProjectNode)dataNode).Name] = (ProjectNode) dataNode; - m_ProjectsOrder.Add((ProjectNode)dataNode); - } - else if(dataNode is SolutionNode) - { - m_Solutions[((SolutionNode)dataNode).Name] = (SolutionNode) dataNode; - } - else if (dataNode is ProcessNode) - { - ProcessNode p = (ProcessNode)dataNode; - Kernel.Instance.ProcessFile(p, this); - } - else if (dataNode is DatabaseProjectNode) - { - m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = (DatabaseProjectNode) dataNode; - } - else if(dataNode is CleanupNode) - { - if(m_Cleanup != null) - throw new WarningException("There can only be one Cleanup node."); - m_Cleanup = (CleanupNode)dataNode; - } - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Parse/.svn/all-wcprops b/Prebuild/src/Core/Parse/.svn/all-wcprops deleted file mode 100644 index c77d4169e8..0000000000 --- a/Prebuild/src/Core/Parse/.svn/all-wcprops +++ /dev/null @@ -1,17 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 56 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Core/Parse -END -IfContext.cs -K 25 -svn:wc:ra_dav:version-url -V 69 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Parse/IfContext.cs -END -Preprocessor.cs -K 25 -svn:wc:ra_dav:version-url -V 72 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Core/Parse/Preprocessor.cs -END diff --git a/Prebuild/src/Core/Parse/.svn/dir-prop-base b/Prebuild/src/Core/Parse/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/src/Core/Parse/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/src/Core/Parse/.svn/entries b/Prebuild/src/Core/Parse/.svn/entries deleted file mode 100644 index 2aae71129a..0000000000 --- a/Prebuild/src/Core/Parse/.svn/entries +++ /dev/null @@ -1,96 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Parse -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-09-10T17:51:36.189738Z -323 -jhurliman -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -IfContext.cs -file - - - - -2010-09-10T22:51:44.000000Z -859fca08c6a39a48f179d5ffe3d19bd0 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -3653 - -Preprocessor.cs -file - - - - -2010-09-10T22:51:44.000000Z -6ef27f33f41caca9d4ab6c82ead76902 -2010-09-10T17:51:36.189738Z -323 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -18590 - diff --git a/Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base b/Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Parse/.svn/prop-base/IfContext.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base b/Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Parse/.svn/prop-base/Preprocessor.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base b/Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base deleted file mode 100644 index 3c79d38b06..0000000000 --- a/Prebuild/src/Core/Parse/.svn/text-base/IfContext.cs.svn-base +++ /dev/null @@ -1,154 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -namespace Prebuild.Core.Parse -{ - /// - /// - /// - public enum IfState - { - /// - /// - /// - None, - /// - /// - /// - If, - /// - /// - /// - ElseIf, - /// - /// - /// - Else - } - - /// - /// Summary description for IfContext. - /// - // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) - public class IfContext - { - #region Properties - - bool m_Active; - bool m_Keep; - bool m_EverKept; - IfState m_State = IfState.None; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// if set to true [active]. - /// if set to true [keep]. - /// The state. - public IfContext(bool active, bool keep, IfState state) - { - m_Active = active; - m_Keep = keep; - m_EverKept = keep; - m_State = state; - } - - #endregion - - #region Properties - - /// - /// Gets or sets a value indicating whether this is active. - /// - /// true if active; otherwise, false. - public bool Active - { - get - { - return m_Active; - } - set - { - m_Active = value; - } - } - - /// - /// Gets or sets a value indicating whether this is keep. - /// - /// true if keep; otherwise, false. - public bool Keep - { - get - { - return m_Keep; - } - set - { - m_Keep = value; - if(m_Keep) - { - m_EverKept = true; - } - } - } - - /// - /// Gets a value indicating whether [ever kept]. - /// - /// true if [ever kept]; otherwise, false. - public bool EverKept - { - get - { - return m_EverKept; - } - } - - /// - /// Gets or sets the state. - /// - /// The state. - public IfState State - { - get - { - return m_State; - } - set - { - m_State = value; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base b/Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base deleted file mode 100644 index 0648fad8d8..0000000000 --- a/Prebuild/src/Core/Parse/.svn/text-base/Preprocessor.cs.svn-base +++ /dev/null @@ -1,652 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Xml; - -namespace Prebuild.Core.Parse -{ - /// - /// - /// - public enum OperatorSymbol - { - /// - /// - /// - None, - /// - /// - /// - Equal, - /// - /// - /// - NotEqual, - /// - /// - /// - LessThan, - /// - /// - /// - GreaterThan, - /// - /// - /// - LessThanEqual, - /// - /// - /// - GreaterThanEqual - } - - /// - /// - /// - public class Preprocessor - { - #region Constants - - /// - /// Includes the regex to look for file tags in the processing instruction. - /// - private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); - - #endregion - - #region Fields - - readonly XmlDocument m_OutDoc = new XmlDocument(); - readonly Stack m_IfStack = new Stack(); - readonly Dictionary m_Variables = new Dictionary(); - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public Preprocessor() - { - RegisterVariable("OS", GetOS()); - RegisterVariable("RuntimeVersion", Environment.Version.Major); - RegisterVariable("RuntimeMajor", Environment.Version.Major); - RegisterVariable("RuntimeMinor", Environment.Version.Minor); - RegisterVariable("RuntimeRevision", Environment.Version.Revision); - } - - #endregion - - #region Properties - - /// - /// Gets the processed doc. - /// - /// The processed doc. - public XmlDocument ProcessedDoc - { - get - { - return m_OutDoc; - } - } - - #endregion - - #region Private Methods - - /// - /// Parts of this code were taken from NAnt and is subject to the GPL - /// as per NAnt's license. Thanks to the NAnt guys for this little gem. - /// - /// - public static string GetOS() - { - PlatformID platId = Environment.OSVersion.Platform; - if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) - { - return "Win32"; - } - - if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) - { - return "MACOSX"; - } - - /* - * .NET 1.x, under Mono, the UNIX code is 128. Under - * .NET 2.x, Mono or MS, the UNIX code is 4 - */ - if(Environment.Version.Major == 1) - { - if((int)platId == 128) - { - return "UNIX"; - } - } - else if((int)platId == 4) - { - return "UNIX"; - } - - return "Unknown"; - } - - private static bool CompareNum(OperatorSymbol oper, int val1, int val2) - { - switch(oper) - { - case OperatorSymbol.Equal: - return (val1 == val2); - case OperatorSymbol.NotEqual: - return (val1 != val2); - case OperatorSymbol.LessThan: - return (val1 < val2); - case OperatorSymbol.LessThanEqual: - return (val1 <= val2); - case OperatorSymbol.GreaterThan: - return (val1 > val2); - case OperatorSymbol.GreaterThanEqual: - return (val1 >= val2); - } - - throw new WarningException("Unknown operator type"); - } - - private static bool CompareStr(OperatorSymbol oper, string val1, string val2) - { - switch(oper) - { - case OperatorSymbol.Equal: - return (val1 == val2); - case OperatorSymbol.NotEqual: - return (val1 != val2); - case OperatorSymbol.LessThan: - return (val1.CompareTo(val2) < 0); - case OperatorSymbol.LessThanEqual: - return (val1.CompareTo(val2) <= 0); - case OperatorSymbol.GreaterThan: - return (val1.CompareTo(val2) > 0); - case OperatorSymbol.GreaterThanEqual: - return (val1.CompareTo(val2) >= 0); - } - - throw new WarningException("Unknown operator type"); - } - - private static char NextChar(int idx, string str) - { - if((idx + 1) >= str.Length) - { - return Char.MaxValue; - } - - return str[idx + 1]; - } - // Very very simple expression parser. Can only match expressions of the form - // : - // OS = Windows - // OS != Linux - // RuntimeMinor > 0 - private bool ParseExpression(string exp) - { - if(exp == null) - { - throw new ArgumentException("Invalid expression, cannot be null"); - } - - exp = exp.Trim(); - if(exp.Length < 1) - { - throw new ArgumentException("Invalid expression, cannot be 0 length"); - } - - string id = ""; - string str = ""; - OperatorSymbol oper = OperatorSymbol.None; - bool inStr = false; - - for(int i = 0; i < exp.Length; i++) - { - char c = exp[i]; - if(Char.IsWhiteSpace(c)) - { - continue; - } - - if(Char.IsLetterOrDigit(c) || c == '_') - { - if(inStr) - { - str += c; - } - else - { - id += c; - } - } - else if(c == '\"') - { - inStr = !inStr; - if(inStr) - { - str = ""; - } - } - else - { - if(inStr) - { - str += c; - } - else - { - switch(c) - { - case '=': - oper = OperatorSymbol.Equal; - break; - - case '!': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.NotEqual; - } - - break; - - case '<': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.LessThanEqual; - } - else - { - oper = OperatorSymbol.LessThan; - } - - break; - - case '>': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.GreaterThanEqual; - } - else - { - oper = OperatorSymbol.GreaterThan; - } - - break; - } - } - } - } - - - if(inStr) - { - throw new WarningException("Expected end of string in expression"); - } - - if(oper == OperatorSymbol.None) - { - throw new WarningException("Expected operator in expression"); - } - if(id.Length < 1) - { - throw new WarningException("Expected identifier in expression"); - } - if(str.Length < 1) - { - throw new WarningException("Expected value in expression"); - } - - bool ret; - try - { - object val = m_Variables[id.ToLower()]; - if(val == null) - { - throw new WarningException("Unknown identifier '{0}'", id); - } - - Type t = val.GetType(); - if(t.IsAssignableFrom(typeof(int))) - { - int numVal = (int)val; - int numVal2 = Int32.Parse(str); - ret = CompareNum(oper, numVal, numVal2); - } - else - { - string strVal = val.ToString(); - string strVal2 = str; - ret = CompareStr(oper, strVal, strVal2); - } - } - catch(ArgumentException ex) - { - ex.ToString(); - throw new WarningException("Invalid value type for system variable '{0}', expected int", id); - } - - return ret; - } - - /// - /// Taken from current Prebuild included in OpenSim 0.7.x - /// - /// - /// A - /// - /// - /// A - /// - private static void WildCardInclude (Stack readerStack, string include) - { - if (!include.Contains ("*")) { - return; - } - - // Console.WriteLine("Processing {0}", include); - - // Break up the include into pre and post wildcard sections - string preWildcard = include.Substring (0, include.IndexOf ("*")); - string postWildcard = include.Substring (include.IndexOf ("*") + 2); - - // If preWildcard is a directory, recurse - if (Directory.Exists (preWildcard)) { - string[] directories = Directory.GetDirectories (preWildcard); - Array.Sort (directories); - Array.Reverse (directories); - foreach (string dirPath in directories) { - //Console.WriteLine ("Scanning : {0}", dirPath); - - string includeFile = Path.Combine (dirPath, postWildcard); - if (includeFile.Contains ("*")) { - // postWildcard included another wildcard, recurse. - WildCardInclude (readerStack, includeFile); - } else { - FileInfo file = new FileInfo (includeFile); - if (file.Exists) { - //Console.WriteLine ("Including File: {0}", includeFile); - XmlReader newReader = new XmlTextReader (file.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); - readerStack.Push (newReader); - } - } - } - } else { - // preWildcard is not a path to a directory, so the wildcard is in the filename - string searchFilename = Path.GetFileName (preWildcard.Substring (preWildcard.IndexOf ("/") + 1) + "*" + postWildcard); - Console.WriteLine ("searchFilename: {0}", searchFilename); - - string searchDirectory = Path.GetDirectoryName (preWildcard); - Console.WriteLine ("searchDirectory: {0}", searchDirectory); - - string[] files = Directory.GetFiles (searchDirectory, searchFilename); - Array.Sort (files); - Array.Reverse (files); - foreach (string includeFile in files) { - FileInfo file = new FileInfo (includeFile); - if (file.Exists) { - // Console.WriteLine ("Including File: {0}", includeFile); - XmlReader newReader = new XmlTextReader (file.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); - readerStack.Push (newReader); - } - } - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - /// - public void RegisterVariable(string name, object variableValue) - { - if(name == null || variableValue == null) - { - return; - } - - m_Variables[name.ToLower()] = variableValue; - } - - /// - /// Performs validation on the xml source as well as evaluates conditional and flow expresions - /// - /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml - /// - /// the output xml - public string Process(XmlReader initialReader) - { - if(initialReader == null) - { - throw new ArgumentException("Invalid XML reader to pre-process"); - } - - IfContext context = new IfContext(true, true, IfState.None); - StringWriter xmlText = new StringWriter(); - XmlTextWriter writer = new XmlTextWriter(xmlText); - writer.Formatting = Formatting.Indented; - - // Create a queue of XML readers and add the initial - // reader to it. Then we process until we run out of - // readers which lets the operation add more - // readers to generate a multi-file parser and not require - // XML fragments that a recursive version would use. - Stack readerStack = new Stack(); - readerStack.Push(initialReader); - - while(readerStack.Count > 0) - { - // Pop off the next reader. - XmlReader reader = readerStack.Pop(); - - // Process through this XML reader until it is - // completed (or it is replaced by the include - // operation). - while(reader.Read()) - { - // The prebuild file has a series of processing - // instructions which allow for specific - // inclusions based on operating system or to - // include additional files. - if(reader.NodeType == XmlNodeType.ProcessingInstruction) - { - bool ignore = false; - - switch(reader.LocalName) - { - case "include": - // use regular expressions to parse out the attributes. - MatchCollection matches = includeFileRegex.Matches(reader.Value); - - // make sure there is only one file attribute. - if(matches.Count > 1) - { - throw new WarningException("An node was found, but it specified more than one file."); - } - - if(matches.Count == 0) - { - throw new WarningException("An node was found, but it did not specify the file attribute."); - } - - // ***** Adding for wildcard handling - // Push current reader back onto the stack. - readerStack.Push (reader); - - // Pull the file out from the regex and make sure it is a valid file before using it. - string filename = matches[0].Groups[1].Value; - - filename = String.Join (Path.DirectorySeparatorChar.ToString (), filename.Split (new char[] { '/', '\\' })); - - if (!filename.Contains ("*")) { - - FileInfo includeFile = new FileInfo (filename); - if (!includeFile.Exists) { - throw new WarningException ("Cannot include file: " + includeFile.FullName); - } - - // Create a new reader object for this file. Then put the old reader back on the stack and start - // processing using this new XML reader. - - XmlReader newReader = new XmlTextReader (includeFile.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); - reader = newReader; - readerStack.Push (reader); - - } else { - WildCardInclude (readerStack, filename); - } - - reader = (XmlReader)readerStack.Pop (); - ignore = true; - break; - - case "if": - m_IfStack.Push(context); - context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); - ignore = true; - break; - - case "elseif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - - context.State = IfState.ElseIf; - if(!context.EverKept) - { - context.Keep = ParseExpression(reader.Value); - } - else - { - context.Keep = false; - } - - ignore = true; - break; - - case "else": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - - context.State = IfState.Else; - context.Keep = !context.EverKept; - ignore = true; - break; - - case "endif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'endif' outside of 'if'"); - } - - context = m_IfStack.Pop(); - ignore = true; - break; - } - - if(ignore) - { - continue; - } - }//end pre-proc instruction - - if(!context.Active || !context.Keep) - { - continue; - } - - switch(reader.NodeType) - { - case XmlNodeType.Element: - bool empty = reader.IsEmptyElement; - writer.WriteStartElement(reader.Name); - - while (reader.MoveToNextAttribute()) - { - writer.WriteAttributeString(reader.Name, reader.Value); - } - - if(empty) - { - writer.WriteEndElement(); - } - - break; - - case XmlNodeType.EndElement: - writer.WriteEndElement(); - break; - - case XmlNodeType.Text: - writer.WriteString(reader.Value); - break; - - case XmlNodeType.CDATA: - writer.WriteCData(reader.Value); - break; - - default: - break; - } - } - - if(m_IfStack.Count != 0) - { - throw new WarningException("Mismatched 'if', 'endif' pair"); - } - } - - return xmlText.ToString(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/all-wcprops b/Prebuild/src/Core/Targets/.svn/all-wcprops deleted file mode 100644 index 91d6694094..0000000000 --- a/Prebuild/src/Core/Targets/.svn/all-wcprops +++ /dev/null @@ -1,101 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 58 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Core/Targets -END -MakefileTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 76 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/MakefileTarget.cs -END -SharpDevelop2Target.cs -K 25 -svn:wc:ra_dav:version-url -V 81 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Targets/SharpDevelop2Target.cs -END -ToolInfo.cs -K 25 -svn:wc:ra_dav:version-url -V 70 -/svnroot/dnpb/!svn/ver/290/trunk/Prebuild/src/Core/Targets/ToolInfo.cs -END -VSGenericTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/Core/Targets/VSGenericTarget.cs -END -DebugTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 73 -/svnroot/dnpb/!svn/ver/164/trunk/Prebuild/src/Core/Targets/DebugTarget.cs -END -VSVersion.cs -K 25 -svn:wc:ra_dav:version-url -V 71 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/Core/Targets/VSVersion.cs -END -MonoDevelopTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 79 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/MonoDevelopTarget.cs -END -AutotoolsTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svnroot/dnpb/!svn/ver/298/trunk/Prebuild/src/Core/Targets/AutotoolsTarget.cs -END -VS2010Target.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/317/trunk/Prebuild/src/Core/Targets/VS2010Target.cs -END -VS2002Target.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/295/trunk/Prebuild/src/Core/Targets/VS2002Target.cs -END -SharpDevelopTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 80 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/SharpDevelopTarget.cs -END -VS2003Target.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/VS2003Target.cs -END -VS2005Target.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/VS2005Target.cs -END -NAntTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 72 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Core/Targets/NAntTarget.cs -END -XcodeTarget.cs -K 25 -svn:wc:ra_dav:version-url -V 73 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/XcodeTarget.cs -END -VS2008Target.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Targets/VS2008Target.cs -END diff --git a/Prebuild/src/Core/Targets/.svn/dir-prop-base b/Prebuild/src/Core/Targets/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/src/Core/Targets/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/src/Core/Targets/.svn/entries b/Prebuild/src/Core/Targets/.svn/entries deleted file mode 100644 index c6daa49800..0000000000 --- a/Prebuild/src/Core/Targets/.svn/entries +++ /dev/null @@ -1,572 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Targets -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-09-10T17:51:36.189738Z -323 -jhurliman -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -MakefileTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -9f1538adc7e579b57d104dc7f313946b -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -19043 - -SharpDevelop2Target.cs -file - - - - -2010-09-10T22:51:44.000000Z -f6e8e9d8f335a5a264babb4a8f05a2a5 -2009-02-19T06:47:52.218324Z -295 -kunnis - - - - - - - - - - - - - - - - - - - - - -2442 - -ToolInfo.cs -file - - - - -2010-09-10T22:51:44.000000Z -20e6cf8e0ad0b0744b6189534bfd049a -2009-02-18T05:47:43.979044Z -290 -kunnis - - - - - - - - - - - - - - - - - - - - - -4315 - -VSGenericTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -6956b93fe770e1f5786cc44872c31d06 -2010-05-08T05:43:01.449559Z -316 -jhurliman - - - - - - - - - - - - - - - - - - - - - -34542 - -DebugTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -7346beba16e30e642f272e7bcf3924bb -2006-09-20T07:42:51.680045Z -164 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -2703 - -VSVersion.cs -file - - - - -2010-09-10T22:51:44.000000Z -78ab7ae5edbe12dfb34c9fbd3dba9c23 -2010-05-08T05:43:01.449559Z -316 -jhurliman - - - - - - - - - - - - - - - - - - - - - -1950 - -MonoDevelopTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -d8b264553d4c2d66a19f9610be56f4b4 -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -15976 - -AutotoolsTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -bc5383cb56dd751ac946386a51852a77 -2009-02-20T02:15:45.530129Z -298 -kunnis - - - - - - - - - - - - - - - - - - - - - -41145 - -VS2010Target.cs -file - - - - -2010-09-10T22:51:44.000000Z -7d9c7f130f06ead33e747f0920b989c4 -2010-05-09T07:39:45.137959Z -317 -jhurliman - - - - - - - - - - - - - - - - - - - - - -2745 - -VS2002Target.cs -file - - - - -2010-09-10T22:51:44.000000Z -912769a89b935429b3801db96c467de7 -2009-02-19T06:47:52.218324Z -295 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2507 - -SharpDevelopTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -f9017c8dd94137dee4b673bee40c8e6e -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -12773 - -VS2003Target.cs -file - - - - -2010-09-10T22:51:44.000000Z -c8e60070e9d7343d50c297d3dff12ac4 -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -18912 - -VS2005Target.cs -file - - - - -2010-09-10T22:51:44.000000Z -812092c2b5b068e087806088d80fe635 -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -4291 - -NAntTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -b635fc47efdd3eed660017693b9073c4 -2010-09-10T17:51:36.189738Z -323 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -32065 - -VS2008Target.cs -file - - - - -2010-09-10T22:51:44.000000Z -154f10d6947ee7bf4d5caf10fad8c43d -2009-04-15T01:28:16.827957Z -307 -kunnis - - - - - - - - - - - - - - - - - - - - - -2514 - -XcodeTarget.cs -file - - - - -2010-09-10T22:51:44.000000Z -7ec0bbdd62020f03a725d8f99258769d -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -28408 - diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/DebugTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/DebugTarget.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/DebugTarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/MakefileTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/MakefileTarget.cs.svn-base deleted file mode 100644 index 05f6c062e4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/MakefileTarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 13 -svn:mime-type -V 13 -text/x-csharp -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/MonoDevelopTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/MonoDevelopTarget.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/MonoDevelopTarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/NAntTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/NAntTarget.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/NAntTarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/SharpDevelopTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/SharpDevelopTarget.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/SharpDevelopTarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/VS2002Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/VS2002Target.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/VS2002Target.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/VS2003Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/VS2003Target.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/VS2003Target.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/VS2005Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/VS2005Target.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/VS2005Target.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Targets/.svn/prop-base/XcodeTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/prop-base/XcodeTarget.cs.svn-base deleted file mode 100644 index 05f6c062e4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/prop-base/XcodeTarget.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 13 -svn:mime-type -V 13 -text/x-csharp -END diff --git a/Prebuild/src/Core/Targets/.svn/text-base/AutotoolsTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/AutotoolsTarget.cs.svn-base deleted file mode 100644 index 485e4dd724..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/AutotoolsTarget.cs.svn-base +++ /dev/null @@ -1,1070 +0,0 @@ -#region BSD License -/* - -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Dave Hudson (jendave@yahoo.com), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote -products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -#region MIT X11 license - -/* - Portions of this file authored by Lluis Sanchez Gual - - Copyright (C) 2006 Novell, Inc (http://www.novell.com) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#endregion -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Xsl; -using System.Net; -using System.Diagnostics; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - public enum ClrVersion - { - Default, - Net_1_1, - Net_2_0 - } - - public class SystemPackage - { - string name; - string version; - string description; - string[] assemblies; - bool isInternal; - ClrVersion targetVersion; - - public void Initialize(string name, - string version, - string description, - string[] assemblies, - ClrVersion targetVersion, - bool isInternal) - { - this.isInternal = isInternal; - this.name = name; - this.version = version; - this.assemblies = assemblies; - this.description = description; - this.targetVersion = targetVersion; - } - - public string Name - { - get { return name; } - } - - public string Version - { - get { return version; } - } - - public string Description - { - get { return description; } - } - - public ClrVersion TargetVersion - { - get { return targetVersion; } - } - - // The package is part of the mono SDK - public bool IsCorePackage - { - get { return name == "mono"; } - } - - // The package has been registered by an add-in, and is not installed - // in the system. - public bool IsInternalPackage - { - get { return isInternal; } - } - - public string[] Assemblies - { - get { return assemblies; } - } - - } - - - /// - /// - /// - [Target("autotools")] - public class AutotoolsTarget : ITarget - { - #region Fields - - Kernel m_Kernel; - XmlDocument autotoolsDoc; - XmlUrlResolver xr; - System.Security.Policy.Evidence e; - readonly Dictionary assemblyPathToPackage = new Dictionary(); - readonly Dictionary assemblyFullNameToPath = new Dictionary(); - readonly Dictionary packagesHash = new Dictionary(); - readonly List packages = new List(); - - #endregion - - #region Private Methods - - private static void mkdirDashP(string dirName) - { - DirectoryInfo di = new DirectoryInfo(dirName); - if (di.Exists) - return; - - string parentDirName = System.IO.Path.GetDirectoryName(dirName); - DirectoryInfo parentDi = new DirectoryInfo(parentDirName); - if (!parentDi.Exists) - mkdirDashP(parentDirName); - - di.Create(); - } - - private static void chkMkDir(string dirName) - { - System.IO.DirectoryInfo di = - new System.IO.DirectoryInfo(dirName); - - if (!di.Exists) - di.Create(); - } - - private void transformToFile(string filename, XsltArgumentList argList, string nodeName) - { - // Create an XslTransform for this file - XslTransform templateTransformer = - new XslTransform(); - - // Load up the template - XmlNode templateNode = - autotoolsDoc.SelectSingleNode(nodeName + "/*"); - templateTransformer.Load(templateNode.CreateNavigator(), xr, e); - - // Create a writer for the transformed template - XmlTextWriter templateWriter = - new XmlTextWriter(filename, null); - - // Perform transformation, writing the file - templateTransformer.Transform - (m_Kernel.CurrentDoc, argList, templateWriter, xr); - } - - static string NormalizeAsmName(string name) - { - int i = name.IndexOf(", PublicKeyToken=null"); - if (i != -1) - return name.Substring(0, i).Trim(); - return name; - } - - private void AddAssembly(string assemblyfile, SystemPackage package) - { - if (!File.Exists(assemblyfile)) - return; - - try - { - System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); - assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; - assemblyPathToPackage[assemblyfile] = package; - } - catch - { - } - } - - private static List GetAssembliesWithLibInfo(string line, string file) - { - List references = new List(); - List libdirs = new List(); - List retval = new List(); - foreach (string piece in line.Split(' ')) - { - if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) - { - references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); - } - else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) - { - libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); - } - } - - foreach (string refrnc in references) - { - foreach (string libdir in libdirs) - { - if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) - { - retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); - } - } - } - - return retval; - } - - private static List GetAssembliesWithoutLibInfo(string line, string file) - { - List references = new List(); - foreach (string reference in line.Split(' ')) - { - if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) - { - string final_ref = reference.Substring(3).Trim(); - references.Add(ProcessPiece(final_ref, file)); - } - } - return references; - } - - private static string ProcessPiece(string piece, string pcfile) - { - int start = piece.IndexOf("${"); - if (start == -1) - return piece; - - int end = piece.IndexOf("}"); - if (end == -1) - return piece; - - string variable = piece.Substring(start + 2, end - start - 2); - string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); - return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); - } - - private static string GetVariableFromPkgConfig(string var, string pcfile) - { - ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); - psi.RedirectStandardOutput = true; - psi.UseShellExecute = false; - psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); - Process p = new Process(); - p.StartInfo = psi; - p.Start(); - string ret = p.StandardOutput.ReadToEnd().Trim(); - p.WaitForExit(); - if (String.IsNullOrEmpty(ret)) - return String.Empty; - return ret; - } - - private void ParsePCFile(string pcfile) - { - // Don't register the package twice - string pname = Path.GetFileNameWithoutExtension(pcfile); - if (packagesHash.ContainsKey(pname)) - return; - - List fullassemblies = null; - string version = ""; - string desc = ""; - - SystemPackage package = new SystemPackage(); - - using (StreamReader reader = new StreamReader(pcfile)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - string lowerLine = line.ToLower(); - if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) - { - string choppedLine = line.Substring(5).Trim(); - if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) - { - fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); - } - else - { - fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); - } - } - else if (lowerLine.StartsWith("version:")) - { - // "version:".Length == 8 - version = line.Substring(8).Trim(); - } - else if (lowerLine.StartsWith("description:")) - { - // "description:".Length == 12 - desc = line.Substring(12).Trim(); - } - } - } - - if (fullassemblies == null) - return; - - foreach (string assembly in fullassemblies) - { - AddAssembly(assembly, package); - } - - package.Initialize(pname, - version, - desc, - fullassemblies.ToArray(), - ClrVersion.Default, - false); - packages.Add(package); - packagesHash[pname] = package; - } - - void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) - { - SystemPackage package = new SystemPackage(); - List list = new List(); - - string dir = Path.Combine(prefix, version); - if (!Directory.Exists(dir)) - { - return; - } - - foreach (string assembly in Directory.GetFiles(dir, "*.dll")) - { - AddAssembly(assembly, package); - list.Add(assembly); - } - - package.Initialize("mono", - version, - "The Mono runtime", - list.ToArray(), - ver, - false); - packages.Add(package); - } - - void RunInitialization() - { - string versionDir; - - if (Environment.Version.Major == 1) - { - versionDir = "1.0"; - } - else - { - versionDir = "2.0"; - } - - //Pull up assemblies from the installed mono system. - string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); - - if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) - prefix = Path.Combine(prefix, "mono"); - else - prefix = Path.GetDirectoryName(prefix); - - RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); - RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); - - string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); - string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); - - if (String.IsNullOrEmpty(libpath)) - { - string path_dirs = Environment.GetEnvironmentVariable("PATH"); - foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) - { - if (pathdir == null) - continue; - if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) - { - libpath = Path.Combine(pathdir, ".."); - libpath = Path.Combine(libpath, "lib"); - libpath = Path.Combine(libpath, "pkgconfig"); - break; - } - } - } - search_dirs += Path.PathSeparator + libpath; - if (!string.IsNullOrEmpty(search_dirs)) - { - List scanDirs = new List(); - foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) - { - if (!scanDirs.Contains(potentialDir)) - scanDirs.Add(potentialDir); - } - foreach (string pcdir in scanDirs) - { - if (pcdir == null) - continue; - - if (Directory.Exists(pcdir)) - { - foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) - { - ParsePCFile(pcfile); - } - } - } - } - } - - private void WriteCombine(SolutionNode solution) - { - #region "Create Solution directory if it doesn't exist" - string solutionDir = Path.Combine(solution.FullPath, - Path.Combine("autotools", - solution.Name)); - chkMkDir(solutionDir); - #endregion - - #region "Write Solution-level files" - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("solutionName", "", solution.Name); - // $solutionDir is $rootDir/$solutionName/ - transformToFile(Path.Combine(solutionDir, "configure.ac"), - argList, "/Autotools/SolutionConfigureAc"); - transformToFile(Path.Combine(solutionDir, "Makefile.am"), - argList, "/Autotools/SolutionMakefileAm"); - transformToFile(Path.Combine(solutionDir, "autogen.sh"), - argList, "/Autotools/SolutionAutogenSh"); - #endregion - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - m_Kernel.Log.Write(String.Format("Writing project: {0}", - project.Name)); - WriteProject(solution, project); - } - } - - private static string FindFileReference(string refName, - ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = - Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - if (path == null) - { - return ""; - } - - StringBuilder tmpPath; - - if (Core.Parse.Preprocessor.GetOS() == "Win32") - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath.Replace("/", @"\\"); - } - else - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); - } - return tmpPath.ToString(); - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); - string projectDir = Path.Combine(solutionDir, project.Name); - string projectVersion = project.Version; - bool hasAssemblyConfig = false; - chkMkDir(projectDir); - - List - compiledFiles = new List(), - contentFiles = new List(), - embeddedFiles = new List(), - - binaryLibs = new List(), - pkgLibs = new List(), - systemLibs = new List(), - runtimeLibs = new List(), - - extraDistFiles = new List(), - localCopyTargets = new List(); - - // If there exists a .config file for this assembly, copy - // it to the project folder - - // TODO: Support copying .config.osx files - // TODO: support processing the .config file for native library deps - string projectAssemblyName = project.Name; - if (project.AssemblyName != null) - projectAssemblyName = project.AssemblyName; - - if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) - { - hasAssemblyConfig = true; - System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); - extraDistFiles.Add(project.AssemblyName + ".dll.config"); - } - - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != string.Empty) - { - // Copy snk file into the project's directory - // Use the snk from the project directory directly - string source = Path.Combine(project.FullPath, conf.Options.KeyFile); - string keyFile = conf.Options.KeyFile; - Regex re = new Regex(".*/"); - keyFile = re.Replace(keyFile, ""); - - string dest = Path.Combine(projectDir, keyFile); - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - } - } - - // Copy compiled, embedded and content files into the project's directory - foreach (string filename in project.Files) - { - string source = Path.Combine(project.FullPath, filename); - string dest = Path.Combine(projectDir, filename); - - if (filename.Contains("AssemblyInfo.cs")) - { - // If we've got an AssemblyInfo.cs, pull the version number from it - string[] sources = { source }; - string[] args = { "" }; - Microsoft.CSharp.CSharpCodeProvider cscp = - new Microsoft.CSharp.CSharpCodeProvider(); - - string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); - System.CodeDom.Compiler.CompilerParameters cparam = - new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); - - System.CodeDom.Compiler.CompilerResults cr = - cscp.CompileAssemblyFromFile(cparam, sources); - - foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) - Console.WriteLine("Error! '{0}'", error.ErrorText); - - try { - string projectFullName = cr.CompiledAssembly.FullName; - Regex verRegex = new Regex("Version=([\\d\\.]+)"); - Match verMatch = verRegex.Match(projectFullName); - if (verMatch.Success) - projectVersion = verMatch.Groups[1].Value; - }catch{ - Console.WriteLine("Couldn't compile AssemblyInfo.cs"); - } - - // Clean up the temp file - try - { - if (File.Exists(tempAssemblyFile)) - File.Delete(tempAssemblyFile); - } - catch - { - Console.WriteLine("Error! '{0}'", e); - } - - } - - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - - switch (project.Files.GetBuildAction(filename)) - { - case BuildAction.Compile: - compiledFiles.Add(filename); - break; - case BuildAction.Content: - contentFiles.Add(filename); - extraDistFiles.Add(filename); - break; - case BuildAction.EmbeddedResource: - embeddedFiles.Add(filename); - break; - } - } - - // Set up references - for (int refNum = 0; refNum < project.References.Count; refNum++) - { - ReferenceNode refr = project.References[refNum]; - Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); - - /* Determine which pkg-config (.pc) file refers to - this assembly */ - - SystemPackage package = null; - - if (packagesHash.ContainsKey(refr.Name)) - { - package = packagesHash[refr.Name]; - - } - else - { - string assemblyFullName = string.Empty; - if (refAssembly != null) - assemblyFullName = refAssembly.FullName; - - string assemblyFileName = string.Empty; - if (assemblyFullName != string.Empty && - assemblyFullNameToPath.ContainsKey(assemblyFullName) - ) - assemblyFileName = - assemblyFullNameToPath[assemblyFullName]; - - if (assemblyFileName != string.Empty && - assemblyPathToPackage.ContainsKey(assemblyFileName) - ) - package = assemblyPathToPackage[assemblyFileName]; - - } - - /* If we know the .pc file and it is not "mono" - (already in the path), add a -pkg: argument */ - - if (package != null && - package.Name != "mono" && - !pkgLibs.Contains(package.Name) - ) - pkgLibs.Add(package.Name); - - string fileRef = - FindFileReference(refr.Name, (ProjectNode)refr.Parent); - - if (refr.LocalCopy || - solution.ProjectsTable.ContainsKey(refr.Name) || - fileRef != null || - refr.Path != null - ) - { - - /* Attempt to copy the referenced lib to the - project's directory */ - - string filename = refr.Name + ".dll"; - string source = filename; - if (refr.Path != null) - source = Path.Combine(refr.Path, source); - source = Path.Combine(project.FullPath, source); - string dest = Path.Combine(projectDir, filename); - - /* Since we depend on this binary dll to build, we - * will add a compile- time dependency on the - * copied dll, and add the dll to the list of - * files distributed with this package - */ - - binaryLibs.Add(refr.Name + ".dll"); - extraDistFiles.Add(refr.Name + ".dll"); - - // TODO: Support copying .config.osx files - // TODO: Support for determining native dependencies - if (File.Exists(source + ".config")) - { - System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); - extraDistFiles.Add(refr.Name + ".dll.config"); - } - - try - { - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException) - { - if (solution.ProjectsTable.ContainsKey(refr.Name)){ - - /* If an assembly is referenced, marked for - * local copy, in the list of projects for - * this solution, but does not exist, put a - * target into the Makefile.am to build the - * assembly and copy it to this project's - * directory - */ - - ProjectNode sourcePrj = - ((solution.ProjectsTable[refr.Name])); - - string target = - String.Format("{0}:\n" + - "\t$(MAKE) -C ../{1}\n" + - "\tln ../{2}/$@ $@\n", - filename, - sourcePrj.Name, - sourcePrj.Name ); - - localCopyTargets.Add(target); - } - } - } - else if( !pkgLibs.Contains(refr.Name) ) - { - // Else, let's assume it's in the GAC or the lib path - string assemName = string.Empty; - int index = refr.Name.IndexOf(","); - - if (index > 0) - assemName = refr.Name.Substring(0, index); - else - assemName = refr.Name; - - m_Kernel.Log.Write(String.Format( - "Warning: Couldn't find an appropriate assembly " + - "for reference:\n'{0}'", refr.Name - )); - systemLibs.Add(assemName); - } - } - - const string lineSep = " \\\n\t"; - string compiledFilesString = string.Empty; - if (compiledFiles.Count > 0) - compiledFilesString = - lineSep + string.Join(lineSep, compiledFiles.ToArray()); - - string embeddedFilesString = ""; - if (embeddedFiles.Count > 0) - embeddedFilesString = - lineSep + string.Join(lineSep, embeddedFiles.ToArray()); - - string contentFilesString = ""; - if (contentFiles.Count > 0) - contentFilesString = - lineSep + string.Join(lineSep, contentFiles.ToArray()); - - string extraDistFilesString = ""; - if (extraDistFiles.Count > 0) - extraDistFilesString = - lineSep + string.Join(lineSep, extraDistFiles.ToArray()); - - string pkgLibsString = ""; - if (pkgLibs.Count > 0) - pkgLibsString = - lineSep + string.Join(lineSep, pkgLibs.ToArray()); - - string binaryLibsString = ""; - if (binaryLibs.Count > 0) - binaryLibsString = - lineSep + string.Join(lineSep, binaryLibs.ToArray()); - - string systemLibsString = ""; - if (systemLibs.Count > 0) - systemLibsString = - lineSep + string.Join(lineSep, systemLibs.ToArray()); - - string localCopyTargetsString = ""; - if (localCopyTargets.Count > 0) - localCopyTargetsString = - string.Join("\n", localCopyTargets.ToArray()); - - string monoPath = ""; - foreach (string runtimeLib in runtimeLibs) - { - monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; - } - - // Add the project name to the list of transformation - // parameters - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("projectName", "", project.Name); - argList.AddParam("solutionName", "", solution.Name); - argList.AddParam("assemblyName", "", projectAssemblyName); - argList.AddParam("compiledFiles", "", compiledFilesString); - argList.AddParam("embeddedFiles", "", embeddedFilesString); - argList.AddParam("contentFiles", "", contentFilesString); - argList.AddParam("extraDistFiles", "", extraDistFilesString); - argList.AddParam("pkgLibs", "", pkgLibsString); - argList.AddParam("binaryLibs", "", binaryLibsString); - argList.AddParam("systemLibs", "", systemLibsString); - argList.AddParam("monoPath", "", monoPath); - argList.AddParam("localCopyTargets", "", localCopyTargetsString); - argList.AddParam("projectVersion", "", projectVersion); - argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); - - // Transform the templates - transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); - transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); - transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); - - if (project.Type == Core.Nodes.ProjectType.Library) - transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); - if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) - transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - m_Kernel.Log.Write("Parsing system pkg-config files"); - RunInitialization(); - - const string streamName = "autotools.xml"; - string fqStreamName = String.Format("Prebuild.data.{0}", - streamName - ); - - // Retrieve stream for the autotools template XML - Stream autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(fqStreamName); - - if(autotoolsStream == null) { - - /* - * try without the default namespace prepended, in - * case prebuild.exe assembly was compiled with - * something other than Visual Studio .NET - */ - - autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(streamName); - if(autotoolsStream == null){ - string errStr = - String.Format("Could not find embedded resource file:\n" + - "'{0}' or '{1}'", - streamName, fqStreamName - ); - - m_Kernel.Log.Write(errStr); - - throw new System.Reflection.TargetException(errStr); - } - } - - // Create an XML URL Resolver with default credentials - xr = new System.Xml.XmlUrlResolver(); - xr.Credentials = CredentialCache.DefaultCredentials; - - // Create a default evidence - no need to limit access - e = new System.Security.Policy.Evidence(); - - // Load the autotools XML - autotoolsDoc = new XmlDocument(); - autotoolsDoc.Load(autotoolsStream); - - /* rootDir is the filesystem location where the Autotools - * build tree will be created - for now we'll make it - * $PWD/autotools - */ - - string pwd = Directory.GetCurrentDirectory(); - //string pwd = System.Environment.GetEnvironmentVariable("PWD"); - //if (pwd.Length != 0) - //{ - string rootDir = Path.Combine(pwd, "autotools"); - //} - //else - //{ - // pwd = Assembly.GetExecutingAssembly() - //} - chkMkDir(rootDir); - - foreach (SolutionNode solution in kern.Solutions) - { - m_Kernel.Log.Write(String.Format("Writing solution: {0}", - solution.Name)); - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "autotools"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base deleted file mode 100644 index 3494c303d4..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/DebugTarget.cs.svn-base +++ /dev/null @@ -1,102 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author$ - * $Date$ - * $Revision$ - */ -#endregion - -using System; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; - -#if (DEBUG && _DEBUG_TARGET) -namespace Prebuild.Core.Targets -{ - [Target("debug")] - public class DebugTarget : ITarget - { -#region Fields - - private Kernel m_Kernel = null; - -#endregion - -#region ITarget Members - - public void Write() - { - foreach(SolutionNode s in m_Kernel.Solutions) - { - Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); - foreach(string file in s.Files) -{ - Console.WriteLine("\tFile [ {0} ]", file); -} - - foreach(ProjectNode proj in s.Projects) - { - Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); - foreach(string file in proj.Files) - Console.WriteLine("\t\tFile [ {0} ]", file); - } - } - } - - public void Clean() - { - Console.WriteLine("Not implemented"); - } - - public string Name - { - get - { - return "debug"; - } - } - - public Kernel Kernel - { - get - { - return m_Kernel; - } - set - { - m_Kernel = value; - } - } - -#endregion - } -} -#endif diff --git a/Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base deleted file mode 100644 index 54046dd9bb..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/MakefileTarget.cs.svn-base +++ /dev/null @@ -1,469 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Crestez Leonard (cleonard@go.ro) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - [Target("makefile")] - public class MakefileTarget : ITarget - { - #region Fields - - private Kernel m_Kernel = null; - - #endregion - - #region Private Methods - - // This converts a path relative to the path of a project to - // a path relative to the solution path. - private string NicePath(ProjectNode proj, string path) - { - string res; - SolutionNode solution = (SolutionNode)proj.Parent; - res = Path.Combine(Helper.NormalizePath(proj.FullPath, '/'), Helper.NormalizePath(path, '/')); - res = Helper.NormalizePath(res, '/'); - res = res.Replace("/./", "/"); - while (res.IndexOf("/../") >= 0) - { - int a = res.IndexOf("/../"); - int b = res.LastIndexOf("/", a - 1); - res = res.Remove(b, a - b + 3); - } - res = Helper.MakePathRelativeTo(solution.FullPath, res); - if (res.StartsWith("./")) - res = res.Substring(2, res.Length - 2); - res = Helper.NormalizePath(res, '/'); - return res; - } - - private void WriteProjectFiles(StreamWriter f, SolutionNode solution, ProjectNode project) - { - // Write list of source code files - f.WriteLine("SOURCES_{0} = \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.Compile) - f.WriteLine("\t{0} \\", NicePath(project, file)); - f.WriteLine(); - - // Write list of resource files - f.WriteLine("RESOURCES_{0} = \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) - { - string path = NicePath(project, file); - f.WriteLine("\t-resource:{0},{1} \\", path, Path.GetFileName(path)); - } - f.WriteLine(); - - // There's also Content and None in BuildAction. - // What am I supposed to do with that? - } - - private string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = NicePath(project, Helper.MakeFilePath(refPath.Path, refName, "dll")); - if (File.Exists(fullPath)) - return fullPath; - } - return null; - } - - private void WriteProjectReferences(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("REFERENCES_{0} = \\", project.Name); - foreach (ReferenceNode refr in project.References) - { - string path; - // Project references change with configurations. - if (solution.ProjectsTable.ContainsKey(refr.Name)) - continue; - path = FindFileReference(refr.Name, project); - if (path != null) - f.WriteLine("\t-r:{0} \\", path); - else - f.WriteLine("\t-r:{0} \\", refr.Name); - } - f.WriteLine(); - } - - private void WriteProjectDependencies(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("DEPENDENCIES_{0} = \\", project.Name); - f.WriteLine("\t$(SOURCES_{0}) \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) - f.WriteLine("\t{0} \\", NicePath(project, file)); - f.WriteLine(); - } - - private string ProjectTypeToExtension(ProjectType t) - { - if (t == ProjectType.Exe || t == ProjectType.WinExe) - { - return "exe"; - } - else if (t == ProjectType.Library) - { - return "dll"; - } - else - { - throw new FatalException("Bad ProjectType: {0}", t); - } - } - - private string ProjectTypeToTarget(ProjectType t) - { - if (t == ProjectType.Exe) - { - return "exe"; - } - else if (t == ProjectType.WinExe) - { - return "winexe"; - } - else if (t == ProjectType.Library) - { - return "library"; - } - else - { - throw new FatalException("Bad ProjectType: {0}", t); - } - } - - private string ProjectOutput(ProjectNode project, ConfigurationNode config) - { - string filepath; - filepath = Helper.MakeFilePath((string)config.Options["OutputPath"], - project.AssemblyName, ProjectTypeToExtension(project.Type)); - return NicePath(project, filepath); - } - - // Returns true if two configs in one project have the same output. - private bool ProjectClashes(ProjectNode project) - { - foreach (ConfigurationNode conf1 in project.Configurations) - foreach (ConfigurationNode conf2 in project.Configurations) - if (ProjectOutput(project, conf1) == ProjectOutput(project, conf2) && conf1 != conf2) - { - m_Kernel.Log.Write("Warning: Configurations {0} and {1} for project {2} output the same file", - conf1.Name, conf2.Name, project.Name); - m_Kernel.Log.Write("Warning: I'm going to use some timestamps(extra empty files)."); - return true; - } - return false; - } - - private void WriteProject(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("# This is for project {0}", project.Name); - f.WriteLine(); - - WriteProjectFiles(f, solution, project); - WriteProjectReferences(f, solution, project); - WriteProjectDependencies(f, solution, project); - - bool clash = ProjectClashes(project); - - foreach (ConfigurationNode conf in project.Configurations) - { - string outpath = ProjectOutput(project, conf); - string filesToClean = outpath; - - if (clash) - { - f.WriteLine("{0}-{1}: .{0}-{1}-timestamp", project.Name, conf.Name); - f.WriteLine(); - f.Write(".{0}-{1}-timestamp: $(DEPENDENCIES_{0})", project.Name, conf.Name); - } - else - { - f.WriteLine("{0}-{1}: {2}", project.Name, conf.Name, outpath); - f.WriteLine(); - f.Write("{2}: $(DEPENDENCIES_{0})", project.Name, conf.Name, outpath); - } - // Dependencies on other projects. - foreach (ReferenceNode refr in project.References) - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - if (ProjectClashes(refProj)) - f.Write(" .{0}-{1}-timestamp", refProj.Name, conf.Name); - else - f.Write(" {0}", ProjectOutput(refProj, conf)); - } - f.WriteLine(); - - // make directory for output. - if (Path.GetDirectoryName(outpath) != "") - { - f.WriteLine("\tmkdir -p {0}", Path.GetDirectoryName(outpath)); - } - // mcs command line. - f.Write("\tgmcs", project.Name); - f.Write(" -warn:{0}", conf.Options["WarningLevel"]); - if ((bool)conf.Options["DebugInformation"]) - f.Write(" -debug"); - if ((bool)conf.Options["AllowUnsafe"]) - f.Write(" -unsafe"); - if ((bool)conf.Options["CheckUnderflowOverflow"]) - f.Write(" -checked"); - if (project.StartupObject != "") - f.Write(" -main:{0}", project.StartupObject); - if ((string)conf.Options["CompilerDefines"] != "") - { - f.Write(" -define:\"{0}\"", conf.Options["CompilerDefines"]); - } - - f.Write(" -target:{0} -out:{1}", ProjectTypeToTarget(project.Type), outpath); - - // Build references to other projects. Now that sux. - // We have to reference the other project in the same conf. - foreach (ReferenceNode refr in project.References) - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProj; - refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - f.Write(" -r:{0}", ProjectOutput(refProj, conf)); - } - - f.Write(" $(REFERENCES_{0})", project.Name); - f.Write(" $(RESOURCES_{0})", project.Name); - f.Write(" $(SOURCES_{0})", project.Name); - f.WriteLine(); - - // Copy references with localcopy. - foreach (ReferenceNode refr in project.References) - if (refr.LocalCopy) - { - string outPath, srcPath, destPath; - outPath = Helper.NormalizePath((string)conf.Options["OutputPath"]); - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProj; - refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - srcPath = ProjectOutput(refProj, conf); - destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); - destPath = NicePath(project, destPath); - if (srcPath != destPath) - { - f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); - filesToClean += " " + destPath; - } - continue; - } - srcPath = FindFileReference(refr.Name, project); - if (srcPath != null) - { - destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); - destPath = NicePath(project, destPath); - f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); - filesToClean += " " + destPath; - } - } - - if (clash) - { - filesToClean += String.Format(" .{0}-{1}-timestamp", project.Name, conf.Name); - f.WriteLine("\ttouch .{0}-{1}-timestamp", project.Name, conf.Name); - f.Write("\trm -rf"); - foreach (ConfigurationNode otherConf in project.Configurations) - if (otherConf != conf) - f.WriteLine(" .{0}-{1}-timestamp", project.Name, otherConf.Name); - f.WriteLine(); - } - f.WriteLine(); - f.WriteLine("{0}-{1}-clean:", project.Name, conf.Name); - f.WriteLine("\trm -rf {0}", filesToClean); - f.WriteLine(); - } - } - - private void WriteIntro(StreamWriter f, SolutionNode solution) - { - f.WriteLine("# Makefile for {0} generated by Prebuild ( http://dnpb.sf.net )", solution.Name); - f.WriteLine("# Do not edit."); - f.WriteLine("#"); - - f.Write("# Configurations:"); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}", conf.Name); - f.WriteLine(); - - f.WriteLine("# Projects:"); - foreach (ProjectNode proj in solution.Projects) - f.WriteLine("#\t{0}", proj.Name); - - f.WriteLine("#"); - f.WriteLine("# Building:"); - f.WriteLine("#\t\"make\" to build everything under the default(first) configuration"); - f.WriteLine("#\t\"make CONF\" to build every project under configuration CONF"); - f.WriteLine("#\t\"make PROJ\" to build project PROJ under the default(first) configuration"); - f.WriteLine("#\t\"make PROJ-CONF\" to build project PROJ under configuration CONF"); - f.WriteLine("#"); - f.WriteLine("# Cleaning (removing results of build):"); - f.WriteLine("#\t\"make clean\" to clean everything, that's what you probably want"); - f.WriteLine("#\t\"make CONF\" to clean everything for a configuration"); - f.WriteLine("#\t\"make PROJ\" to clean everything for a project"); - f.WriteLine("#\t\"make PROJ-CONF\" to clea project PROJ under configuration CONF"); - f.WriteLine(); - } - - private void WritePhony(StreamWriter f, SolutionNode solution) - { - string defconf = ""; - foreach (ConfigurationNode conf in solution.Configurations) - { - defconf = conf.Name; - break; - } - - f.Write(".PHONY: all"); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0} {0}-clean", proj.Name); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0} {0}-clean", conf.Name); - foreach (ProjectNode proj in solution.Projects) - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}-{1} {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - - f.WriteLine("all: {0}", defconf); - f.WriteLine(); - - f.Write("clean:"); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}-clean", conf.Name); - f.WriteLine(); - f.WriteLine(); - - foreach (ConfigurationNode conf in solution.Configurations) - { - f.Write("{0}: ", conf.Name); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0}-{1}", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - - f.Write("{0}-clean: ", conf.Name); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - } - - foreach (ProjectNode proj in solution.Projects) - { - f.WriteLine("{0}: {0}-{1}", proj.Name, defconf); - f.WriteLine(); - - f.Write("{0}-clean:", proj.Name); - foreach (ConfigurationNode conf in proj.Configurations) - f.Write(" {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - } - } - - private void WriteSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Creating makefile for {0}", solution.Name); - m_Kernel.CurrentWorkingDirectory.Push(); - - string file = "Makefile";// Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); - StreamWriter f = new StreamWriter(file); - - Helper.SetCurrentDir(Path.GetDirectoryName(file)); - - using (f) - { - WriteIntro(f, solution); - WritePhony(f, solution); - - foreach (ProjectNode project in solution.Projects) - { - m_Kernel.Log.Write("...Creating Project: {0}", project.Name); - WriteProject(f, solution, project); - } - } - - m_Kernel.Log.Write(""); - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning makefile for {0}", solution.Name); - - string file = Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); - Helper.DeleteIfExists(file); - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - public void Write(Kernel kern) - { - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - WriteSolution(solution); - m_Kernel = null; - } - - public virtual void Clean(Kernel kern) - { - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - CleanSolution(sol); - m_Kernel = null; - } - - public string Name - { - get - { - return "makefile"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base deleted file mode 100644 index ea6d2c2233..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/MonoDevelopTarget.cs.svn-base +++ /dev/null @@ -1,515 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("monodev")] - public class MonoDevelopTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if(refr.Path != null || fileRef != null) - { - ret += "Assembly\" refto=\""; - - string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; - - ret += finalPath; - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - return ret; - } - - ret += "Gac\""; - ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; - ret += " refto=\""; - try - { - /* - Day changed to 28 Mar 2007 - ... - 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? - 08:09 < jonp> no - 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the - ability to load any assembly version by-name was an inherently - bad idea - 08:11 < cj> I'm thinking of a bunch of four-letter words right now... - 08:11 < cj> security through making it difficult for the developer!!! - 08:12 < jonp> just use the Obsolete API - 08:12 < jonp> it should still work - 08:12 < cj> alrighty. - 08:12 < jonp> you just get warnings when using it - */ - Assembly assem = Assembly.LoadWithPartialName(refr.Name); - ret += assem.FullName; - //ret += refr.Name; - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name; - } - ret += "\" />"; - } - - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if(File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - { - return "False"; - } - return "True"; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string csComp = "Mcs"; - string netRuntime = "Mono"; - if(project.Runtime == ClrRuntime.Microsoft) - { - csComp = "Csc"; - netRuntime = "MsNet"; - } - - string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using(ss) - { - ss.WriteLine( - "", - project.Name, - project.RootNamespace - ); - - int count = 0; - - ss.WriteLine(" ", solution.ActiveConfig); - - foreach(ConfigurationNode conf in project.Configurations) - { - ss.WriteLine(" ", conf.Name); - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - - ss.Write(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(string file in project.Files) - { - string buildAction; - string dependson = ""; - string resource_id = ""; - string copyToOutput = ""; - - switch(project.Files.GetBuildAction(file)) - { - case BuildAction.None: - buildAction = "Nothing"; - break; - - case BuildAction.Content: - buildAction = "Exclude"; - break; - - case BuildAction.EmbeddedResource: - buildAction = "EmbedAsResource"; - break; - - default: - buildAction = "Compile"; - break; - } - - if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) - buildAction = "FileCopy"; - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string extension = Path.GetExtension(file); - string designer_format = string.Format(".Designer{0}", extension); - - if (file.EndsWith(designer_format)) - { - string basename = file.Substring(0, file.LastIndexOf(designer_format)); - string[] extensions = new string[] { ".cs", ".resx", ".settings" }; - - foreach(string ext in extensions) - { - if (project.Files.Contains(basename + ext)) - { - dependson = string.Format(" dependson=\"{0}{1}\"", basename, ext); - break; - } - } - } - if (extension == ".resx") - { - buildAction = "EmbedAsResource"; - string basename = file.Substring(0, file.LastIndexOf(".resx")); - - // Visual Studio type resx + form dependency - if (project.Files.Contains(basename + ".cs")) - { - dependson = string.Format(" dependson=\"{0}{1}\"", basename, ".cs"); - } - - // We need to specify a resources file name to avoid MissingManifestResourceExceptions - // in libraries that are built. - resource_id = string.Format(" resource_id=\"{0}.{1}.resources\"", - project.AssemblyName, basename.Replace("/", ".")); - } - - switch(project.Files.GetCopyToOutput(file)) - { - case CopyToOutput.Always: - copyToOutput = string.Format(" copyToOutputDirectory=\"Always\""); - break; - case CopyToOutput.PreserveNewest: - copyToOutput = string.Format(" copyToOutputDirectory=\"PreserveNewest\""); - break; - } - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string filePath = PrependPath(file); - ss.WriteLine(" ", - filePath, buildAction, dependson, resource_id, copyToOutput); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ss.WriteLine(" {0}", BuildReference(solution, refr)); - } - ss.WriteLine(" "); - - - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - int count = 0; - - using(ss) - { - ss.WriteLine("", solution.Name); - - count = 0; - foreach(ConfigurationNode conf in solution.Configurations) - { - if(count == 0) - { - ss.WriteLine(" ", conf.Name); - } - - ss.WriteLine(" ", conf.Name); - foreach(ProjectNode project in solution.Projects) - { - ss.WriteLine(" ", project.Name, conf.Name); - } - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - - count = 0; - - foreach(ProjectNode project in solution.Projects) - { - if(count == 0) - ss.WriteLine(" ", project.Name); - - ss.WriteLine(" ", project.Name); - count++; - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine(" ", - Helper.MakeFilePath(path, project.Name, "mdp")); - } - ss.WriteLine(" "); - - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); - Helper.DeleteIfExists(slnFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "sharpdev"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base deleted file mode 100644 index 1efc16da5c..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/NAntTarget.cs.svn-base +++ /dev/null @@ -1,776 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -*/ - -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("nant")] - public class NAntTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr) - { - - if (!String.IsNullOrEmpty(refr.Path)) - { - return refr.Path; - } - - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name]; - string finalPath = - Helper.NormalizePath(refr.Name + GetProjectExtension(projectRef), '/'); - return finalPath; - } - - ProjectNode project = (ProjectNode) refr.Parent; - - // Do we have an explicit file reference? - string fileRef = FindFileReference(refr.Name, project); - if (fileRef != null) - { - return fileRef; - } - - // Is there an explicit path in the project ref? - if (refr.Path != null) - { - return Helper.NormalizePath(refr.Path + "/" + refr.Name + GetProjectExtension(project), '/'); - } - - // No, it's an extensionless GAC ref, but nant needs the .dll extension anyway - return refr.Name + ".dll"; - } - - public static string GetRefFileName(string refName) - { - if (ExtensionSpecified(refName)) - { - return refName; - } - else - { - return refName + ".dll"; - } - } - - private static bool ExtensionSpecified(string refName) - { - return refName.EndsWith(".dll") || refName.EndsWith(".exe"); - } - - private static string GetProjectExtension(ProjectNode project) - { - string extension = ".dll"; - if (project.Type == ProjectType.Exe || project.Type == ProjectType.WinExe) - { - extension = ".exe"; - } - return extension; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName); - - if (File.Exists(fullPath)) - { - return fullPath; - } - - fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - - fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - if (project.ConfigFile != null && project.ConfigFile.Length!=0) - { - ss.Write(" "); - } - - // Add the content files to just be copied - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); - - foreach (string file in project.Files) - { - // Ignore if we aren't content - if (project.Files.GetBuildAction(file) != BuildAction.Content) - continue; - - // Create a include tag - ss.WriteLine(" {0}", ""); - } - - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); - - ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - ss.WriteLine(" "); - } - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); - if (refr.Path != null) { - if (ExtensionSpecified(refr.Name)) - { - ss.WriteLine (" "); - } - else - { - ss.WriteLine (" "); - } - } - else - { - ss.WriteLine (" "); - } - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - if (!String.IsNullOrEmpty(conf.Options.OutputPath)) - { - string targetDir = Helper.NormalizePath(conf.Options.OutputPath, '/'); - - ss.WriteLine(" "); - - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - break; - } - } - - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating NAnt build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); - - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - // Use the active configuration, which is the first configuration name in the prebuild file. - Dictionary emittedConfigurations = new Dictionary(); - - ss.WriteLine(" ", solution.ActiveConfig); - ss.WriteLine(); - - foreach (ConfigurationNode conf in solution.Configurations) - { - // If the name isn't in the emitted configurations, we give a high level target to the - // platform specific on. This lets "Debug" point to "Debug-AnyCPU". - if (!emittedConfigurations.ContainsKey(conf.Name)) - { - // Add it to the dictionary so we only emit one. - emittedConfigurations.Add(conf.Name, conf.Platform); - - // Write out the target block. - ss.WriteLine(" ", conf.Name, conf.Platform); - ss.WriteLine(" "); - ss.WriteLine(); - } - - // Write out the target for the configuration. - ss.WriteLine(" ", conf.Name, conf.Platform); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine("\t\t ", conf.Platform); - ss.WriteLine(" "); - ss.WriteLine(); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - - // sdague - ok, this is an ugly hack, but what it lets - // us do is native include of files into the nant - // created files from all .nant/*include files. This - // lets us keep using prebuild, but allows for - // extended nant targets to do build and the like. - - try - { - Regex re = new Regex(".include$"); - DirectoryInfo nantdir = new DirectoryInfo(".nant"); - foreach (FileSystemInfo item in nantdir.GetFileSystemInfos()) - { - if (item is DirectoryInfo) { } - else if (item is FileInfo) - { - if (re.Match(item.FullName) != - System.Text.RegularExpressions.Match.Empty) - { - Console.WriteLine("Including file: " + item.FullName); - - using (FileStream fs = new FileStream(item.FullName, - FileMode.Open, - FileAccess.Read, - FileShare.None)) - { - using (StreamReader sr = new StreamReader(fs)) - { - ss.WriteLine("", (item).FullName); - while (sr.Peek() != -1) - { - ss.WriteLine(sr.ReadLine()); - } - ss.WriteLine(); - } - } - } - } - } - } - catch { } - // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" ", solution.Name, solution.Version); - // ss.WriteLine(" "); - - // ss.WriteLine(" "); - // // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" "); - // ss.WriteLine(" "); - ss.WriteLine(); - - - ss.WriteLine(" "); - ss.WriteLine(" "); - //ss.WriteLine(" "); - if (solution.Cleanup != null && solution.Cleanup.CleanFiles.Count > 0) - { - foreach (CleanFilesNode cleanFile in solution.Cleanup.CleanFiles) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" ", cleanFile.Pattern); - ss.WriteLine(" ", cleanFile.Pattern); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - } - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning NAnt build files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "nant"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base deleted file mode 100644 index 66dd1bc6f6..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelop2Target.cs.svn-base +++ /dev/null @@ -1,82 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -using Prebuild.Core.Attributes; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("sharpdev2")] - public class SharpDevelop2Target : VS2005Target - { - #region Properties - public override string VersionName - { - get - { - return "SharpDevelop2"; - } - } - #endregion - - #region Public Methods - - /// - /// Writes the specified kern. - /// - /// The kern. - public override void Write(Kernel kern) - { - base.Write(kern); - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public override void Clean(Kernel kern) - { - base.Clean(kern); - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return "sharpdev2"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base deleted file mode 100644 index 8e3205025f..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/SharpDevelopTarget.cs.svn-base +++ /dev/null @@ -1,425 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("sharpdev")] - public class SharpDevelopTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if(refr.Path != null || fileRef != null) - { - ret += "Assembly\" refto=\""; - - string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; - - ret += finalPath; - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - return ret; - } - - ret += "Gac\" refto=\""; - try - { - //Assembly assem = Assembly.Load(refr.Name); - ret += refr.Name;// assem.FullName; - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name; - } - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - } - - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if(File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - { - return "False"; - } - return "True"; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string csComp = "Csc"; - string netRuntime = "MsNet"; - if(project.Runtime == ClrRuntime.Mono) - { - csComp = "Mcs"; - netRuntime = "Mono"; - } - - string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using(ss) - { - ss.WriteLine( - "", - project.Name, - project.RootNamespace - ); - - ss.WriteLine(" "); - foreach(string file in project.Files) - { - string buildAction = "Compile"; - switch(project.Files.GetBuildAction(file)) - { - case BuildAction.None: - buildAction = "Nothing"; - break; - - case BuildAction.Content: - buildAction = "Exclude"; - break; - - case BuildAction.EmbeddedResource: - buildAction = "EmbedAsResource"; - break; - - default: - buildAction = "Compile"; - break; - } - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string filePath = PrependPath(file); - ss.WriteLine(" ", filePath, buildAction); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ss.WriteLine(" {0}", BuildReference(solution, refr)); - } - ss.WriteLine(" "); - - ss.Write(" "); - - int count = 0; - - ss.WriteLine(" ", solution.ActiveConfig); - - foreach(ConfigurationNode conf in project.Configurations) - { - ss.Write(" "); - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using(ss) - { - ss.WriteLine("", solution.Name); - - int count = 0; - foreach(ProjectNode project in solution.Projects) - { - if(count == 0) - ss.WriteLine(" ", project.Name); - - ss.WriteLine(" ", project.Name); - count++; - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine(" ", - Helper.MakeFilePath(path, project.Name, "prjx")); - } - ss.WriteLine(" "); - - count = 0; - foreach(ConfigurationNode conf in solution.Configurations) - { - if(count == 0) - { - ss.WriteLine(" ", conf.Name); - } - - ss.WriteLine(" ", conf.Name); - foreach(ProjectNode project in solution.Projects) - { - ss.WriteLine(" ", project.Name, conf.Name); - } - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); - Helper.DeleteIfExists(slnFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "sharpdev"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base deleted file mode 100644 index 935c6744db..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/ToolInfo.cs.svn-base +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - public struct ToolInfo - { - string name; - string guid; - string fileExtension; - string xmlTag; - string importProject; - - /// - /// Gets or sets the name. - /// - /// The name. - public string Name - { - get - { - return name; - } - set - { - name = value; - } - } - - /// - /// Gets or sets the GUID. - /// - /// The GUID. - public string Guid - { - get - { - return guid; - } - set - { - guid = value; - } - } - - /// - /// Gets or sets the file extension. - /// - /// The file extension. - public string FileExtension - { - get - { - return fileExtension; - } - set - { - fileExtension = value; - } - } - public string LanguageExtension - { - get - { - switch (this.Name) - { - case "C#": - return ".cs"; - case "VisualBasic": - return ".vb"; - case "Boo": - return ".boo"; - default: - return ".cs"; - } - } - } - /// - /// Gets or sets the XML tag. - /// - /// The XML tag. - public string XmlTag - { - get - { - return xmlTag; - } - set - { - xmlTag = value; - } - } - - /// - /// Gets or sets the import project property. - /// - /// The ImportProject tag. - public string ImportProject - { - get - { - return importProject; - } - set - { - importProject = value; - } - } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The GUID. - /// The file extension. - /// The XML. - /// The import project. - public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) - { - this.name = name; - this.guid = guid; - this.fileExtension = fileExtension; - this.xmlTag = xml; - this.importProject = importProject; - } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The GUID. - /// The file extension. - /// The XML. - public ToolInfo(string name, string guid, string fileExtension, string xml) - { - this.name = name; - this.guid = guid; - this.fileExtension = fileExtension; - this.xmlTag = xml; - this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; - } - - /// - /// Equals operator - /// - /// ToolInfo to compare - /// true if toolInfos are equal - public override bool Equals(object obj) - { - if (obj == null) - { - throw new ArgumentNullException("obj"); - } - if (obj.GetType() != typeof(ToolInfo)) - return false; - - ToolInfo c = (ToolInfo)obj; - return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); - } - - /// - /// Equals operator - /// - /// ToolInfo to compare - /// ToolInfo to compare - /// True if toolInfos are equal - public static bool operator ==(ToolInfo c1, ToolInfo c2) - { - return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); - } - - /// - /// Not equals operator - /// - /// ToolInfo to compare - /// ToolInfo to compare - /// True if toolInfos are not equal - public static bool operator !=(ToolInfo c1, ToolInfo c2) - { - return !(c1 == c2); - } - - /// - /// Hash Code - /// - /// Hash code - public override int GetHashCode() - { - return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); - - } - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base deleted file mode 100644 index 2292624473..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VS2002Target.cs.svn-base +++ /dev/null @@ -1,87 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; - -using Prebuild.Core.Attributes; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("vs2002")] - public class VS2002Target : VS2003Target - { - #region Private Methods - - private void SetVS2002() - { - this.SolutionVersion = "7.00"; - this.ProductVersion = "7.0.9254"; - this.SchemaVersion = "1.0"; - this.VersionName = "2002"; - this.Version = VSVersion.VS70; - } - - #endregion - - #region Public Methods - - /// - /// Writes the specified kern. - /// - /// The kern. - public override void Write(Kernel kern) - { - SetVS2002(); - base.Write(kern); - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public override void Clean(Kernel kern) - { - SetVS2002(); - base.Clean(kern); - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return "vs2002"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base deleted file mode 100644 index 10e2dc4a71..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VS2003Target.cs.svn-base +++ /dev/null @@ -1,593 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - [Target("vs2003")] - public class VS2003Target : ITarget - { - - #region Fields - - string solutionVersion = "8.00"; - string productVersion = "7.10.3077"; - string schemaVersion = "2.0"; - string versionName = "2003"; - VSVersion version = VSVersion.VS71; - - readonly Dictionary m_Tools = new Dictionary(); - Kernel m_Kernel; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - protected string SolutionVersion - { - get - { - return solutionVersion; - } - set - { - solutionVersion = value; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - protected string ProductVersion - { - get - { - return productVersion; - } - set - { - productVersion = value; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - protected string SchemaVersion - { - get - { - return schemaVersion; - } - set - { - schemaVersion = value; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - protected string VersionName - { - get - { - return versionName; - } - set - { - versionName = value; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - protected VSVersion Version - { - get - { - return version; - } - set - { - version = value; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2003Target() - { - m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); - m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach(ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if(ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch(ArgumentException) - { - m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if(!m_Tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = m_Tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - using(ps) - { - ps.WriteLine(""); - ps.WriteLine(" <{0}", toolInfo.XmlTag); - ps.WriteLine("\t\t\t\tProjectType = \"Local\""); - ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", ProductVersion); - ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", SchemaVersion); - ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); - ps.WriteLine("\t\t>"); - - ps.WriteLine("\t\t\t\t"); - ps.WriteLine(" "); - - foreach(ConfigurationNode conf in project.Configurations) - { - ps.WriteLine("\t\t\t\t "); - } - - ps.WriteLine(" "); - - ps.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach(string file in project.Files) - { - string fileName = file.Replace(".\\", ""); - ps.WriteLine(" "); - - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ps.WriteLine(" "); - - } - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" ", toolInfo.XmlTag); - ps.WriteLine(""); - } - - ps = new StreamWriter(projectFile + ".user"); - using(ps) - { - ps.WriteLine(""); - ps.WriteLine(" <{0}>", toolInfo.XmlTag); - ps.WriteLine(" "); - - ps.WriteLine(" ", MakeRefPath(project)); - foreach(ConfigurationNode conf in project.Configurations) - { - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" ", toolInfo.XmlTag); - ps.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false - // { - // return string.Empty; - // } - - //default to "AssemblyName.xml" - //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - //return (string)conf.Options["XmlDocFile", defaultValue]; - - //default to no XmlDocFile file - return (string)conf.Options["XmlDocFile", ""]; - } - - private void WriteSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", VersionName); - - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - StreamWriter ss = new StreamWriter(solutionFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - using(ss) - { - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); - foreach(ProjectNode project in solution.Projects) - { - if(!m_Tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = m_Tools[project.Language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", - toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, - toolInfo.FileExtension), project.Guid.ToString().ToUpper()); - - ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); - ss.WriteLine("\tEndProjectSection"); - - ss.WriteLine("EndProject"); - } - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); - foreach(ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.Name); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); - foreach(ProjectNode project in solution.Projects) - { - for(int i = 0; i < project.References.Count; i++) - { - ReferenceNode refr = project.References[i]; - if(solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProject = solution.ProjectsTable[refr.Name]; - ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", - project.Guid.ToString().ToUpper() - , i, - refProject.Guid.ToString().ToUpper() - ); - } - } - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); - foreach(ProjectNode project in solution.Projects) - { - foreach(ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", - project.Guid.ToString().ToUpper(), - conf.Name); - - ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", - project.Guid.ToString().ToUpper(), - conf.Name); - } - } - ss.WriteLine("\tEndGlobalSection"); - - if(solution.Files != null) - { - ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); - foreach(string file in solution.Files) - { - ss.WriteLine("\t\t{0} = {0}", file); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); - ss.WriteLine("\tEndGlobalSection"); - ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("EndGlobal"); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = m_Tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in m_Kernel.Solutions) - { - WriteSolution(sol); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in m_Kernel.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public virtual string Name - { - get - { - return "vs2003"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base deleted file mode 100644 index 9c70e26a37..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VS2005Target.cs.svn-base +++ /dev/null @@ -1,147 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("vs2005")] - public class VS2005Target : VSGenericTarget - { - #region Inner Classes - - #endregion - - #region Fields - - string solutionVersion = "9.00"; - string productVersion = "8.0.50727"; - string schemaVersion = "2.0"; - string versionName = "Visual C# 2005"; - string name = "vs2005"; - - VSVersion version = VSVersion.VS80; - - public override string SolutionTag - { - get { return "# Visual Studio 2005"; } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - return string.Empty; - } - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2005Target() - : base() - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base deleted file mode 100644 index fee4f7f27f..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VS2008Target.cs.svn-base +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - [Target("vs2008")] - public class VS2008Target : VSGenericTarget - { - #region Fields - string solutionVersion = "10.00"; - string productVersion = "9.0.21022"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2008"; - string name = "vs2008"; - VSVersion version = VSVersion.VS90; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v3_5: - return "ToolsVersion=\"3.5\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2008"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2008Target() - : base() - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base deleted file mode 100644 index b16120c389..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VS2010Target.cs.svn-base +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - [Target("vs2010")] - public class VS2010Target : VSGenericTarget - { - #region Fields - - string solutionVersion = "11.00"; - string productVersion = "9.0.30729"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2010"; - string name = "vs2010"; - VSVersion version = VSVersion.VS10; - - #endregion - - #region Properties - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v4_0: - case FrameworkVersion.v3_5: - return "ToolsVersion=\"4.0\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2010"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2010Target() - : base() - { - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base deleted file mode 100644 index cd3f5bbe1d..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VSGenericTarget.cs.svn-base +++ /dev/null @@ -1,922 +0,0 @@ -#region BSD License -/* -Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - public abstract class VSGenericTarget : ITarget - { - #region Fields - - readonly Dictionary tools = new Dictionary(); - Kernel kernel; - #endregion - - #region Properties - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public abstract string SolutionVersion { get; } - /// - /// Gets or sets the product version. - /// - /// The product version. - public abstract string ProductVersion { get; } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public abstract string SchemaVersion { get; } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public abstract string VersionName { get; } - /// - /// Gets or sets the version. - /// - /// The version. - public abstract VSVersion Version { get; } - /// - /// Gets the name. - /// - /// The name. - public abstract string Name { get; } - - protected abstract string GetToolsVersionXml(FrameworkVersion version); - public abstract string SolutionTag { get; } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - protected VSGenericTarget() - { - tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); - tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); - tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); - tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); - tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach (ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if (ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch (ArgumentException) - { - kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) - { - SolutionNode node = solution; - - while (node.Parent is SolutionNode) - node = node.Parent as SolutionNode; - - return FindProjectInSolutionRecursively(name, node); - } - - private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) - { - if (solution.ProjectsTable.ContainsKey(name)) - return solution.ProjectsTable[name]; - - foreach (SolutionNode child in solution.Solutions) - { - ProjectNode node = FindProjectInSolutionRecursively(name, child); - if (node != null) - return node; - } - - return null; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if (!tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - #region Project File - using (ps) - { - ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); - ps.WriteLine(" "); - ps.WriteLine(" Local"); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" {0}", SchemaVersion); - ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); - - // Visual Studio has a hard coded guid for the project type - if (project.Type == ProjectType.Web) - ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); - ps.WriteLine(" Debug"); - ps.WriteLine(" {0}", project.AppIcon); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", project.AssemblyName); - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ps.WriteLine(" {0}", conf.Options.KeyFile); - ps.WriteLine(" true"); - break; - } - } - ps.WriteLine(" JScript"); - ps.WriteLine(" Grid"); - ps.WriteLine(" IE50"); - ps.WriteLine(" false"); - ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); - - ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); - ps.WriteLine(" {0}", project.DesignerFolder); - ps.WriteLine(" {0}", project.RootNamespace); - ps.WriteLine(" {0}", project.StartupObject); - if (string.IsNullOrEmpty(project.DebugStartParameters)) - { - ps.WriteLine(" {0}", project.DebugStartParameters); - } - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" ", conf.Name, conf.Platform); - ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); - ps.WriteLine(" {0}", conf.Options["BaseAddress"]); - ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); - ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); - ps.WriteLine(" {0}", conf.Options["DebugInformation"]); - ps.WriteLine(" {0}", conf.Options["FileAlignment"]); - ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); - if (project.Type != ProjectType.Web) - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); - else - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath("bin\\"))); - - ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); - ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); - ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); - ps.WriteLine(" {0}", conf.Options["WarningLevel"]); - ps.WriteLine(" {0}", conf.Options["NoStdLib"]); - ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); - ps.WriteLine(" {0}", conf.Platform); - ps.WriteLine(" "); - } - - //ps.WriteLine(" "); - - Dictionary projectReferences = new Dictionary(); - List otherReferences = new List(); - - foreach (ReferenceNode refr in project.References) - { - ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); - - if (projectNode == null) - otherReferences.Add(refr); - else - projectReferences.Add(refr, projectNode); - } - // Assembly References - ps.WriteLine(" "); - - foreach (ReferenceNode refr in otherReferences) - { - ps.Write(" "); - ps.Write(" "); - ps.Write(refr.Name); - ps.WriteLine(""); - - if(!String.IsNullOrEmpty(refr.Path)) - { - // Use absolute path to assembly (for determining assembly type) - string absolutePath = Path.Combine(project.FullPath, refr.Path); - if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { - // Assembly is an executable (exe) - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); - } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { - // Assembly is an library (dll) - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); - } else { - string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); - kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); - } - } - - ps.WriteLine(" {0}", refr.LocalCopy); - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - //Project References - ps.WriteLine(" "); - foreach (KeyValuePair pair in projectReferences) - { - ToolInfo tool = tools[pair.Value.Language]; - if (tools == null) - throw new UnknownLanguageException(); - - string path = - Helper.MakePathRelativeTo(project.FullPath, - Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); - ps.WriteLine(" ", path); - - // TODO: Allow reference to visual basic projects - ps.WriteLine(" {0}", pair.Value.Name); - ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); - ps.WriteLine(" {0}", tool.Guid.ToUpper()); - - //This is the Copy Local flag in VS - ps.WriteLine(" {0}", pair.Key.LocalCopy); - - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ps.WriteLine(" "); - - // ps.WriteLine(" "); - List list = new List(); - - foreach (string path in project.Files) - { - string lower = path.ToLower(); - if (lower.EndsWith(".resx")) - { - string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); - if (!list.Contains(codebehind)) - list.Add(codebehind); - } - - } - - foreach (string filePath in project.Files) - { - // if (file == "Properties\\Bind.Designer.cs") - // { - // Console.WriteLine("Wait a minute!"); - // Console.WriteLine(project.Files.GetSubType(file).ToString()); - // } - SubType subType = project.Files.GetSubType(filePath); - - // Visual Studio chokes on file names if forward slash is used as a path separator - // instead of backslash. So we must make sure that all file paths written to the - // project file use \ as a path separator. - string file = filePath.Replace(@"/", @"\"); - - if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer - && subType != SubType.CodeBehind) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ps.WriteLine(" {0}", Path.GetFileName(file)); - ps.WriteLine(" Designer"); - ps.WriteLine(" "); - // - } - - if (subType == SubType.Designer) - { - ps.WriteLine(" ", file); - - string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; - string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; - - // Check for a parent .cs file with the same name as this designer file - if (File.Exists(Helper.NormalizePath(dependent_name))) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" ResXFileCodeGenerator"); - ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); - ps.WriteLine(" " + subType + ""); - } - - ps.WriteLine(" "); - if (File.Exists(Helper.NormalizePath(autogen_name))) - { - ps.WriteLine(" ", autogen_name); - //ps.WriteLine(" True"); - - // If a parent .cs file exists, link this autogen file to it. Otherwise link - // to the designer file - if (File.Exists(dependent_name)) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" True"); - ps.WriteLine(" {0}", Path.GetFileName(filePath)); - } - - ps.WriteLine(" "); - } - list.Add(autogen_name); - } - if (subType == SubType.Settings) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - ps.WriteLine("Include=\"{0}\">", file); - string fileName = Path.GetFileName(filePath); - if (project.Files.GetBuildAction(filePath) == BuildAction.None) - { - ps.WriteLine(" SettingsSingleFileGenerator"); - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - else - { - ps.WriteLine(" Code"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); - string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); - ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); - } - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - else if (subType != SubType.Designer) - { - string path = Helper.NormalizePath(file); - string path_lower = path.ToLower(); - - if (!list.Contains(filePath)) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - - int startPos = 0; - if (project.Files.GetPreservePath(filePath)) - { - while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) - startPos++; - - } - else - { - startPos = file.LastIndexOf(Path.GetFileName(path)); - } - - // be sure to write out the path with backslashes so VS recognizes - // the file properly. - ps.WriteLine("Include=\"{0}\">", file); - - int last_period_index = file.LastIndexOf('.'); - string short_file_name = file.Substring(0, last_period_index); - string extension = Path.GetExtension(path); - // make this upper case, so that when File.Exists tests for the - // existence of a designer file on a case-sensitive platform, - // it is correctly identified. - string designer_format = string.Format(".Designer{0}", extension); - - if (path_lower.EndsWith(designer_format.ToLowerInvariant())) - { - int designer_index = path.IndexOf(designer_format); - string file_name = path.Substring(0, designer_index); - - // There are two corrections to the next lines: - // 1. Fix the connection between a designer file and a form - // or usercontrol that don't have an associated resx file. - // 2. Connect settings files to associated designer files. - if (File.Exists(file_name + extension)) - ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); - else if (File.Exists(file_name + ".resx")) - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); - else if (File.Exists(file_name + ".settings")) - { - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - } - } - else if (subType == SubType.CodeBehind) - { - ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); - } - if (project.Files.GetIsLink(filePath)) - { - string alias = project.Files.GetLinkPath(filePath); - alias += file.Substring(startPos); - alias = Helper.NormalizePath(alias); - ps.WriteLine(" {0}", alias); - } - else if (project.Files.GetBuildAction(filePath) != BuildAction.None) - { - if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) - { - ps.WriteLine(" {0}", subType); - } - } - - if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) - { - ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); - } - - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - } - } - - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(""); - } - #endregion - - #region User File - - ps = new StreamWriter(projectFile + ".user"); - using (ps) - { - // Get the first configuration from the project. - ConfigurationNode firstConfiguration = null; - - if (project.Configurations.Count > 0) - { - firstConfiguration = project.Configurations[0]; - } - - ps.WriteLine(""); - //ps.WriteLine( "" ); - //ps.WriteLine(" <{0}>", toolInfo.XMLTag); - //ps.WriteLine(" "); - ps.WriteLine(" "); - //ps.WriteLine(" ", MakeRefPath(project)); - - if (firstConfiguration != null) - { - ps.WriteLine(" {0}", firstConfiguration.Name); - ps.WriteLine(" {0}", firstConfiguration.Platform); - } - - ps.WriteLine(" {0}", MakeRefPath(project)); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" ProjectFiles"); - ps.WriteLine(" 0"); - ps.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" "); - } - ps.WriteLine(""); - } - #endregion - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) - { - kernel.Log.Write("Creating {0} solution and project files", VersionName); - - foreach (SolutionNode child in solution.Solutions) - { - kernel.Log.Write("...Creating folder: {0}", child.Name); - WriteSolution(child, false); - } - - foreach (ProjectNode project in solution.Projects) - { - kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - - foreach (DatabaseProjectNode project in solution.DatabaseProjects) - { - kernel.Log.Write("...Creating database project: {0}", project.Name); - WriteDatabaseProject(solution, project); - } - - if (writeSolutionToDisk) // only write main solution - { - kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - - using (StreamWriter ss = new StreamWriter(solutionFile)) - { - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); - ss.WriteLine(SolutionTag); - - WriteProjectDeclarations(ss, solution, solution); - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); - WriteConfigurationLines(solution.Configurations, solution, ss); - ss.WriteLine("\tEndGlobalSection"); - - if (solution.Solutions.Count > 0) - { - ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); - foreach (SolutionNode embeddedSolution in solution.Solutions) - { - WriteNestedProjectMap(ss, embeddedSolution); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("EndGlobal"); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - } - - private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) - { - foreach (SolutionNode childSolution in embeddedSolution.Solutions) - { - WriteEmbeddedSolution(writer, childSolution); - WriteProjectDeclarations(writer, actualSolution, childSolution); - } - - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteProject(actualSolution, writer, project); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteProject(actualSolution, writer, dbProject); - } - - if (actualSolution.Guid == embeddedSolution.Guid) - { - WriteSolutionFiles(actualSolution, writer); - } - } - - private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) - { - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteNestedProject(writer, embeddedSolution, project.Guid); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteNestedProject(writer, embeddedSolution, dbProject.Guid); - } - - foreach (SolutionNode child in embeddedSolution.Solutions) - { - WriteNestedProject(writer, embeddedSolution, child.Guid); - WriteNestedProjectMap(writer, child); - } - } - - private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) - { - WriteNestedFolder(writer, solution.Guid, projectGuid); - } - - private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) - { - writer.WriteLine("\t\t{0} = {1}", - childGuid.ToString("B").ToUpper(), - parentGuid.ToString("B").ToUpper()); - } - - private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) - { - foreach (ProjectNode project in solution.Projects) - { - foreach (ConfigurationNode conf in configurations) - { - ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - - ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - } - } - - foreach (SolutionNode child in solution.Solutions) - { - WriteConfigurationLines(configurations, child, ss); - } - } - - private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) - { - if(solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); - } - - private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) - { - WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) - { - WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) - { - if (solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); - } - - const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; - const string ProjectDeclarationEndFormat = "EndProject"; - - private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); - - path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); - - WriteProject(ss, language, guid, name, path); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) - { - WriteProject(writer, language, projectGuid, name, location, null); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - writer.WriteLine(ProjectDeclarationBeginFormat, - toolInfo.Guid, - name, - location, - projectGuid.ToString("B").ToUpper()); - - if (files != null) - { - writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); - - foreach (string file in files) - writer.WriteLine("\t\t{0} = {0}", file); - - writer.WriteLine("\tEndProjectSection"); - } - - writer.WriteLine(ProjectDeclarationEndFormat); - } - - private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) - { - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); - IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); - - kernel.CurrentWorkingDirectory.Push(); - - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - using (ps) - { - ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); - ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); - ps.Indent++; - ps.WriteLine("MSDTVersion = \"80\""); - // TODO: Use the project.Files property - if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) - WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); - - ps.WriteLine("Begin DBRefFolder = \"Database References\""); - ps.Indent++; - foreach (DatabaseReferenceNode reference in project.References) - { - ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); - ps.Indent++; - ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); - ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); - //ps.WriteLine("Colorizer = 5"); - ps.Indent--; - ps.WriteLine("End"); - } - ps.Indent--; - ps.WriteLine("End"); - ps.Indent--; - ps.WriteLine("End"); - - ps.Flush(); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - - private static bool ContainsSqlFiles(string folder) - { - if(Directory.GetFiles(folder, "*.sql").Length > 0) - return true; // if the folder contains 1 .sql file, that's good enough - - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - return true; // if 1 child folder contains a .sql file, still good enough - } - - return false; - } - - private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) - { - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - { - writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); - writer.Indent++; - WriteDatabaseFoldersAndFiles(writer, child); - writer.Indent--; - writer.WriteLine("End"); - } - } - foreach (string file in Directory.GetFiles(folder, "*.sql")) - { - writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); - } - } - - private void CleanProject(ProjectNode project) - { - kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - WriteSolution(sol, true); - } - kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - CleanSolution(sol); - } - kernel = null; - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base deleted file mode 100644 index 699b5ca019..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/VSVersion.cs.svn-base +++ /dev/null @@ -1,54 +0,0 @@ -#region BSD License -/* -Copyright (c) 2008-2009 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com), John Anderson (sontek@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - public enum VSVersion - { - /// - /// Visual Studio 2002 - /// - VS70, - /// - /// Visual Studio 2003 - /// - VS71, - /// - /// Visual Studio 2005 - /// - VS80, - /// - /// Visual Studio 2008 - /// - VS90, - /// - /// Visual Studio 2010 - /// - VS10 - } -} diff --git a/Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base b/Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base deleted file mode 100644 index 5393cec05f..0000000000 --- a/Prebuild/src/Core/Targets/.svn/text-base/XcodeTarget.cs.svn-base +++ /dev/null @@ -1,594 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("xcode")] - public class XcodeTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path + "/" + refr.Name + ".dll", '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - //Assembly assem = Assembly.Load(refr.Name); - //if (assem != null) - //{ - //ret += (refr.Name + ".dll"); - //} - //else - //{ - ret += (refr.Name + ".dll"); - //} - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name + ".dll"; - } - } - return ret; - } - - private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - Assembly assem = Assembly.Load(refr.Name); - if (assem != null) - { - ret += ""; - } - else - { - ret += ""; - } - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += ""; - } - } - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - ss.WriteLine(" ", '/')); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating Xcode build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj")); - if (!directoryInfo.Exists) - { - directoryInfo.Create(); - } - string combFile = Helper.MakeFilePath(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj"), "project", "pbxproj"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); - - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - foreach (ConfigurationNode conf in solution.Configurations) - { - // Set the project.config to a non-debug configuration - if (conf.Options["DebugInformation"].ToString().ToLower() != "true") - { - ss.WriteLine(" ", conf.Name); - } - ss.WriteLine(); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine(" "); - ss.WriteLine(); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - //foreach(ProjectNode project in solution.Projects) - //{ - // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - // ss.Write(" "); - //} - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Xcode build files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "xcode"; - } - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/.svn/all-wcprops b/Prebuild/src/Core/Utilities/.svn/all-wcprops deleted file mode 100644 index 7418c29534..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/all-wcprops +++ /dev/null @@ -1,29 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 60 -/svnroot/dnpb/!svn/ver/309/trunk/Prebuild/src/Core/Utilities -END -Helper.cs -K 25 -svn:wc:ra_dav:version-url -V 70 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Utilities/Helper.cs -END -Log.cs -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/309/trunk/Prebuild/src/Core/Utilities/Log.cs -END -CommandLineCollection.cs -K 25 -svn:wc:ra_dav:version-url -V 85 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Utilities/CommandLineCollection.cs -END -CurrentDirectory.cs -K 25 -svn:wc:ra_dav:version-url -V 80 -/svnroot/dnpb/!svn/ver/307/trunk/Prebuild/src/Core/Utilities/CurrentDirectory.cs -END diff --git a/Prebuild/src/Core/Utilities/.svn/dir-prop-base b/Prebuild/src/Core/Utilities/.svn/dir-prop-base deleted file mode 100644 index a1989a0b6d..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/dir-prop-base +++ /dev/null @@ -1,5 +0,0 @@ -K 10 -svn:ignore -V 5 -*.swp -END diff --git a/Prebuild/src/Core/Utilities/.svn/entries b/Prebuild/src/Core/Utilities/.svn/entries deleted file mode 100644 index cc148d7550..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/entries +++ /dev/null @@ -1,164 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Core/Utilities -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2009-04-15T01:40:10.014568Z -309 -kunnis -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -Helper.cs -file - - - - -2010-09-10T22:51:44.000000Z -7a0749dec0ce5453fc73dd11f89ce613 -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -14966 - -Log.cs -file - - - - -2010-09-10T22:51:44.000000Z -d91804d20a90778d74744cd14bb2fa4c -2009-04-15T01:40:10.014568Z -309 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -6100 - -CommandLineCollection.cs -file - - - - -2010-09-10T22:51:44.000000Z -2a00bed45ea425e5e8a21a5ff6a68d69 -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -4032 - -CurrentDirectory.cs -file - - - - -2010-09-10T22:51:44.000000Z -e710723e685cc628a3761209001c8767 -2009-04-15T01:28:16.827957Z -307 -kunnis -has-props - - - - - - - - - - - - - - - - - - - - -2124 - diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/prop-base/CommandLineCollection.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/prop-base/CurrentDirectory.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/prop-base/Helper.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/prop-base/Log.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base deleted file mode 100644 index 786fa1e49d..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/text-base/CommandLineCollection.cs.svn-base +++ /dev/null @@ -1,152 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System.Collections; -using System.Collections.Generic; - -namespace Prebuild.Core.Utilities -{ - /// - /// The CommandLine class parses and interprets the command-line arguments passed to - /// prebuild. - /// - public class CommandLineCollection : IEnumerable> - { - #region Fields - - // The raw OS arguments - private readonly string[] m_RawArgs; - - // Command-line argument storage - private readonly Dictionary m_Arguments = new Dictionary(); - - #endregion - - #region Constructors - - /// - /// Create a new CommandLine instance and set some internal variables. - /// - public CommandLineCollection(string[] args) - { - m_RawArgs = args; - - Parse(); - } - - #endregion - - #region Private Methods - - private void Parse() - { - if(m_RawArgs.Length < 1) - return; - - int idx = 0; - string lastArg = null; - - while(idx 2 && arg[0] == '/') - { - arg = arg.Substring(1); - lastArg = arg; - m_Arguments[arg] = ""; - } - else - { - if(lastArg != null) - { - m_Arguments[lastArg] = arg; - lastArg = null; - } - } - - idx++; - } - } - - #endregion - - #region Public Methods - - /// - /// Wases the passed. - /// - /// The arg. - /// - public bool WasPassed(string arg) - { - return (m_Arguments.ContainsKey(arg)); - } - - #endregion - - #region Properties - - /// - /// Gets the parameter associated with the command line option - /// - /// Returns null if option was not specified, - /// null string if no parameter was specified, and the value if a parameter was specified - public string this[string index] - { - get - { - if(m_Arguments.ContainsKey(index)) - { - return (m_Arguments[index]); - } - return null; - } - } - - #endregion - - #region IEnumerable Members - - /// - /// Returns an enumerator that can iterate through a collection. - /// - /// - /// An - /// that can be used to iterate through the collection. - /// - public IEnumerator> GetEnumerator() - { - return m_Arguments.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base deleted file mode 100644 index 9624c35ed5..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/text-base/CurrentDirectory.cs.svn-base +++ /dev/null @@ -1,68 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public class CurrentDirectory - { - #region Fields - - private readonly Stack m_Stack = new Stack(); - - #endregion - - #region Public Methods - - /// - /// Pushes this instance. - /// - public void Push() - { - m_Stack.Push(Environment.CurrentDirectory); - } - - /// - /// Pops this instance. - /// - public void Pop() - { - if(m_Stack.Count < 1) - { - return; - } - - string cwd = m_Stack.Pop(); - Helper.SetCurrentDir(cwd); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base deleted file mode 100644 index 8c3e9680c5..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/text-base/Helper.cs.svn-base +++ /dev/null @@ -1,575 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Collections.Specialized; -using System.Xml; -using Prebuild.Core.Nodes; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public class Helper - { - #region Fields - - static bool checkForOSVariables; - - /// - /// - /// - public static bool CheckForOSVariables - { - get - { - return checkForOSVariables; - } - set - { - checkForOSVariables = value; - } - } - - #endregion - - #region Public Methods - - #region String Parsing - - public delegate string StringLookup(string key); - - /// - /// Gets a collection of StringLocationPair objects that represent the matches - /// - /// The target. - /// The before group. - /// The after group. - /// if set to true [include delimiters in substrings]. - /// - public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) - { - if( beforeGroup == null ) - { - throw new ArgumentNullException("beforeGroup"); - } - if( afterGroup == null ) - { - throw new ArgumentNullException("afterGroup"); - } - StringCollection results = new StringCollection(); - if(target == null || target.Length == 0) - { - return results; - } - - int beforeMod = 0; - int afterMod = 0; - if(includeDelimitersInSubstrings) - { - //be sure to not exlude the delims - beforeMod = beforeGroup.Length; - afterMod = afterGroup.Length; - } - int startIndex = 0; - while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { - int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it - if(endIndex == -1) - { - break; - } - int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string - string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, - length - afterMod); - - results.Add(substring); - //results.Add(new StringLocationPair(substring,startIndex)); - startIndex = endIndex + 1; - //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization - //so start after endIndex - - } - return results; - } - - /// - /// Replaces the groups. - /// - /// The target. - /// The before group. - /// The after group. - /// The lookup. - /// - public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { - if( target == null ) - { - throw new ArgumentNullException("target"); - } - //int targetLength = target.Length; - StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); - if( lookup == null ) - { - throw new ArgumentNullException("lookup"); - } - foreach(string substring in strings) - { - target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); - } - return target; - } - - /// - /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate - /// - /// The target. - /// The lookup. - /// - public static string InterpolateForVariables(string target, StringLookup lookup) - { - return ReplaceGroups(target, "${" , "}" , lookup); - } - - /// - /// Replaces ${var} statements in a string with the corresonding environment variable with name var - /// - /// - /// - public static string InterpolateForEnvironmentVariables(string target) - { - return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); - } - - #endregion - - /// - /// Translates the value. - /// - /// Type of the translate. - /// The translation item. - /// - public static object TranslateValue(Type translateType, string translationItem) - { - if(translationItem == null) - { - return null; - } - - try - { - string lowerVal = translationItem.ToLower(); - if(translateType == typeof(bool)) - { - return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); - } - else if(translateType == typeof(int)) - { - return (Int32.Parse(translationItem)); - } - else - { - return translationItem; - } - } - catch(FormatException) - { - return null; - } - } - - /// - /// Deletes if exists. - /// - /// The file. - /// - public static bool DeleteIfExists(string file) - { - string resFile = null; - try - { - resFile = ResolvePath(file); - } - catch(ArgumentException) - { - return false; - } - - if(!File.Exists(resFile)) - { - return false; - } - - File.Delete(resFile); - return true; - } - - static readonly char seperator = Path.DirectorySeparatorChar; - - // This little gem was taken from the NeL source, thanks guys! - /// - /// Makes a relative path - /// - /// Path to start from - /// Path to end at - /// Path that will get from startPath to endPath - public static string MakePathRelativeTo(string startPath, string endPath) - { - string tmp = NormalizePath(startPath, seperator); - string src = NormalizePath(endPath, seperator); - string prefix = ""; - - while(true) - { - if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) - { - string ret; - int size = tmp.Length; - if(size == src.Length) - { - return "./"; - } - if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) - { - } - else - { - ret = prefix + endPath.Substring(size, endPath.Length - size); - ret = ret.Trim(); - if(ret[0] == seperator) - { - ret = "." + ret; - } - - return NormalizePath(ret); - } - - } - - if(tmp.Length < 2) - { - break; - } - - int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); - int prevPos = tmp.IndexOf(seperator); - - if((lastPos == prevPos) || (lastPos == -1)) - { - break; - } - - tmp = tmp.Substring(0, lastPos + 1); - prefix += ".." + seperator.ToString(); - } - - return endPath; - } - - /// - /// Resolves the path. - /// - /// The path. - /// - public static string ResolvePath(string path) - { - string tmpPath = NormalizePath(path); - if(tmpPath.Length < 1) - { - tmpPath = "."; - } - - tmpPath = Path.GetFullPath(tmpPath); - if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) - { - throw new ArgumentException("Path could not be resolved: " + tmpPath); - } - - return tmpPath; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// The separator character. - /// - public static string NormalizePath(string path, char separatorCharacter) - { - if(path == null || path == "" || path.Length < 1) - { - return ""; - } - - string tmpPath = path.Replace('\\', '/'); - tmpPath = tmpPath.Replace('/', separatorCharacter); - return tmpPath; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - return NormalizePath(path, Path.DirectorySeparatorChar); - } - - /// - /// Ends the path. - /// - /// The path. - /// The separator character. - /// - public static string EndPath(string path, char separatorCharacter) - { - if(path == null || path == "" || path.Length < 1) - { - return ""; - } - - if(!path.EndsWith(separatorCharacter.ToString())) - { - return (path + separatorCharacter); - } - - return path; - } - - /// - /// Ends the path. - /// - /// The path. - /// - public static string EndPath(string path) - { - return EndPath(path, Path.DirectorySeparatorChar); - } - - /// - /// Makes the file path. - /// - /// The path. - /// The name. - /// The ext. - /// - public static string MakeFilePath(string path, string name, string ext) - { - string ret = EndPath(NormalizePath(path)); - - if( name == null ) - { - throw new ArgumentNullException("name"); - } - - ret += name; - if(!name.EndsWith("." + ext)) - { - ret += "." + ext; - } - - //foreach(char c in Path.GetInvalidPathChars()) - //{ - // ret = ret.Replace(c, '_'); - //} - - return ret; - } - - /// - /// Makes the file path. - /// - /// The path. - /// The name. - /// - public static string MakeFilePath(string path, string name) - { - string ret = EndPath(NormalizePath(path)); - - if( name == null ) - { - throw new ArgumentNullException("name"); - } - - ret += name; - - //foreach (char c in Path.GetInvalidPathChars()) - //{ - // ret = ret.Replace(c, '_'); - //} - - return ret; - } - - /// - /// - /// - /// - /// - public static string MakeReferencePath(string path) - { - string ret = EndPath(NormalizePath(path)); - - //foreach (char c in Path.GetInvalidPathChars()) - //{ - // ret = ret.Replace(c, '_'); - //} - - return ret; - } - - /// - /// Sets the current dir. - /// - /// The path. - public static void SetCurrentDir(string path) - { - if( path == null ) - { - throw new ArgumentNullException("path"); - } - if(path.Length < 1) - { - return; - } - - Environment.CurrentDirectory = path; - } - - /// - /// Checks the type. - /// - /// The type to check. - /// The attr. - /// The inter. - /// - public static object CheckType(Type typeToCheck, Type attr, Type inter) - { - if(typeToCheck == null || attr == null) - { - return null; - } - - object[] attrs = typeToCheck.GetCustomAttributes(attr, false); - if(attrs == null || attrs.Length < 1) - { - return null; - } - if( inter == null ) - { - throw new ArgumentNullException("inter"); - } - - if(typeToCheck.GetInterface(inter.FullName) == null) - { - return null; - } - - return attrs[0]; - } - - /// - /// Attributes the value. - /// - /// The node. - /// The attr. - /// The def. - /// - public static string AttributeValue(XmlNode node, string attr, string def) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(node.Attributes[attr] == null) - { - return def; - } - string val = node.Attributes[attr].Value; - if(!CheckForOSVariables) - { - return val; - } - - return InterpolateForEnvironmentVariables(val); - } - - /// - /// Parses the boolean. - /// - /// The node. - /// The attr. - /// if set to true [default value]. - /// - public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(node.Attributes[attr] == null) - { - return defaultValue; - } - return bool.Parse(node.Attributes[attr].Value); - } - - /// - /// Enums the attribute value. - /// - /// The node. - /// The attr. - /// Type of the enum. - /// The def. - /// - public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) - { - if( def == null ) - { - throw new ArgumentNullException("def"); - } - string val = AttributeValue(node, attr, def.ToString()); - return Enum.Parse(enumType, val, true); - } - - /// - /// - /// - /// - /// - /// - public static string AssemblyFullName(string assemblyName, ProjectType projectType) - { - return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); - } - - #endregion - } -} diff --git a/Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base b/Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base deleted file mode 100644 index 4df3defdd0..0000000000 --- a/Prebuild/src/Core/Utilities/.svn/text-base/Log.cs.svn-base +++ /dev/null @@ -1,276 +0,0 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.IO; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public enum LogType - { - /// - /// - /// - None, - /// - /// - /// - Info, - /// - /// - /// - Warning, - /// - /// - /// - Error - } - - /// - /// - /// - [Flags] - public enum LogTargets - { - /// - /// - /// - None = 0, - /// - /// - /// - Null = 1, - /// - /// - /// - File = 2, - /// - /// - /// - Console = 4 - } - - /// - /// Summary description for Log. - /// - public class Log : IDisposable - { - #region Fields - - private TextWriter m_Writer; - private LogTargets m_Target = LogTargets.Null; - bool disposed; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The target. - /// Name of the file. - public Log(LogTargets target, string fileName) - { - m_Target = target; - - if ((m_Target & LogTargets.File) != 0) - { - m_Writer = new StreamWriter(fileName, false); - } - else if ((m_Target & LogTargets.Console) != 0) - { - // Prevents null reference exceptions when outputing to the log file. - // This seems to only happen when running on a network drive. - m_Writer = Console.Out; - } - } - - #endregion - - #region Public Methods - - /// - /// Writes this instance. - /// - public void Write() - { - Write(string.Empty); - } - - /// - /// Writes the specified MSG. - /// - /// The MSG. - public void Write(string msg) - { - if((m_Target & LogTargets.Null) != 0) - { - return; - } - - if((m_Target & LogTargets.Console) != 0) - { - Console.WriteLine(msg); - } - if((m_Target & LogTargets.File) != 0 && m_Writer != null) - { - m_Writer.WriteLine(msg); - } - } - - /// - /// Writes the specified format. - /// - /// The format. - /// The args. - public void Write(string format, params object[] args) - { - Write(string.Format(format,args)); - } - - /// - /// Writes the specified type. - /// - /// The type. - /// The format. - /// The args. - public void Write(LogType type, string format, params object[] args) - { - if((m_Target & LogTargets.Null) != 0) - { - return; - } - - string str = ""; - switch(type) - { - case LogType.Info: - str = "[I] "; - break; - case LogType.Warning: - str = "[!] "; - break; - case LogType.Error: - str = "[X] "; - break; - } - - Write(str + format,args); - } - - /// - /// Writes the exception. - /// - /// The type. - /// The ex. - public void WriteException(LogType type, Exception ex) - { - if(ex != null) - { - Write(type, ex.Message); - //#if DEBUG - m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); - m_Writer.WriteLine(ex.StackTrace); - m_Writer.WriteLine("]]"); - //#endif - } - } - - /// - /// Flushes this instance. - /// - public void Flush() - { - if(m_Writer != null) - { - m_Writer.Flush(); - } - } - - #endregion - - #region IDisposable Members - - /// - /// Performs application-defined tasks associated with freeing, releasing, or - /// resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose objects - /// - /// - /// If true, it will dispose close the handle - /// - /// - /// Will dispose managed and unmanaged resources. - /// - protected virtual void Dispose(bool disposing) - { - if (!this.disposed) - { - if (disposing) - { - if (m_Writer != null) - { - m_Writer.Close(); - m_Writer = null; - } - } - } - this.disposed = true; - } - - /// - /// - /// - ~Log() - { - this.Dispose(false); - } - - /// - /// Closes and destroys this object - /// - /// - /// Same as Dispose(true) - /// - public void Close() - { - Dispose(); - } - - #endregion - } -} diff --git a/Prebuild/src/Properties/.svn/all-wcprops b/Prebuild/src/Properties/.svn/all-wcprops deleted file mode 100644 index 0fdb604823..0000000000 --- a/Prebuild/src/Properties/.svn/all-wcprops +++ /dev/null @@ -1,11 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 56 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Properties -END -AssemblyInfo.cs -K 25 -svn:wc:ra_dav:version-url -V 72 -/svnroot/dnpb/!svn/ver/323/trunk/Prebuild/src/Properties/AssemblyInfo.cs -END diff --git a/Prebuild/src/Properties/.svn/entries b/Prebuild/src/Properties/.svn/entries deleted file mode 100644 index 0a81c5c094..0000000000 --- a/Prebuild/src/Properties/.svn/entries +++ /dev/null @@ -1,62 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/Properties -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-09-10T17:51:36.189738Z -323 -jhurliman - - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -AssemblyInfo.cs -file - - - - -2010-09-10T22:51:45.000000Z -91e38b76ed4b8de4873bd78e0c587989 -2010-09-10T17:51:36.189738Z -323 -jhurliman -has-props - - - - - - - - - - - - - - - - - - - - -4691 - diff --git a/Prebuild/src/Properties/.svn/prop-base/AssemblyInfo.cs.svn-base b/Prebuild/src/Properties/.svn/prop-base/AssemblyInfo.cs.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/Properties/.svn/prop-base/AssemblyInfo.cs.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/Properties/.svn/text-base/AssemblyInfo.cs.svn-base b/Prebuild/src/Properties/.svn/text-base/AssemblyInfo.cs.svn-base deleted file mode 100644 index f3ac30f39d..0000000000 --- a/Prebuild/src/Properties/.svn/text-base/AssemblyInfo.cs.svn-base +++ /dev/null @@ -1,113 +0,0 @@ -#region BSD License -/* - -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Dave Hudson (jendave@yahoo.com), -Rob Loach (http://www.robloach.net), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Resources; - - -// FxCop recommended attributes -[assembly: ComVisible(false)] -[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted=true)] -[assembly: CLSCompliant(true)] - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle(".NET Prebuild")] -[assembly: AssemblyDescription("A .NET project file build tool")] -[assembly: AssemblyConfiguration(".NET CLR")] -[assembly: AssemblyCompany("The Prebuild Project")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright 2004-2010 " + - "Matthew Holmes, " + - "Dan Moorehead, " + - "C.J. Adams-Collier, " + - "Rob Loach, " + - "David Hudson," + - "John Hurliman")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguageAttribute("en-US")] -[assembly: AssemblyVersion("2.0.5.*")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyName("")] diff --git a/Prebuild/src/data/.svn/all-wcprops b/Prebuild/src/data/.svn/all-wcprops deleted file mode 100644 index 3af3c24715..0000000000 --- a/Prebuild/src/data/.svn/all-wcprops +++ /dev/null @@ -1,71 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 50 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/data -END -dnpb-1.3.xsd -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.3.xsd -END -dnpb-1.4.xsd -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.4.xsd -END -dnpb-1.5.xsd -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.5.xsd -END -prebuild-1.6.xsd -K 25 -svn:wc:ra_dav:version-url -V 66 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/prebuild-1.6.xsd -END -prebuild-1.7.xsd -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/299/trunk/Prebuild/src/data/prebuild-1.7.xsd -END -prebuild-1.8.xsd -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/314/trunk/Prebuild/src/data/prebuild-1.8.xsd -END -autotools.xml -K 25 -svn:wc:ra_dav:version-url -V 64 -/svnroot/dnpb/!svn/ver/256/trunk/Prebuild/src/data/autotools.xml -END -prebuild-1.9.xsd -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/316/trunk/Prebuild/src/data/prebuild-1.9.xsd -END -dnpb-1.0.xsd -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.0.xsd -END -dnpb-1.1.xsd -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.1.xsd -END -dnpb-1.2.xsd -K 25 -svn:wc:ra_dav:version-url -V 62 -/svnroot/dnpb/!svn/ver/96/trunk/Prebuild/src/data/dnpb-1.2.xsd -END diff --git a/Prebuild/src/data/.svn/dir-prop-base b/Prebuild/src/data/.svn/dir-prop-base deleted file mode 100644 index 29ffe333a0..0000000000 --- a/Prebuild/src/data/.svn/dir-prop-base +++ /dev/null @@ -1,6 +0,0 @@ -K 10 -svn:ignore -V 11 -*.swp -*.xsx -END diff --git a/Prebuild/src/data/.svn/entries b/Prebuild/src/data/.svn/entries deleted file mode 100644 index 935b447cff..0000000000 --- a/Prebuild/src/data/.svn/entries +++ /dev/null @@ -1,402 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/src/data -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2010-05-08T05:43:01.449559Z -316 -jhurliman -has-props - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -dnpb-1.3.xsd -file - - - - -2010-09-10T22:51:45.000000Z -636ed9edea90e5104ad1879c96552b91 -2004-12-29T02:08:06.000000Z -35 -xeonx -has-props - - - - - - - - - - - - - - - - - - - - -7995 - -dnpb-1.4.xsd -file - - - - -2010-09-10T22:51:45.000000Z -3e883fc616c786e3835ba3386ede4269 -2005-12-23T06:05:38.000000Z -39 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -8197 - -dnpb-1.5.xsd -file - - - - -2010-09-10T22:51:45.000000Z -c692bbcd63f10ca4c93da1c19f5b107e -2006-01-23T23:19:16.000000Z -55 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -8420 - -prebuild-1.6.xsd -file - - - - -2010-09-10T22:51:45.000000Z -61f6e6f13f64ae842b1324cf145934ad -2006-02-28T18:13:10.884431Z -95 -jendave -has-props - - - - - - - - - - - - - - - - - - - - -9770 - -prebuild-1.7.xsd -file - - - - -2010-09-10T22:51:45.000000Z -edf1193fad8922061845cf48cc8eb851 -2009-02-21T05:36:29.327384Z -299 -kunnis - - - - - - - - - - - - - - - - - - - - - -16083 - -prebuild-1.8.xsd -file - - - - -2010-09-10T22:51:45.000000Z -6eb078509319faa7ae4cdc55af184ac1 -2009-06-06T19:43:44.493200Z -314 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -15296 - -autotools.xml -file - - - - -2010-09-10T22:51:45.000000Z -e119a174539f100e18d2ee73c5660318 -2008-02-07T16:31:29.630257Z -256 -cjcollier - - - - - - - - - - - - - - - - - - - - - -27653 - -prebuild-1.9.xsd -file - - - - -2010-09-10T22:51:45.000000Z -8988b0f7fc4462d76183a4c0b72121e9 -2010-05-08T05:43:01.449559Z -316 -jhurliman - - - - - - - - - - - - - - - - - - - - - -14622 - -dnpb-1.0.xsd -file - - - - -2010-09-10T22:51:45.000000Z -080c1e8ce73ec5aff528c2a62b355c38 -2004-04-19T07:06:45.000000Z -17 -calefaction -has-props - - - - - - - - - - - - - - - - - - - - -6878 - -dnpb-1.1.xsd -file - - - - -2010-09-10T22:51:45.000000Z -b00a1d973849b76554afb17f8a21978c -2004-04-22T00:51:14.000000Z -18 -calefaction -has-props - - - - - - - - - - - - - - - - - - - - -6883 - -dnpb-1.2.xsd -file - - - - -2010-09-10T22:51:45.000000Z -7ebd6286a2df12ef5e21e835342b1daa -2004-09-15T19:40:37.000000Z -29 -calefaction -has-props - - - - - - - - - - - - - - - - - - - - -7639 - diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/dnpb-1.0.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/dnpb-1.1.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/dnpb-1.2.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/dnpb-1.3.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/dnpb-1.4.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/dnpb-1.5.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base b/Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base deleted file mode 100644 index 7b57b302a4..0000000000 --- a/Prebuild/src/data/.svn/prop-base/prebuild-1.6.xsd.svn-base +++ /dev/null @@ -1,9 +0,0 @@ -K 13 -svn:eol-style -V 6 -native -K 12 -svn:keywords -V 23 -Author Date Id Revision -END diff --git a/Prebuild/src/data/.svn/text-base/autotools.xml.svn-base b/Prebuild/src/data/.svn/text-base/autotools.xml.svn-base deleted file mode 100644 index ee4b0643dc..0000000000 --- a/Prebuild/src/data/.svn/text-base/autotools.xml.svn-base +++ /dev/null @@ -1,790 +0,0 @@ - - - - - #!/bin/sh -# Run this to generate all the initial makefiles, etc. -# Ripped off from Mono, which ripped off from GNOME macros version - -DIE=0 - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -if [ -n "$MONO_PATH" ]; then - # from -> /mono/lib:/another/mono/lib - # to -> /mono /another/mono - for i in `echo ${MONO_PATH} | tr ":" " "`; do - i=`dirname ${i}` - if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then - ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" - fi - if [ -n "{i}" -a -d "${i}/bin" ]; then - PATH="${i}/bin:$PATH" - fi - done - export PATH -fi - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to compile Mono." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if [ -z "$LIBTOOL" ]; then - LIBTOOL=`which glibtool 2>/dev/null` - if [ ! -x "$LIBTOOL" ]; then - LIBTOOL=`which libtool` - fi -fi - -(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { - ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`libtool' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { - grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ - (gettext --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`gettext' installed to compile Mono." - echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$NOCONFIGURE"; then - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - - -if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then - if test -z "$NO_LIBTOOLIZE" ; then - echo "Running libtoolize..." - ${LIBTOOL}ize --force --copy - fi -fi - -echo "Running aclocal $ACLOCAL_FLAGS ..." -aclocal $ACLOCAL_FLAGS || { - echo - echo "**Error**: aclocal failed. This may mean that you have not" - echo "installed all of the packages you need, or you may need to" - echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" - echo "for the prefix where you installed the packages whose" - echo "macros were not found" - exit 1 -} - -if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader || { echo "**Error**: autoheader failed."; exit 1; } -fi - -echo "Running automake --gnu $am_opt ..." -automake --add-missing --gnu $am_opt || - { echo "**Error**: automake failed."; exit 1; } -echo "Running autoconf ..." -autoconf || { echo "**Error**: autoconf failed."; exit 1; } - -conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME || exit 1 -else - echo Skipping configure process. -fi - - - - - - - - - - - - - - - - AC_INIT([],[]) - -AC_PREREQ(2.60) -AC_CANONICAL_SYSTEM -AC_CONFIG_AUX_DIR(.) -AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) -AM_MAINTAINER_MODE -dnl AC_PROG_INTLTOOL([0.25]) -AC_PROG_INSTALL - -ASSEMBLY_NAME= -PROJECT_NAME= -PROJECT_VERSION=$VERSION -PROJECT_DESCRIPTION="" -PROJECT_TYPE="" - -AC_SUBST(ASSEMBLY_NAME) -AC_SUBST(PROJECT_NAME) -AC_SUBST(PROJECT_VERSION) -AC_SUBST(DESCRIPTION) - -AC_MSG_CHECKING([assembly type]) -case $PROJECT_TYPE in - *Exe) - ASSEMBLY_EXTENSION=exe - ;; - *Library) - ASSEMBLY_EXTENSION=dll - ;; - *) - AC_MSG_ERROR([*** Please add support for project type $PROJECT_TYPE to configure.ac checks!]) - ;; -esac -AC_MSG_RESULT([$PROJECT_TYPE]) - -AC_SUBST(ASSEMBLY_EXTENSION) - -AC_MSG_CHECKING([whether we're compiling from an RCS]) -if test -f "$srcdir/.cvs_version" ; then - from_rcs=cvs -else - if test -f "$srcdir/.svn/entries" ; then - from_rcs=svn - else - from_rcs=no - fi -fi - -AC_MSG_RESULT($from_rcs) - -MONO_REQUIRED_VERSION=1.1 - -PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false) - -if test "x$has_mono" = "xtrue"; then - AC_PATH_PROG(RUNTIME, mono, no) - AC_PATH_PROG(CSC, gmcs, no) - AC_PATH_PROG(RESGEN, resgen2, no) - if test `uname -s` = "Darwin"; then - LIB_PREFIX= - LIB_SUFFIX=.dylib - else - LIB_PREFIX=.so - LIB_SUFFIX= - fi -else - AC_PATH_PROG(CSC, csc.exe, no) - if test x$CSC = "xno"; then - AC_MSG_ERROR([You need to install either mono or .Net]) - else - RUNTIME= - LIB_PREFIX= - LIB_SUFFIX= - fi -fi - -AC_PATH_PROG(GACUTIL, gacutil) -if test "x$GACUTIL" = "xno" ; then - AC_MSG_ERROR([No gacutil tool found]) -fi - -GACUTIL_FLAGS='/package /gacdir $(DESTDIR)$(prefix)/lib' -AC_SUBST(GACUTIL_FLAGS) - -AC_SUBST(PATH) -AC_SUBST(LD_LIBRARY_PATH) - -AC_SUBST(LIB_PREFIX) -AC_SUBST(LIB_SUFFIX) -AC_SUBST(RUNTIME) -AC_SUBST(CSC) -AC_SUBST(RESGEN) -AC_SUBST(GACUTIL) - -AC_SUBST(BASE_DEPENDENCIES_CFLAGS) -AC_SUBST(BASE_DEPENDENCIES_LIBS) - -dnl Find monodoc -MONODOC_REQUIRED_VERSION=1.0 -AC_SUBST(MONODOC_REQUIRED_VERSION) - -PKG_CHECK_MODULES(MONODOC_DEPENDENCY, monodoc >= $MONODOC_REQUIRED_VERSION, enable_monodoc=yes, enable_monodoc=no) - -if test "x$enable_monodoc" = "xyes"; then - AC_PATH_PROG(MONODOC, monodoc, no) - if test x$MONODOC = xno; then - enable_monodoc=no - fi -else - MONODOC= -fi - -AC_SUBST(MONODOC) -AM_CONDITIONAL(ENABLE_MONODOC, test "x$enable_monodoc" = "xyes") - -winbuild=no -case "$host" in - *-*-mingw*|*-*-cygwin*) - winbuild=yes - ;; -esac -AM_CONDITIONAL(WINBUILD, test x$winbuild = xyes) - -AC_CONFIG_FILES() -AC_CONFIG_FILES(.pc) - -AC_CONFIG_FILES(Makefile) -AC_OUTPUT - -echo "===" -echo "" -echo "Project configuration summary" -echo "" -echo " * Installation prefix: $prefix" -echo " * compiler: $CSC" -echo " * Documentation: $enable_monodoc ($MONODOC)" -echo " * Project Name: $PROJECT_NAME" -echo " * Version: $PROJECT_VERSION" -echo "" -echo "===" - - - - - - - - - - - - - - - - - - - - - - - - - - -ASSEMBLY=$(ASSEMBLY_NAME).$(ASSEMBLY_EXTENSION) - - -dir = $(prefix)/lib/ -_DATA = $(ASSEMBLY) $(ASSEMBLY).config - -bin_SCRIPTS= - -pkgconfigdir = $(prefix)/lib/pkgconfig -pkgconfig_DATA = .pc - -dir = $(prefix)/lib/mono/ -_DATA = $(ASSEMBLY).config - -noinst_DATA = $(ASSEMBLY) - - -PACKAGES = -BINARY_LIBS = -SYSTEM_LIBS = -RESOURCES_SRC = -RESOURCES = $(RESOURCES_SRC:.resx=.resources) -SOURCES = - -EXTRA_DIST=$(SOURCES) $(BINARY_LIBS) $(RESOURCES_SRC) install-sh missing - -CLEANFILES=$(ASSEMBLY) - - - - - - - -/$(ASSEMBLY): $(srcdir)/$(ASSEMBLY).response $(RESOURCES) $(SOURCES) $(BINARY_LIBS) - mkdir -p doc && mkdir -p && $(CSC) /out:$@ \ - /target: \ - $(addprefix /resource:$(srcdir)/, $(RESOURCES)) \ - $(addprefix /pkg:, $(PACKAGES)) \ - $(addprefix /r:, $(SYSTEM_LIBS)) \ - $(addprefix /r:$(srcdir)/, $(BINARY_LIBS)) \ - @$(srcdir)/$(ASSEMBLY).response \ - /doc:doc/ \ - /keyfile:$(srcdir)/ \ - /unsafe \ - && rm -f $(ASSEMBLY) \ - && ln $@ $(ASSEMBLY) - -CLEANFILES+=/$(ASSEMBLY) - - -EXTRA_DIST+= - -: /$(ASSEMBLY) - rm -f $(ASSEMBLY) \ - && ln /$(ASSEMBLY) $(ASSEMBLY) - - - - - -_install-data-local: /$(ASSEMBLY) - echo "$(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS)"; \ - $(GACUTIL) /i $(ASSEMBLY) /f $(GACUTIL_FLAGS) || exit 1; - -_uninstall-local: - if [`gacutil -l | grep "Number" | awk -F= '{print $$2}'` -gt "0" ] ; \ - then \ - echo "$(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ - $(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ - fi - - - -noinst__dir = $(prefix)/lib/mono/ -noinst___DATA = /$(ASSEMBLY) - - - - - - -$(ASSEMBLY): - - -$(srcdir)/$(ASSEMBLY).response: $(srcdir)/Makefile - echo "$(addprefix $(srcdir)/, $(SOURCES))" > $@ - - -all: $(ASSEMBLY) - -# rule to compile .resx files to .resources -%.resources: %.resx - $(RESGEN) /useSourcePath /compile $(@:.resources=.resx) - - - - - -install-data-local: _install-data-local - -uninstall-local: _uninstall-local - - - -#dir+=$(noinst__dir) -#_DATA+=$(noinst___DATA) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -prefix=@prefix@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib/mono/@PROJECT_NAME@ - -Name: -Description: -Version: @PROJECT_VERSION@ -Requires: -Libs: -r:${libdir}/@PROJECT_NAME@.dll - - - - - - - - - - - #!/bin/sh -# Run this to generate all the initial makefiles, etc. -# Ripped off from Mono, which ripped off from GNOME macros version - -DIE=0 - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -if [ -n "$MONO_PATH" ]; then - # from -> /mono/lib:/another/mono/lib - # to -> /mono /another/mono - for i in `echo ${MONO_PATH} | tr ":" " "`; do - i=`dirname ${i}` - if [ -n "{i}" -a -d "${i}/share/aclocal" ]; then - ACLOCAL_FLAGS="-I ${i}/share/aclocal $ACLOCAL_FLAGS" - fi - if [ -n "{i}" -a -d "${i}/bin" ]; then - PATH="${i}/bin:$PATH" - fi - done - export PATH -fi - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to compile Mono." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if [ -z "$LIBTOOL" ]; then - LIBTOOL=`which glibtool 2>/dev/null` - if [ ! -x "$LIBTOOL" ]; then - LIBTOOL=`which libtool` - fi -fi - -(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { - ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`libtool' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { - grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \ - (gettext --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`gettext' installed to compile Mono." - echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed to compile Mono." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - - -if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then - if test -z "$NO_LIBTOOLIZE" ; then - echo "Running libtoolize..." - ${LIBTOOL}ize --force --copy - fi -fi - -echo "Running aclocal $ACLOCAL_FLAGS ..." -aclocal $ACLOCAL_FLAGS || { - echo - echo "**Error**: aclocal failed. This may mean that you have not" - echo "installed all of the packages you need, or you may need to" - echo "set ACLOCAL_FLAGS to include \"-I \$prefix/share/aclocal\"" - echo "for the prefix where you installed the packages whose" - echo "macros were not found" - exit 1 -} - -if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader || { echo "**Error**: autoheader failed."; exit 1; } -fi - -echo "Running automake --gnu $am_opt ..." -automake --add-missing --gnu $am_opt || - { echo "**Error**: automake failed."; exit 1; } -echo "Running autoconf ..." -autoconf || { echo "**Error**: autoconf failed."; exit 1; } - - -echo Running /autogen.sh ... -(cd $srcdir/ ; NOCONFIGURE=1 /bin/sh ./autogen.sh "$@") -echo Done running /autogen.sh ... - - -conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME || exit 1 -else - echo Skipping configure process. -fi - - - - - - - - - - -AC_INIT([]-solution,[]) -AC_CONFIG_AUX_DIR(.) -AM_INIT_AUTOMAKE([1.9 tar-ustar foreign]) -EXTRA_DIST="install-sh missing" -SOLUTION_NAME= -SOLUTION_VERSION=$VERSION -SOLUTION_DESCRIPTION="" -AC_SUBST(DESCRIPTION) - -AM_MAINTAINER_MODE - -dnl AC_PROG_INTLTOOL([0.25]) - -AC_PROG_INSTALL - -AC_MSG_CHECKING([whether we're building from an RCS]) -if test -f "$srcdir/.cvs_version" ; then - from_rcs=cvs -else - if test -f "$srcdir/.svn/entries" ; then - from_rcs=svn - else - from_rcs=no - fi -fi - -AC_MSG_RESULT($from_rcs) - -CONFIG="Release" -AC_SUBST(CONFIG) - -AC_CONFIG_SUBDIRS( -) - - -AC_OUTPUT([ -Makefile -]) - -echo "===" -echo "" -echo "Solution configuration summary" -echo "" -echo " * Solution Name: $SOLUTION_NAME" -echo " * Version: $SOLUTION_VERSION" -echo " * Packages:" -echo " - " -echo "" -echo "===" - - - - - - - - - SUBDIRS = - - - - - - - - - - - - -#! /bin/sh - -PACKAGE= -prefix=@prefix@ -exec_prefix=@exec_prefix@ - -# %%$@%$# why oh why isn't it $sharedir/ -# Day changed to 30 Mar 2007 -# ... -# 07:50 < cj> why are we installing .exe assemblies to $prefix/lib/$package/ and -# not $prefix/share/$package ? -# 07:50 < jonp> momentum. -# 07:50 < jonp> and it's hard to say that a .exe isn't platform specific -# 07:50 < jonp> as it can still contain DllImport's which make platform -# assumptions - -packagedir=$prefix/lib/ -export MONO_PATH=$MONO_PATH - -exec @RUNTIME@ $packagedir/$PACKAGE.exe "$@" - - - - - diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base deleted file mode 100644 index b9e0e4eaf5..0000000000 --- a/Prebuild/src/data/.svn/text-base/dnpb-1.0.xsd.svn-base +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base deleted file mode 100644 index 2c065a3297..0000000000 --- a/Prebuild/src/data/.svn/text-base/dnpb-1.1.xsd.svn-base +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base deleted file mode 100644 index d694ab43d7..0000000000 --- a/Prebuild/src/data/.svn/text-base/dnpb-1.2.xsd.svn-base +++ /dev/null @@ -1,198 +0,0 @@ - - - - - Copyright (c) 2004 Matthew Holmes (calefaction _at_ houston _._ rr _._ com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base deleted file mode 100644 index 8f31a544ab..0000000000 --- a/Prebuild/src/data/.svn/text-base/dnpb-1.3.xsd.svn-base +++ /dev/null @@ -1,206 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Pre-Build is an XML-driven pre-build tool allowing developers to - easily generate project or make files for major IDE's and .NET - development tools including: Visual Studio 2003, Visual Studio 2002, - SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base deleted file mode 100644 index 1da50fcc7a..0000000000 --- a/Prebuild/src/data/.svn/text-base/dnpb-1.4.xsd.svn-base +++ /dev/null @@ -1,212 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base b/Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base deleted file mode 100644 index e2b21f0c69..0000000000 --- a/Prebuild/src/data/.svn/text-base/dnpb-1.5.xsd.svn-base +++ /dev/null @@ -1,215 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base deleted file mode 100644 index 57ebd2eb9d..0000000000 --- a/Prebuild/src/data/.svn/text-base/prebuild-1.6.xsd.svn-base +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base deleted file mode 100644 index 3675503bab..0000000000 --- a/Prebuild/src/data/.svn/text-base/prebuild-1.7.xsd.svn-base +++ /dev/null @@ -1,350 +0,0 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base deleted file mode 100644 index 8f5c1a4566..0000000000 --- a/Prebuild/src/data/.svn/text-base/prebuild-1.8.xsd.svn-base +++ /dev/null @@ -1,331 +0,0 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base b/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base deleted file mode 100644 index fbca556f19..0000000000 --- a/Prebuild/src/data/.svn/text-base/prebuild-1.9.xsd.svn-base +++ /dev/null @@ -1,336 +0,0 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Prebuild/tests/.svn/all-wcprops b/Prebuild/tests/.svn/all-wcprops deleted file mode 100644 index 0668acba54..0000000000 --- a/Prebuild/tests/.svn/all-wcprops +++ /dev/null @@ -1,59 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 47 -/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests -END -include-001.expected -K 25 -svn:wc:ra_dav:version-url -V 68 -/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/include-001.expected -END -include-002.expected -K 25 -svn:wc:ra_dav:version-url -V 68 -/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002.expected -END -include-001.include -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/include-001.include -END -include-002-2.include -K 25 -svn:wc:ra_dav:version-url -V 69 -/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002-2.include -END -include-002.include -K 25 -svn:wc:ra_dav:version-url -V 67 -/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002.include -END -include-001.prebuild -K 25 -svn:wc:ra_dav:version-url -V 68 -/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/include-001.prebuild -END -include-002.prebuild -K 25 -svn:wc:ra_dav:version-url -V 68 -/svnroot/dnpb/!svn/ver/280/trunk/Prebuild/tests/include-002.prebuild -END -README.txt -K 25 -svn:wc:ra_dav:version-url -V 58 -/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/README.txt -END -Makefile -K 25 -svn:wc:ra_dav:version-url -V 56 -/svnroot/dnpb/!svn/ver/279/trunk/Prebuild/tests/Makefile -END diff --git a/Prebuild/tests/.svn/entries b/Prebuild/tests/.svn/entries deleted file mode 100644 index 2a70cf9a67..0000000000 --- a/Prebuild/tests/.svn/entries +++ /dev/null @@ -1,334 +0,0 @@ -10 - -dir -323 -https://dnpb.svn.sourceforge.net/svnroot/dnpb/trunk/Prebuild/tests -https://dnpb.svn.sourceforge.net/svnroot/dnpb - - - -2008-12-10T02:26:03.443834Z -280 -dmoonfire - - - - - - - - - - - - - - -3355ff64-970d-0410-bbe8-d0fbd18be4fb - -include-001.expected -file - - - - -2010-09-10T22:51:45.000000Z -d65010a81975867917d4468950ec7ccc -2008-12-10T02:04:22.474237Z -279 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -1784 - -include-002.expected -file - - - - -2010-09-10T22:51:45.000000Z -dcef68172b57f9e1b2228f1dba535934 -2008-12-10T02:26:03.443834Z -280 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -1150 - -include-001.include -file - - - - -2010-09-10T22:51:45.000000Z -92601282deffe7c461f80b407525446d -2008-12-10T02:04:22.474237Z -279 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -983 - -include-002-2.include -file - - - - -2010-09-10T22:51:45.000000Z -d9f24dc85d95d7310516187910433c8c -2008-12-10T02:26:03.443834Z -280 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -307 - -include-002.include -file - - - - -2010-09-10T22:51:45.000000Z -44815ffa6c2dc32d4df9977b5fe49ca4 -2008-12-10T02:26:03.443834Z -280 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -332 - -include-001.prebuild -file - - - - -2010-09-10T22:51:45.000000Z -d01a5391189ada3dcd7d3becf254f151 -2008-12-10T02:04:22.474237Z -279 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -742 - -include-002.prebuild -file - - - - -2010-09-10T22:51:45.000000Z -22ad11b07dd489b41ec998e03c83a397 -2008-12-10T02:26:03.443834Z -280 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -289 - -README.txt -file - - - - -2010-09-10T22:51:45.000000Z -6b111c08a76e929cb94b77c99774ef78 -2008-12-10T02:04:22.474237Z -279 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -326 - -Makefile -file - - - - -2010-09-10T22:51:45.000000Z -eed6712c3f5e4478d92137f6657aba56 -2008-12-10T02:04:22.474237Z -279 -dmoonfire - - - - - - - - - - - - - - - - - - - - - -456 - diff --git a/Prebuild/tests/.svn/text-base/Makefile.svn-base b/Prebuild/tests/.svn/text-base/Makefile.svn-base deleted file mode 100644 index 4a8ddf459d..0000000000 --- a/Prebuild/tests/.svn/text-base/Makefile.svn-base +++ /dev/null @@ -1,24 +0,0 @@ -# -# Executable -# - -# Executables -PREBUILD = mono ../src/bin/Release/prebuild.exe /target makefile - -# Files -PREBUILDS = $(wildcard *.prebuild) -RESULTS = $(PREBUILDS:prebuild=results) -TESTS = $(PREBUILDS:prebuild=test) - -all: $(TESTS) - -clean: - rm -f *~ *.log - rm -f $(RESULTS) - -%.test: %.prebuild - $(PREBUILD) /log $*.log /file $*.prebuild /ppi $*.results >& /dev/null - if ! cmp $*.expected $*.results; then \ - echo $*.prebuild failed; \ - false; \ - fi diff --git a/Prebuild/tests/.svn/text-base/README.txt.svn-base b/Prebuild/tests/.svn/text-base/README.txt.svn-base deleted file mode 100644 index 2c2de3bc50..0000000000 --- a/Prebuild/tests/.svn/text-base/README.txt.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -There are some tests that are run via a Makfile in this -directory. They haven't been included in any form of unit tests, but -they are there to help test the functionality in some what. Simply -build prebuild (so there is a src/bin/Release/prebuild.exe) and type -`make` in this directory. Everything should pass without errors. diff --git a/Prebuild/tests/.svn/text-base/include-001.expected.svn-base b/Prebuild/tests/.svn/text-base/include-001.expected.svn-base deleted file mode 100644 index 26374b5bc7..0000000000 --- a/Prebuild/tests/.svn/text-base/include-001.expected.svn-base +++ /dev/null @@ -1,46 +0,0 @@ - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - TRACE - bin/Release - true - false - - - - - - DEBUG;TRACE - false - bin/Debug - true - Prebuild.snk - 1595 - - - - - TRACE - bin/Release - true - false - Prebuild.snk - 1595 - - - - - - - - - diff --git a/Prebuild/tests/.svn/text-base/include-001.include.svn-base b/Prebuild/tests/.svn/text-base/include-001.include.svn-base deleted file mode 100644 index 7f75962a7a..0000000000 --- a/Prebuild/tests/.svn/text-base/include-001.include.svn-base +++ /dev/null @@ -1,33 +0,0 @@ - - - - DEBUG;TRACE - false - bin/Debug - true - Prebuild.snk - 1595 - - - - - TRACE - bin/Release - true - false - Prebuild.snk - 1595 - - - - - - - diff --git a/Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base b/Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base deleted file mode 100644 index 8047008951..0000000000 --- a/Prebuild/tests/.svn/text-base/include-001.prebuild.svn-base +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - TRACE - bin/Release - true - false - - - - - diff --git a/Prebuild/tests/.svn/text-base/include-002-2.include.svn-base b/Prebuild/tests/.svn/text-base/include-002-2.include.svn-base deleted file mode 100644 index 661b7f3b06..0000000000 --- a/Prebuild/tests/.svn/text-base/include-002-2.include.svn-base +++ /dev/null @@ -1,8 +0,0 @@ - - - DEBUG;TRACE - false - bin/Debug - true - - diff --git a/Prebuild/tests/.svn/text-base/include-002.expected.svn-base b/Prebuild/tests/.svn/text-base/include-002.expected.svn-base deleted file mode 100644 index 9849658b1e..0000000000 --- a/Prebuild/tests/.svn/text-base/include-002.expected.svn-base +++ /dev/null @@ -1,26 +0,0 @@ - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - - DEBUG;TRACE - false - bin/Debug - true - - - - - - - - - diff --git a/Prebuild/tests/.svn/text-base/include-002.include.svn-base b/Prebuild/tests/.svn/text-base/include-002.include.svn-base deleted file mode 100644 index 64f4058dc0..0000000000 --- a/Prebuild/tests/.svn/text-base/include-002.include.svn-base +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base b/Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base deleted file mode 100644 index 9e85f20f54..0000000000 --- a/Prebuild/tests/.svn/text-base/include-002.prebuild.svn-base +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - From 47ac9f97b11ae9de535550ba7e6c836ee81dab55 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sat, 11 Sep 2010 18:29:38 -0700 Subject: [PATCH 27/35] Re-enabled asset last access time logging in MySQL --- OpenSim/Data/MySQL/MySQLAssetData.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index fe5152ad85..ed92f3ebc2 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -214,9 +214,6 @@ namespace OpenSim.Data.MySQL private void UpdateAccessTime(AssetBase asset) { - // Writing to the database every time Get() is called on an asset is killing us. Seriously. -jph - return; - lock (m_dbLock) { using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) From 109b51758398d24a96a16900e8feb24361aee29d Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sat, 11 Sep 2010 20:43:06 -0700 Subject: [PATCH 28/35] Fixed the naming mess around data connectors for simulation data --- ...SQLLegacyRegionData.cs => MSSQLSimulationData.cs} | 2 +- ...SQLLegacyRegionData.cs => MySQLSimulationData.cs} | 2 +- .../Null/{NullDataStore.cs => NullSimulationData.cs} | 2 +- .../{SQLiteRegionData.cs => SQLiteSimulationData.cs} | 2 +- .../{SQLiteRegionData.cs => SQLiteSimulationData.cs} | 2 +- OpenSim/Data/Tests/RegionTests.cs | 12 ++++++------ .../Region/Framework/Interfaces/IEntityInventory.cs | 2 +- .../{IRegionDataStore.cs => ISimulationDataStore.cs} | 2 +- OpenSim/Region/Framework/Scenes/EventManager.cs | 4 ++-- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +- .../Framework/Scenes/SceneObjectPartInventory.cs | 2 +- OpenSim/Region/Framework/StorageManager.cs | 10 +++++----- OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) rename OpenSim/Data/MSSQL/{MSSQLLegacyRegionData.cs => MSSQLSimulationData.cs} (99%) rename OpenSim/Data/MySQL/{MySQLLegacyRegionData.cs => MySQLSimulationData.cs} (99%) rename OpenSim/Data/Null/{NullDataStore.cs => NullSimulationData.cs} (98%) rename OpenSim/Data/SQLite/{SQLiteRegionData.cs => SQLiteSimulationData.cs} (99%) rename OpenSim/Data/SQLiteLegacy/{SQLiteRegionData.cs => SQLiteSimulationData.cs} (99%) rename OpenSim/Region/Framework/Interfaces/{IRegionDataStore.cs => ISimulationDataStore.cs} (99%) diff --git a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs similarity index 99% rename from OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs rename to OpenSim/Data/MSSQL/MSSQLSimulationData.cs index 77b8a10f07..ae105d594a 100644 --- a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs @@ -43,7 +43,7 @@ namespace OpenSim.Data.MSSQL /// /// A MSSQL Interface for the Region Server. /// - public class MSSQLRegionDataStore : IRegionDataStore + public class MSSQLSimulationData : ISimulationDataStore { private const string _migrationStore = "RegionStore"; diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs similarity index 99% rename from OpenSim/Data/MySQL/MySQLLegacyRegionData.cs rename to OpenSim/Data/MySQL/MySQLSimulationData.cs index a39e68d3ad..36f73ef49d 100644 --- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -45,7 +45,7 @@ namespace OpenSim.Data.MySQL /// /// A MySQL Interface for the Region Server /// - public class MySQLDataStore : IRegionDataStore + public class MySQLSimulationData : ISimulationDataStore { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Data/Null/NullDataStore.cs b/OpenSim/Data/Null/NullSimulationData.cs similarity index 98% rename from OpenSim/Data/Null/NullDataStore.cs rename to OpenSim/Data/Null/NullSimulationData.cs index 3ba44bb54b..9c7da8e973 100644 --- a/OpenSim/Data/Null/NullDataStore.cs +++ b/OpenSim/Data/Null/NullSimulationData.cs @@ -36,7 +36,7 @@ namespace OpenSim.Data.Null /// /// NULL DataStore, do not store anything /// - public class NullDataStore : IRegionDataStore + public class NullSimulationData : ISimulationDataStore { public void Initialise(string dbfile) { diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs similarity index 99% rename from OpenSim/Data/SQLite/SQLiteRegionData.cs rename to OpenSim/Data/SQLite/SQLiteSimulationData.cs index 88699a767f..55c27b260a 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -44,7 +44,7 @@ namespace OpenSim.Data.SQLite /// /// A RegionData Interface to the SQLite database /// - public class SQLiteRegionData : IRegionDataStore + public class SQLiteSimulationData : ISimulationDataStore { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs similarity index 99% rename from OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs rename to OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs index b5ce4c0080..878117e2fc 100644 --- a/OpenSim/Data/SQLiteLegacy/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs @@ -43,7 +43,7 @@ namespace OpenSim.Data.SQLiteLegacy /// /// A RegionData Interface to the SQLite database /// - public class SQLiteRegionData : IRegionDataStore + public class SQLiteSimulationData : ISimulationDataStore { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Data/Tests/RegionTests.cs b/OpenSim/Data/Tests/RegionTests.cs index 29bf5a3418..a081462b73 100644 --- a/OpenSim/Data/Tests/RegionTests.cs +++ b/OpenSim/Data/Tests/RegionTests.cs @@ -61,17 +61,17 @@ namespace OpenSim.Data.Tests #else [TestFixture(Description = "Region store tests (SQLite)")] - public class SQLiteRegionTests : RegionTests + public class SQLiteRegionTests : RegionTests { } [TestFixture(Description = "Region store tests (MySQL)")] - public class MySqlRegionTests : RegionTests + public class MySqlRegionTests : RegionTests { } [TestFixture(Description = "Region store tests (MS SQL Server)")] - public class MSSQLRegionTests : RegionTests + public class MSSQLRegionTests : RegionTests { } @@ -79,11 +79,11 @@ namespace OpenSim.Data.Tests public class RegionTests : BasicDataServiceTest where TConn : DbConnection, new() - where TRegStore : class, IRegionDataStore, new() + where TRegStore : class, ISimulationDataStore, new() { bool m_rebuildDB; - public IRegionDataStore db; + public ISimulationDataStore db; public UUID zero = UUID.Zero; public UUID region1 = UUID.Random(); public UUID region2 = UUID.Random(); @@ -122,7 +122,7 @@ namespace OpenSim.Data.Tests protected override void InitService(object service) { ClearDB(); - db = (IRegionDataStore)service; + db = (ISimulationDataStore)service; db.Initialise(m_connStr); } diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index ae2e8443fc..54845fd96d 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -200,7 +200,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Backup the inventory to the given data store /// /// - void ProcessInventoryBackup(IRegionDataStore datastore); + void ProcessInventoryBackup(ISimulationDataStore datastore); uint MaskEffectivePermissions(); diff --git a/OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs similarity index 99% rename from OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs rename to OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs index 3e8e19670c..0a4d531b91 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs +++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs @@ -32,7 +32,7 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.Framework.Interfaces { - public interface IRegionDataStore + public interface ISimulationDataStore { /// /// Initialises the data storage engine diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index c434e4fa1e..6b2e03ec75 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -57,7 +57,7 @@ namespace OpenSim.Region.Framework.Scenes public event OnTerrainTickDelegate OnTerrainTick; - public delegate void OnBackupDelegate(IRegionDataStore datastore, bool forceBackup); + public delegate void OnBackupDelegate(ISimulationDataStore datastore, bool forceBackup); public event OnBackupDelegate OnBackup; @@ -684,7 +684,7 @@ namespace OpenSim.Region.Framework.Scenes } } - public void TriggerOnBackup(IRegionDataStore dstore, bool forced) + public void TriggerOnBackup(ISimulationDataStore dstore, bool forced) { OnBackupDelegate handlerOnAttach = OnBackup; if (handlerOnAttach != null) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index ba5e33cd37..4024328afb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1378,7 +1378,7 @@ namespace OpenSim.Region.Framework.Scenes /// Processes backup. /// /// - public virtual void ProcessBackup(IRegionDataStore datastore, bool forcedBackup) + public virtual void ProcessBackup(ISimulationDataStore datastore, bool forcedBackup) { if (!m_isBackedUp) { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 87c48608aa..1984d45f06 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -848,7 +848,7 @@ namespace OpenSim.Region.Framework.Scenes /// Process inventory backup /// /// - public void ProcessInventoryBackup(IRegionDataStore datastore) + public void ProcessInventoryBackup(ISimulationDataStore datastore) { if (HasInventoryChanged) { diff --git a/OpenSim/Region/Framework/StorageManager.cs b/OpenSim/Region/Framework/StorageManager.cs index 9375b4add2..06caa18243 100644 --- a/OpenSim/Region/Framework/StorageManager.cs +++ b/OpenSim/Region/Framework/StorageManager.cs @@ -36,9 +36,9 @@ namespace OpenSim.Region.Framework { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected IRegionDataStore m_dataStore; + protected ISimulationDataStore m_dataStore; - public IRegionDataStore DataStore + public ISimulationDataStore DataStore { get { return m_dataStore; } } @@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework get { return m_estateDataStore; } } - public StorageManager(IRegionDataStore storage) + public StorageManager(ISimulationDataStore storage) { m_dataStore = storage; } @@ -68,8 +68,8 @@ namespace OpenSim.Region.Framework if (typeInterface != null) { - IRegionDataStore plug = - (IRegionDataStore) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + ISimulationDataStore plug = + (ISimulationDataStore)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); plug.Initialise(connectionstring); m_dataStore = plug; diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs index 2a055cc3c1..e95d26a6d0 100644 --- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs @@ -39,7 +39,7 @@ namespace OpenSim.Data.Null /// Mock region data plugin. This obeys the api contract for persistence but stores everything in memory, so that /// tests can check correct persistence. /// - public class NullDataStore : IRegionDataStore + public class NullDataStore : ISimulationDataStore { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); From e2544584ad57a30def4f6b13eeaafe90eb81fe9e Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sat, 11 Sep 2010 22:02:34 -0700 Subject: [PATCH 29/35] Changed all string references of "IRegionDataStore" to "ISimulationDataStore" --- OpenSim/Data/Null/NullSimulationData.cs | 1 - OpenSim/Data/SQLite/SQLiteSimulationData.cs | 2 -- OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs | 2 -- OpenSim/Region/Framework/StorageManager.cs | 4 ++-- OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs | 1 - 5 files changed, 2 insertions(+), 8 deletions(-) diff --git a/OpenSim/Data/Null/NullSimulationData.cs b/OpenSim/Data/Null/NullSimulationData.cs index 9c7da8e973..34d3a4e38a 100644 --- a/OpenSim/Data/Null/NullSimulationData.cs +++ b/OpenSim/Data/Null/NullSimulationData.cs @@ -73,7 +73,6 @@ namespace OpenSim.Data.Null { } - // see IRegionDatastore public void StorePrimInventory(UUID primID, ICollection items) { } diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 55c27b260a..1820f78fac 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -79,7 +79,6 @@ namespace OpenSim.Data.SQLite **********************************************************************/ /// - /// See IRegionDataStore /// /// Initialises RegionData Interface /// Loads and initialises a new SQLite connection and maintains it. @@ -1951,7 +1950,6 @@ namespace OpenSim.Data.SQLite } /// - /// see IRegionDatastore /// /// /// diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs index 878117e2fc..e9c6aa5e34 100644 --- a/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs @@ -78,7 +78,6 @@ namespace OpenSim.Data.SQLiteLegacy **********************************************************************/ /// - /// See IRegionDataStore /// /// Initialises RegionData Interface /// Loads and initialises a new SQLite connection and maintains it. @@ -1888,7 +1887,6 @@ namespace OpenSim.Data.SQLiteLegacy } /// - /// see IRegionDatastore /// /// /// diff --git a/OpenSim/Region/Framework/StorageManager.cs b/OpenSim/Region/Framework/StorageManager.cs index 06caa18243..47db2b3a47 100644 --- a/OpenSim/Region/Framework/StorageManager.cs +++ b/OpenSim/Region/Framework/StorageManager.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.Framework { if (pluginType.IsPublic) { - Type typeInterface = pluginType.GetInterface("IRegionDataStore", true); + Type typeInterface = pluginType.GetInterface("ISimulationDataStore", true); if (typeInterface != null) { @@ -74,7 +74,7 @@ namespace OpenSim.Region.Framework m_dataStore = plug; - m_log.Info("[DATASTORE]: Added IRegionDataStore Interface"); + m_log.Info("[DATASTORE]: Added ISimulationDataStore Interface"); } typeInterface = pluginType.GetInterface("IEstateDataStore", true); diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs index e95d26a6d0..315d4052e7 100644 --- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs @@ -114,7 +114,6 @@ namespace OpenSim.Data.Null } } - // see IRegionDatastore public void StorePrimInventory(UUID primID, ICollection items) { m_primItems[primID] = items; From 007912d6f4810192853c4aeee5f9834de748f2b2 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sat, 11 Sep 2010 23:41:48 -0700 Subject: [PATCH 30/35] Shuffling fields and properties around in Scene to make Scene.cs more readable --- OpenSim/Region/Framework/Scenes/Scene.cs | 262 +++++++++++------------ 1 file changed, 124 insertions(+), 138 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6fa78e0cfd..46b84bb442 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -57,55 +57,21 @@ namespace OpenSim.Region.Framework.Scenes public partial class Scene : SceneBase { - public delegate void SynchronizeSceneHandler(Scene scene); - public SynchronizeSceneHandler SynchronizeScene = null; - - /* Used by the loadbalancer plugin on GForge */ - protected int m_splitRegionID = 0; - public int SplitRegionID - { - get { return m_splitRegionID; } - set { m_splitRegionID = value; } - } - private const long DEFAULT_MIN_TIME_FOR_PERSISTENCE = 60L; private const long DEFAULT_MAX_TIME_FOR_PERSISTENCE = 600L; + public delegate void SynchronizeSceneHandler(Scene scene); + #region Fields - protected Timer m_restartWaitTimer = new Timer(); - + public SynchronizeSceneHandler SynchronizeScene; public SimStatsReporter StatsReporter; - - protected List m_regionRestartNotifyList = new List(); - protected List m_neighbours = new List(); - - private volatile int m_bordersLocked = 0; - public bool BordersLocked - { - get { return m_bordersLocked == 1; } - set - { - if (value == true) - m_bordersLocked = 1; - else - m_bordersLocked = 0; - } - } public List NorthBorders = new List(); public List EastBorders = new List(); public List SouthBorders = new List(); public List WestBorders = new List(); - /// - /// The scene graph for this scene - /// - /// TODO: Possibly stop other classes being able to manipulate this directly. - private SceneGraph m_sceneGraph; - - /// - /// Are we applying physics to any of the prims in this scene? - /// + /// Are we applying physics to any of the prims in this scene? public bool m_physicalPrim; public float m_maxNonphys = 256; public float m_maxPhys = 10; @@ -119,24 +85,127 @@ namespace OpenSim.Region.Framework.Scenes // root agents when ACL denies access to root agent public bool m_strictAccessControl = true; public int MaxUndoCount = 5; + public bool LoginsDisabled = true; + public bool LoadingPrims; + public IXfer XferManager; + + // the minimum time that must elapse before a changed object will be considered for persisted + public long m_dontPersistBefore = DEFAULT_MIN_TIME_FOR_PERSISTENCE * 10000000L; + // the maximum time that must elapse before a changed object will be considered for persisted + public long m_persistAfter = DEFAULT_MAX_TIME_FOR_PERSISTENCE * 10000000L; + + protected int m_splitRegionID; + protected Timer m_restartWaitTimer = new Timer(); + protected List m_regionRestartNotifyList = new List(); + protected List m_neighbours = new List(); + protected string m_simulatorVersion = "OpenSimulator Server"; + protected ModuleLoader m_moduleLoader; + protected StorageManager m_storageManager; + protected AgentCircuitManager m_authenticateHandler; + protected SceneCommunicationService m_sceneGridService; + + protected IAssetService m_AssetService; + protected IAuthorizationService m_AuthorizationService; + protected IInventoryService m_InventoryService; + protected IGridService m_GridService; + protected ILibraryService m_LibraryService; + protected ISimulationService m_simulationService; + protected IAuthenticationService m_AuthenticationService; + protected IPresenceService m_PresenceService; + protected IUserAccountService m_UserAccountService; + protected IAvatarService m_AvatarService; + protected IGridUserService m_GridUserService; + + protected IXMLRPC m_xmlrpcModule; + protected IWorldComm m_worldCommModule; + protected IAvatarFactory m_AvatarFactory; + protected IConfigSource m_config; + protected IRegionSerialiserModule m_serialiser; + protected IDialogModule m_dialogModule; + protected IEntityTransferModule m_teleportModule; + protected ICapabilitiesModule m_capsModule; + // Central Update Loop + protected int m_fps = 10; + protected uint m_frame; + protected float m_timespan = 0.089f; + protected DateTime m_lastupdate = DateTime.UtcNow; + + // TODO: Possibly stop other classes being able to manipulate this directly. + private SceneGraph m_sceneGraph; + private volatile int m_bordersLocked; private int m_RestartTimerCounter; private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing private int m_incrementsof15seconds; private volatile bool m_backingup; - private Dictionary m_returns = new Dictionary(); private Dictionary m_groupsWithTargets = new Dictionary(); + private Object m_heartbeatLock = new Object(); - protected string m_simulatorVersion = "OpenSimulator Server"; + private int m_update_physics = 1; + private int m_update_entitymovement = 1; + private int m_update_objects = 1; // Update objects which have scheduled themselves for updates + private int m_update_presences = 1; // Update scene presence movements + private int m_update_events = 1; + private int m_update_backup = 200; + private int m_update_terrain = 50; + private int m_update_land = 1; + private int m_update_coarse_locations = 50; - protected ModuleLoader m_moduleLoader; - protected StorageManager m_storageManager; - protected AgentCircuitManager m_authenticateHandler; + private int frameMS; + private int physicsMS2; + private int physicsMS; + private int otherMS; + private int tempOnRezMS; + private int eventMS; + private int backupMS; + private int terrainMS; + private int landMS; + private int lastCompletedFrame; - protected SceneCommunicationService m_sceneGridService; - public bool LoginsDisabled = true; - public bool LoadingPrims = false; + private bool m_physics_enabled = true; + private bool m_scripts_enabled = true; + private string m_defaultScriptEngine; + private int m_LastLogin; + private Thread HeartbeatThread; + private volatile bool shuttingdown; + private int m_lastUpdate; + private bool m_firstHeartbeat = true; + + private object m_deleting_scene_object = new object(); + + private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; + private bool m_reprioritizationEnabled = true; + private double m_reprioritizationInterval = 5000.0; + private double m_rootReprioritizationDistance = 10.0; + private double m_childReprioritizationDistance = 20.0; + + private Timer m_mapGenerationTimer = new Timer(); + private bool m_generateMaptiles; + + #endregion Fields + + #region Properties + + /* Used by the loadbalancer plugin on GForge */ + public int SplitRegionID + { + get { return m_splitRegionID; } + set { m_splitRegionID = value; } + } + + public bool BordersLocked + { + get { return m_bordersLocked == 1; } + set + { + if (value == true) + m_bordersLocked = 1; + else + m_bordersLocked = 0; + } + } + public new float TimeDilation { get { return m_sceneGraph.PhysicsScene.TimeDilation; } @@ -147,13 +216,6 @@ namespace OpenSim.Region.Framework.Scenes get { return m_sceneGridService; } } - public IXfer XferManager; - - protected IAssetService m_AssetService; - protected IAuthorizationService m_AuthorizationService; - - private Object m_heartbeatLock = new Object(); - public IAssetService AssetService { get @@ -191,8 +253,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected IInventoryService m_InventoryService; - public IInventoryService InventoryService { get @@ -211,8 +271,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected IGridService m_GridService; - public IGridService GridService { get @@ -231,8 +289,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected ILibraryService m_LibraryService; - public ILibraryService LibraryService { get @@ -244,7 +300,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected ISimulationService m_simulationService; public ISimulationService SimulationService { get @@ -255,7 +310,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected IAuthenticationService m_AuthenticationService; public IAuthenticationService AuthenticationService { get @@ -266,7 +320,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected IPresenceService m_PresenceService; public IPresenceService PresenceService { get @@ -276,7 +329,7 @@ namespace OpenSim.Region.Framework.Scenes return m_PresenceService; } } - protected IUserAccountService m_UserAccountService; + public IUserAccountService UserAccountService { get @@ -287,8 +340,7 @@ namespace OpenSim.Region.Framework.Scenes } } - protected OpenSim.Services.Interfaces.IAvatarService m_AvatarService; - public OpenSim.Services.Interfaces.IAvatarService AvatarService + public IAvatarService AvatarService { get { @@ -298,7 +350,6 @@ namespace OpenSim.Region.Framework.Scenes } } - protected IGridUserService m_GridUserService; public IGridUserService GridUserService { get @@ -309,58 +360,18 @@ namespace OpenSim.Region.Framework.Scenes } } - protected IXMLRPC m_xmlrpcModule; - protected IWorldComm m_worldCommModule; public IAttachmentsModule AttachmentsModule { get; set; } - protected IAvatarFactory m_AvatarFactory; + public IAvatarFactory AvatarFactory { get { return m_AvatarFactory; } } - protected IConfigSource m_config; - protected IRegionSerialiserModule m_serialiser; - protected IDialogModule m_dialogModule; - protected IEntityTransferModule m_teleportModule; - protected ICapabilitiesModule m_capsModule; public ICapabilitiesModule CapsModule { get { return m_capsModule; } } - protected override IConfigSource GetConfig() - { - return m_config; - } - - // Central Update Loop - - protected int m_fps = 10; - protected uint m_frame; - protected float m_timespan = 0.089f; - protected DateTime m_lastupdate = DateTime.UtcNow; - - private int m_update_physics = 1; - private int m_update_entitymovement = 1; - private int m_update_objects = 1; // Update objects which have scheduled themselves for updates - private int m_update_presences = 1; // Update scene presence movements - private int m_update_events = 1; - private int m_update_backup = 200; - private int m_update_terrain = 50; - private int m_update_land = 1; - private int m_update_coarse_locations = 50; - - private int frameMS; - private int physicsMS2; - private int physicsMS; - private int otherMS; - private int tempOnRezMS; - private int eventMS; - private int backupMS; - private int terrainMS; - private int landMS; - private int lastCompletedFrame; - public int MonitorFrameTime { get { return frameMS; } } public int MonitorPhysicsUpdateTime { get { return physicsMS; } } public int MonitorPhysicsSyncTime { get { return physicsMS2; } } @@ -372,36 +383,6 @@ namespace OpenSim.Region.Framework.Scenes public int MonitorLandTime { get { return landMS; } } public int MonitorLastFrameTick { get { return lastCompletedFrame; } } - private bool m_physics_enabled = true; - private bool m_scripts_enabled = true; - private string m_defaultScriptEngine; - private int m_LastLogin; - private Thread HeartbeatThread; - private volatile bool shuttingdown; - - private int m_lastUpdate; - private bool m_firstHeartbeat = true; - - private object m_deleting_scene_object = new object(); - - // the minimum time that must elapse before a changed object will be considered for persisted - public long m_dontPersistBefore = DEFAULT_MIN_TIME_FOR_PERSISTENCE * 10000000L; - // the maximum time that must elapse before a changed object will be considered for persisted - public long m_persistAfter = DEFAULT_MAX_TIME_FOR_PERSISTENCE * 10000000L; - - private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; - private bool m_reprioritizationEnabled = true; - private double m_reprioritizationInterval = 5000.0; - private double m_rootReprioritizationDistance = 10.0; - private double m_childReprioritizationDistance = 20.0; - - private Timer m_mapGenerationTimer = new Timer(); - bool m_generateMaptiles = false; - - #endregion - - #region Properties - public UpdatePrioritizationSchemes UpdatePrioritizationScheme { get { return m_priorityScheme; } } public bool IsReprioritizationEnabled { get { return m_reprioritizationEnabled; } } public double ReprioritizationInterval { get { return m_reprioritizationInterval; } } @@ -481,7 +462,7 @@ namespace OpenSim.Region.Framework.Scenes set { m_sceneGraph.RestorePresences = value; } } - #endregion + #endregion Properties #region Constructors @@ -3954,6 +3935,11 @@ namespace OpenSim.Region.Framework.Scenes #region Other Methods + protected override IConfigSource GetConfig() + { + return m_config; + } + #endregion public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set) From 16d782eaa25e73e39b8aaa02383592ac4813a109 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sun, 12 Sep 2010 00:30:13 -0700 Subject: [PATCH 31/35] Added a stub for OpenSim.Services.Connectors.Simulation.SimulationDataServiceConnector --- .../Interfaces/ISimulationDataService.cs | 98 ++++++++++++++ OpenSim/Region/Framework/StorageManager.cs | 24 +--- .../SimulationDataServiceConnector.cs | 125 ++++++++++++++++++ 3 files changed, 227 insertions(+), 20 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs create mode 100644 OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs new file mode 100644 index 0000000000..edaa07c80f --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs @@ -0,0 +1,98 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface ISimulationDataService + { + /// + /// Stores all object's details apart from inventory + /// + /// + /// + void StoreObject(SceneObjectGroup obj, UUID regionUUID); + + /// + /// Entirely removes the object, including inventory + /// + /// + /// + /// + void RemoveObject(UUID uuid, UUID regionUUID); + + /// + /// Store a prim's inventory + /// + /// + void StorePrimInventory(UUID primID, ICollection items); + + /// + /// Load persisted objects from region storage. + /// + /// the Region UUID + /// List of loaded groups + List LoadObjects(UUID regionUUID); + + /// + /// Store a terrain revision in region storage + /// + /// HeightField data + /// region UUID + void StoreTerrain(double[,] terrain, UUID regionID); + + /// + /// Load the latest terrain revision from region storage + /// + /// the region UUID + /// Heightfield data + double[,] LoadTerrain(UUID regionID); + + void StoreLandObject(ILandObject Parcel); + + /// + /// + /// delete from land where UUID=globalID + /// delete from landaccesslist where LandUUID=globalID + /// + /// + /// + void RemoveLandObject(UUID globalID); + + List LoadLandObjects(UUID regionUUID); + + void StoreRegionSettings(RegionSettings rs); + RegionSettings LoadRegionSettings(UUID regionUUID); + RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID); + void StoreRegionWindlightSettings(RegionLightShareData wl); + } +} diff --git a/OpenSim/Region/Framework/StorageManager.cs b/OpenSim/Region/Framework/StorageManager.cs index 47db2b3a47..c858d56926 100644 --- a/OpenSim/Region/Framework/StorageManager.cs +++ b/OpenSim/Region/Framework/StorageManager.cs @@ -36,24 +36,8 @@ namespace OpenSim.Region.Framework { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected ISimulationDataStore m_dataStore; - - public ISimulationDataStore DataStore - { - get { return m_dataStore; } - } - - private IEstateDataStore m_estateDataStore; - - public IEstateDataStore EstateDataStore - { - get { return m_estateDataStore; } - } - - public StorageManager(ISimulationDataStore storage) - { - m_dataStore = storage; - } + public readonly ISimulationDataStore DataStore; + public readonly IEstateDataStore EstateDataStore; public StorageManager(string dllName, string connectionstring, string estateconnectionstring) { @@ -72,7 +56,7 @@ namespace OpenSim.Region.Framework (ISimulationDataStore)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); plug.Initialise(connectionstring); - m_dataStore = plug; + DataStore = plug; m_log.Info("[DATASTORE]: Added ISimulationDataStore Interface"); } @@ -85,7 +69,7 @@ namespace OpenSim.Region.Framework (IEstateDataStore) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); estPlug.Initialise(estateconnectionstring); - m_estateDataStore = estPlug; + EstateDataStore = estPlug; } } } diff --git a/OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs new file mode 100644 index 0000000000..93147d4bd3 --- /dev/null +++ b/OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs @@ -0,0 +1,125 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Server.Base; + +namespace OpenSim.Services.Connectors.Simulation +{ + public class SimulationDataServiceConnector : ISimulationDataService + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private ISimulationDataStore m_simDataStore; + + public SimulationDataServiceConnector() + { + } + + public SimulationDataServiceConnector(IConfigSource config) + { + Initialise(config); + } + + public virtual void Initialise(IConfigSource config) + { + IConfig serverConfig = config.Configs["SimulationDataStore"]; + if (serverConfig == null) + throw new Exception("No section 'SimulationDataStore' in config file"); + + string simDataStore = serverConfig.GetString("StoreModule", String.Empty); + + Object[] args = new Object[] { config }; + m_simDataStore = ServerUtils.LoadPlugin(simDataStore, args); + } + + public void StoreObject(SceneObjectGroup obj, UUID regionUUID) + { + } + + public void RemoveObject(UUID uuid, UUID regionUUID) + { + } + + public void StorePrimInventory(UUID primID, ICollection items) + { + } + + public List LoadObjects(UUID regionUUID) + { + return new List(0); + } + + public void StoreTerrain(double[,] terrain, UUID regionID) + { + } + + public double[,] LoadTerrain(UUID regionID) + { + return new double[Constants.RegionSize, Constants.RegionSize]; + } + + public void StoreLandObject(ILandObject Parcel) + { + } + + public void RemoveLandObject(UUID globalID) + { + } + + public List LoadLandObjects(UUID regionUUID) + { + return new List(0); + } + + public void StoreRegionSettings(RegionSettings rs) + { + } + + public RegionSettings LoadRegionSettings(UUID regionUUID) + { + return null; + } + + public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID) + { + return null; + } + + public void StoreRegionWindlightSettings(RegionLightShareData wl) + { + } + } +} From 20cd1da6bf6118352af1f1f206bcd2303f098d6d Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Sun, 12 Sep 2010 12:54:31 -0400 Subject: [PATCH 32/35] Add copyright headers. --- OpenSim/Data/DBGuids.cs | 29 ++++++++++++++++++- OpenSim/Data/Null/NullInventoryData.cs | 29 ++++++++++++++++++- OpenSim/Data/Tests/BasicDataServiceTest.cs | 29 ++++++++++++++++++- OpenSim/Data/Tests/DefaultTestConns.cs | 29 ++++++++++++++++++- OpenSim/Framework/Console/MockConsole.cs | 29 ++++++++++++++++++- OpenSim/Framework/Lazy.cs | 2 +- .../Region/Framework/Scenes/Prioritizer.cs | 27 +++++++++++++++++ 7 files changed, 168 insertions(+), 6 deletions(-) diff --git a/OpenSim/Data/DBGuids.cs b/OpenSim/Data/DBGuids.cs index fb6832b8d1..c40e8bbf21 100644 --- a/OpenSim/Data/DBGuids.cs +++ b/OpenSim/Data/DBGuids.cs @@ -1,4 +1,31 @@ -using System; +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; using System.Collections.Generic; using System.Text; using OpenMetaverse; diff --git a/OpenSim/Data/Null/NullInventoryData.cs b/OpenSim/Data/Null/NullInventoryData.cs index 8f196e2018..fe9ed017a1 100644 --- a/OpenSim/Data/Null/NullInventoryData.cs +++ b/OpenSim/Data/Null/NullInventoryData.cs @@ -1,4 +1,31 @@ -using System; +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; using System.Collections.Generic; using OpenMetaverse; diff --git a/OpenSim/Data/Tests/BasicDataServiceTest.cs b/OpenSim/Data/Tests/BasicDataServiceTest.cs index c261126722..272a2ca2e1 100644 --- a/OpenSim/Data/Tests/BasicDataServiceTest.cs +++ b/OpenSim/Data/Tests/BasicDataServiceTest.cs @@ -1,4 +1,31 @@ -using System; +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; using System.IO; using System.Collections.Generic; using log4net.Config; diff --git a/OpenSim/Data/Tests/DefaultTestConns.cs b/OpenSim/Data/Tests/DefaultTestConns.cs index 7b52af575a..7c47bddd21 100644 --- a/OpenSim/Data/Tests/DefaultTestConns.cs +++ b/OpenSim/Data/Tests/DefaultTestConns.cs @@ -1,4 +1,31 @@ -using System; +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/OpenSim/Framework/Console/MockConsole.cs b/OpenSim/Framework/Console/MockConsole.cs index 9eb197750d..a29b370857 100644 --- a/OpenSim/Framework/Console/MockConsole.cs +++ b/OpenSim/Framework/Console/MockConsole.cs @@ -1,4 +1,31 @@ -using System; +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; using System.Threading; using System.Collections.Generic; using System.Text; diff --git a/OpenSim/Framework/Lazy.cs b/OpenSim/Framework/Lazy.cs index 8a417ac64b..91de4bdd1d 100644 --- a/OpenSim/Framework/Lazy.cs +++ b/OpenSim/Framework/Lazy.cs @@ -1,4 +1,4 @@ -// +// // Lazy.cs // // Authors: diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs index 272f7186e4..581b11c4a1 100644 --- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs +++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs @@ -1,3 +1,30 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + using System; using System.Collections.Generic; using log4net; From f1f0bc23f4501ba99035283d3407ddad2b21b785 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Sun, 12 Sep 2010 13:43:49 -0400 Subject: [PATCH 33/35] Formatting cleanup. --- .../Rest/Inventory/RestAppearanceServices.cs | 4 +- OpenSim/Data/DBGuids.cs | 2 +- OpenSim/Data/MSSQL/MSSQLSimulationData.cs | 6 +- OpenSim/Data/Migration.cs | 14 +- OpenSim/Data/MySQL/MySQLInventoryData.cs | 2 +- OpenSim/Data/MySQL/MySQLSimulationData.cs | 22 +- OpenSim/Data/SQLite/SQLiteInventoryStore.cs | 6 +- OpenSim/Data/SQLite/SQLiteSimulationData.cs | 57 ++-- OpenSim/Data/Tests/BasicDataServiceTest.cs | 10 +- OpenSim/Framework/Capabilities/Caps.cs | 2 +- OpenSim/Framework/Console/CommandConsole.cs | 2 +- OpenSim/Framework/Console/LocalConsole.cs | 18 +- OpenSim/Framework/LandData.cs | 28 +- OpenSim/Framework/LandUpdateArgs.cs | 14 +- OpenSim/Framework/PrimitiveBaseShape.cs | 74 ++--- OpenSim/Framework/RegionInfo.cs | 28 +- .../Serialization/ArchiveConstants.cs | 20 +- .../Servers/HttpServer/BaseHttpServer.cs | 121 ++++---- OpenSim/Region/Application/Application.cs | 2 +- OpenSim/Region/Application/OpenSim.cs | 16 +- .../ClientStack/LindenUDP/LLClientView.cs | 261 +++++++++--------- .../Avatar/Attachments/AttachmentsModule.cs | 24 +- .../CoreModules/Avatar/Combat/CombatModule.cs | 4 +- .../CoreModules/Avatar/Gods/GodsModule.cs | 6 +- .../InstantMessage/MessageTransferModule.cs | 2 +- .../Archiver/InventoryArchiveReadRequest.cs | 18 +- .../Archiver/InventoryArchiveWriteRequest.cs | 10 +- .../Archiver/InventoryArchiverException.cs | 2 +- .../Archiver/InventoryArchiverModule.cs | 28 +- .../Archiver/Tests/InventoryArchiverTests.cs | 54 ++-- .../EventQueue/EventQueueGetModule.cs | 4 +- .../Framework/EventQueue/EventQueueHelper.cs | 18 +- .../InventoryAccess/InventoryAccessModule.cs | 2 +- .../Statistics/Logging/BinaryLoggingModule.cs | 12 +- .../Inventory/InventoryCache.cs | 2 +- .../LocalInventoryServiceConnector.cs | 2 +- .../RemoteXInventoryServiceConnector.cs | 2 +- .../World/Archiver/ArchiveHelpers.cs | 8 +- .../World/Land/LandManagementModule.cs | 111 ++++---- .../CoreModules/World/Land/LandObject.cs | 14 +- .../World/Media/Moap/MoapModule.cs | 98 +++---- .../World/Objects/BuySell/BuySellModule.cs | 14 +- .../World/Permissions/PermissionsModule.cs | 22 +- .../World/Terrain/TerrainModule.cs | 2 +- .../CoreModules/World/Wind/WindModule.cs | 2 +- .../World/WorldMap/MapImageModule.cs | 2 +- .../World/WorldMap/WorldMapModule.cs | 2 +- .../Interfaces/IAttachmentsModule.cs | 2 +- .../Framework/Interfaces/IGroupsModule.cs | 6 +- .../Interfaces/IInventoryArchiverModule.cs | 16 +- .../Framework/Interfaces/IMoapModule.cs | 2 +- .../Framework/Interfaces/IWorldMapModule.cs | 2 +- .../Region/Framework/Scenes/EventManager.cs | 12 +- .../Region/Framework/Scenes/Prioritizer.cs | 10 +- .../Framework/Scenes/Scene.Inventory.cs | 12 +- .../Framework/Scenes/Scene.PacketHandlers.cs | 2 +- .../Framework/Scenes/Scene.Permissions.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 18 +- OpenSim/Region/Framework/Scenes/SceneBase.cs | 2 +- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 6 +- .../Framework/Scenes/SceneObjectGroup.cs | 18 +- .../Framework/Scenes/SceneObjectPart.cs | 22 +- .../Scenes/SceneObjectPartInventory.cs | 2 +- .../Region/Framework/Scenes/ScenePresence.cs | 2 +- .../Region/Framework/Scenes/SceneViewer.cs | 4 +- .../Framework/Scenes/Tests/SceneGraphTests.cs | 4 +- .../Scenes/Tests/SceneObjectLinkingTests.cs | 18 +- .../Scenes/Tests/TaskInventoryTests.cs | 14 +- .../Avatar/XmlRpcGroups/GroupsModule.cs | 2 +- .../SimianGroupsServicesConnectorModule.cs | 39 ++- .../XmlRpcGroupsServicesConnectorModule.cs | 4 +- .../ContentManagementSystem/MetaEntity.cs | 2 +- .../Scripting/Minimodule/SOPObject.cs | 4 +- .../World/MoneyModule/SampleMoneyModule.cs | 2 +- .../RegionCombinerIndividualEventForwarder.cs | 4 +- .../RegionCombinerLargeLandChannel.cs | 6 +- .../Shared/Api/Implementation/LSL_Api.cs | 8 +- .../Shared/Api/Implementation/OSSL_Api.cs | 6 +- .../Implementation/Plugins/SensorRepeat.cs | 4 +- .../Region/ScriptEngine/XEngine/XEngine.cs | 2 +- OpenSim/Server/Base/ServerUtils.cs | 2 +- .../Hypergrid/GatekeeperServiceConnector.cs | 2 +- .../Inventory/XInventoryConnector.cs | 2 +- .../InventoryService/InventoryService.cs | 4 +- .../Services/LLLoginService/LLLoginService.cs | 2 +- .../UserAccountService/UserAccountService.cs | 20 +- .../Tests/Common/Mock/MockRegionDataPlugin.cs | 6 +- OpenSim/Tests/Common/Mock/TestScene.cs | 2 +- OpenSim/Tests/Common/Setup/AssetHelpers.cs | 4 +- .../Tests/Common/Setup/SceneSetupHelpers.cs | 37 ++- .../Common/Setup/UserInventoryTestUtils.cs | 4 +- .../Common/Setup/UserProfileTestUtils.cs | 8 +- 92 files changed, 754 insertions(+), 772 deletions(-) diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RestAppearanceServices.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RestAppearanceServices.cs index 4369216b26..8271d76b44 100644 --- a/OpenSim/ApplicationPlugins/Rest/Inventory/RestAppearanceServices.cs +++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RestAppearanceServices.cs @@ -384,7 +384,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory // } // // rdata.Respond(String.Format("Appearance {0} : Normal completion", rdata.method)); -// +// // } /// @@ -449,7 +449,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory // rdata.userAppearance = new AvatarAppearance(); // rdata.userAppearance.Owner = old.Owner; // adata = new AvatarData(rdata.userAppearance); -// +// // Rest.AvatarServices.SetAvatar(rdata.userProfile.ID, adata); // // rdata.Complete(); diff --git a/OpenSim/Data/DBGuids.cs b/OpenSim/Data/DBGuids.cs index c40e8bbf21..ad1c19c6ee 100644 --- a/OpenSim/Data/DBGuids.cs +++ b/OpenSim/Data/DBGuids.cs @@ -44,7 +44,7 @@ namespace OpenSim.Data /// public static UUID FromDB(object id) { - if( (id == null) || (id == DBNull.Value)) + if ((id == null) || (id == DBNull.Value)) return UUID.Zero; if (id.GetType() == typeof(Guid)) diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index ae105d594a..e4bfc28db8 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs @@ -1126,7 +1126,7 @@ VALUES prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]); if (!(primRow["MediaURL"] is System.DBNull)) - prim.MediaUrl = (string)primRow["MediaURL"]; + prim.MediaUrl = (string)primRow["MediaURL"]; return prim; } @@ -1180,7 +1180,7 @@ VALUES { } - if (!(shapeRow["Media"] is System.DBNull)) + if (!(shapeRow["Media"] is System.DBNull)) baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]); return baseShape; @@ -1511,7 +1511,7 @@ VALUES parameters.Add(_Database.CreateParameter("PassTouches", 1)); else parameters.Add(_Database.CreateParameter("PassTouches", 0)); - parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); + parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); return parameters.ToArray(); diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 86531d92df..fc9a1429ec 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs @@ -122,7 +122,7 @@ namespace OpenSim.Data int ver = FindVersion(_conn, "migrations"); if (ver <= 0) // -1 = no table, 0 = no version record { - if( ver < 0 ) + if (ver < 0) ExecuteScript("create table migrations(name varchar(100), version int)"); InsertVersion("migrations", 1); } @@ -288,7 +288,7 @@ namespace OpenSim.Data SortedList migrations = new SortedList(); string[] names = _assem.GetManifestResourceNames(); - if( names.Length == 0 ) // should never happen + if (names.Length == 0) // should never happen return migrations; Array.Sort(names); // we want all the migrations ordered @@ -297,7 +297,7 @@ namespace OpenSim.Data Match m = null; string sFile = Array.FindLast(names, nm => { m = _match_new.Match(nm); return m.Success; }); // ; nm.StartsWith(sPrefix, StringComparison.InvariantCultureIgnoreCase - if( (m != null) && !String.IsNullOrEmpty(sFile) ) + if ((m != null) && !String.IsNullOrEmpty(sFile)) { /* The filename should be '.migrations[.NNN]' where NNN * is the last version number defined in the file. If the '.NNN' part is recognized, the code can skip @@ -312,7 +312,7 @@ namespace OpenSim.Data if (m.Groups.Count > 1 && int.TryParse(m.Groups[1].Value, out nLastVerFound)) { - if( nLastVerFound <= after ) + if (nLastVerFound <= after) goto scan_old_style; } @@ -329,7 +329,7 @@ namespace OpenSim.Data sb.Length = 0; } - if ( (nVersion > 0) && (nVersion > after) && (script.Count > 0) && !migrations.ContainsKey(nVersion)) // script to the versioned script list + if ((nVersion > 0) && (nVersion > after) && (script.Count > 0) && !migrations.ContainsKey(nVersion)) // script to the versioned script list { migrations[nVersion] = script.ToArray(); } @@ -345,7 +345,7 @@ namespace OpenSim.Data string sLine = resourceReader.ReadLine(); nLineNo++; - if( String.IsNullOrEmpty(sLine) || sLine.StartsWith("#") ) // ignore a comment or empty line + if (String.IsNullOrEmpty(sLine) || sLine.StartsWith("#")) // ignore a comment or empty line continue; if (sLine.Trim().Equals(":GO", StringComparison.InvariantCultureIgnoreCase)) @@ -392,7 +392,7 @@ scan_old_style: if (m.Success) { int version = int.Parse(m.Groups[1].ToString()); - if ( (version > after) && !migrations.ContainsKey(version) ) + if ((version > after) && !migrations.ContainsKey(version)) { using (Stream resource = _assem.GetManifestResourceStream(s)) { diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 0aea30ffb9..2dca3eb6a9 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -286,7 +286,7 @@ namespace OpenSim.Data.MySQL InventoryItemBase item = new InventoryItemBase(); // TODO: this is to handle a case where NULLs creep in there, which we are not sure is endemic to the system, or legacy. It would be nice to live fix these. - // ( DBGuid.FromDB() reads db NULLs as well, returns UUID.Zero ) + // (DBGuid.FromDB() reads db NULLs as well, returns UUID.Zero) item.CreatorId = reader["creatorID"].ToString(); // Be a bit safer in parsing these because the diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index 36f73ef49d..8201cef7a5 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -680,7 +680,7 @@ namespace OpenSim.Data.MySQL "UserLocationX, UserLocationY, UserLocationZ, " + "UserLookAtX, UserLookAtY, UserLookAtZ, " + "AuthbuyerID, OtherCleanTime, MediaType, MediaDescription, " + - "MediaSize, MediaLoop, ObscureMusic, ObscureMedia) values (" + + "MediaSize, MediaLoop, ObscureMusic, ObscureMedia) values (" + "?UUID, ?RegionUUID, " + "?LocalLandID, ?Bitmap, ?Name, ?Description, " + "?OwnerUUID, ?IsGroupOwned, ?Area, ?AuctionID, " + @@ -691,7 +691,7 @@ namespace OpenSim.Data.MySQL "?UserLocationX, ?UserLocationY, ?UserLocationZ, " + "?UserLookAtX, ?UserLookAtY, ?UserLookAtZ, " + "?AuthbuyerID, ?OtherCleanTime, ?MediaType, ?MediaDescription, "+ - "CONCAT(?MediaWidth, ',', ?MediaHeight), ?MediaLoop, ?ObscureMusic, ?ObscureMedia)"; + "CONCAT(?MediaWidth, ',', ?MediaHeight), ?MediaLoop, ?ObscureMusic, ?ObscureMedia)"; FillLandCommand(cmd, parcel.LandData, parcel.RegionUUID); @@ -728,7 +728,7 @@ namespace OpenSim.Data.MySQL string command = "select * from `regionwindlight` where region_id = ?regionID"; - using(MySqlCommand cmd = new MySqlCommand(command)) + using (MySqlCommand cmd = new MySqlCommand(command)) { cmd.Connection = dbcon; @@ -1350,13 +1350,13 @@ namespace OpenSim.Data.MySQL m_log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name); } - newData.MediaDescription = (string) row["MediaDescription"]; - newData.MediaType = (string) row["MediaType"]; - newData.MediaWidth = Convert.ToInt32((((string) row["MediaSize"]).Split(','))[0]); - newData.MediaHeight = Convert.ToInt32((((string) row["MediaSize"]).Split(','))[1]); - newData.MediaLoop = Convert.ToBoolean(row["MediaLoop"]); - newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]); - newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]); + newData.MediaDescription = (string) row["MediaDescription"]; + newData.MediaType = (string) row["MediaType"]; + newData.MediaWidth = Convert.ToInt32((((string) row["MediaSize"]).Split(','))[0]); + newData.MediaHeight = Convert.ToInt32((((string) row["MediaSize"]).Split(','))[1]); + newData.MediaLoop = Convert.ToBoolean(row["MediaLoop"]); + newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]); + newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]); newData.ParcelAccessList = new List(); @@ -1724,7 +1724,7 @@ namespace OpenSim.Data.MySQL s.State = (byte)(int)row["State"]; - if (!(row["Media"] is System.DBNull)) + if (!(row["Media"] is System.DBNull)) s.Media = PrimitiveBaseShape.MediaList.FromXml((string)row["Media"]); return s; diff --git a/OpenSim/Data/SQLite/SQLiteInventoryStore.cs b/OpenSim/Data/SQLite/SQLiteInventoryStore.cs index ece2495c2b..ecf8e02c34 100644 --- a/OpenSim/Data/SQLite/SQLiteInventoryStore.cs +++ b/OpenSim/Data/SQLite/SQLiteInventoryStore.cs @@ -731,12 +731,12 @@ namespace OpenSim.Data.SQLite **********************************************************************/ protected void CreateDataSetMapping(IDataAdapter da, string tableName) - { + { ITableMapping dbMapping = da.TableMappings.Add(tableName, tableName); foreach (DataColumn col in ds.Tables[tableName].Columns) - { + { dbMapping.ColumnMappings.Add(col.ColumnName, col.ColumnName); - } + } } /// diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 1820f78fac..74609613ea 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -176,7 +176,7 @@ namespace OpenSim.Data.SQLite { m_log.Info("[SQLITE REGION DB]: Caught fill error on primitems table"); } - + try { terrainDa.Fill(ds.Tables["terrain"]); @@ -510,7 +510,7 @@ namespace OpenSim.Data.SQLite "[SQLITE REGION DB]: No shape found for prim in storage, so setting default box shape"); prim.Shape = PrimitiveBaseShape.Default; } - + createdObjects[new UUID(objID)].AddPart(prim); LoadItems(prim); } @@ -534,17 +534,17 @@ namespace OpenSim.Data.SQLite /// /// the prim private void LoadItems(SceneObjectPart prim) - { -// m_log.DebugFormat("[SQLITE REGION DB]: Loading inventory for {0} {1}", prim.Name, prim.UUID); - + { +// m_log.DebugFormat("[SQLITE REGION DB]: Loading inventory for {0} {1}", prim.Name, prim.UUID); + DataTable dbItems = ds.Tables["primitems"]; - String sql = String.Format("primID = '{0}'", prim.UUID.ToString()); + String sql = String.Format("primID = '{0}'", prim.UUID.ToString()); DataRow[] dbItemRows = dbItems.Select(sql); IList inventory = new List(); -// m_log.DebugFormat( -// "[SQLITE REGION DB]: Found {0} items for {1} {2}", dbItemRows.Length, prim.Name, prim.UUID); - +// m_log.DebugFormat( +// "[SQLITE REGION DB]: Found {0} items for {1} {2}", dbItemRows.Length, prim.Name, prim.UUID); + foreach (DataRow row in dbItemRows) { TaskInventoryItem item = buildItem(row); @@ -693,8 +693,6 @@ namespace OpenSim.Data.SQLite { landaccesslist.Rows.Remove(rowsToDelete[iter]); } - - } Commit(); } @@ -804,7 +802,7 @@ namespace OpenSim.Data.SQLite try { regionSettingsDa.Update(ds, "regionsettings"); - } + } catch (SqliteException SqlEx) { throw new Exception( @@ -974,7 +972,7 @@ namespace OpenSim.Data.SQLite createCol(prims, "CollisionSoundVolume", typeof(Double)); createCol(prims, "VolumeDetect", typeof(Int16)); - + createCol(prims, "MediaURL", typeof(String)); // Add in contraints @@ -1191,10 +1189,10 @@ namespace OpenSim.Data.SQLite private SceneObjectPart buildPrim(DataRow row) { // Code commented. Uncomment to test the unit test inline. - - // The unit test mentions this commented code for the purposes + + // The unit test mentions this commented code for the purposes // of debugging a unit test failure - + // SceneObjectGroup sog = new SceneObjectGroup(); // SceneObjectPart sop = new SceneObjectPart(); // sop.LocalId = 1; @@ -1211,7 +1209,7 @@ namespace OpenSim.Data.SQLite // TODO: this doesn't work yet because something more // interesting has to be done to actually get these values // back out. Not enough time to figure it out yet. - + SceneObjectPart prim = new SceneObjectPart(); prim.UUID = new UUID((String) row["UUID"]); // explicit conversion of integers is required, which sort @@ -1341,7 +1339,7 @@ namespace OpenSim.Data.SQLite if (Convert.ToInt16(row["VolumeDetect"]) != 0) prim.VolumeDetectActive = true; - + if (!(row["MediaURL"] is System.DBNull)) { //m_log.DebugFormat("[SQLITE]: MediaUrl type [{0}]", row["MediaURL"].GetType()); @@ -1680,7 +1678,7 @@ namespace OpenSim.Data.SQLite row["VolumeDetect"] = 1; else row["VolumeDetect"] = 0; - + row["MediaURL"] = prim.MediaUrl; } @@ -1758,12 +1756,12 @@ namespace OpenSim.Data.SQLite row["UserLookAtZ"] = land.UserLookAt.Z; row["AuthbuyerID"] = land.AuthBuyerID.ToString(); row["OtherCleanTime"] = land.OtherCleanTime; - row["MediaType"] = land.MediaType; - row["MediaDescription"] = land.MediaDescription; - row["MediaSize"] = land.MediaWidth.ToString() + "," + land.MediaHeight.ToString(); - row["MediaLoop"] = land.MediaLoop.ToString(); - row["ObscureMusic"] = land.ObscureMusic.ToString(); - row["ObscureMedia"] = land.ObscureMedia.ToString(); + row["MediaType"] = land.MediaType; + row["MediaDescription"] = land.MediaDescription; + row["MediaSize"] = land.MediaWidth.ToString() + "," + land.MediaHeight.ToString(); + row["MediaLoop"] = land.MediaLoop.ToString(); + row["ObscureMusic"] = land.ObscureMusic.ToString(); + row["ObscureMedia"] = land.ObscureMedia.ToString(); } /// @@ -1861,10 +1859,10 @@ namespace OpenSim.Data.SQLite s.TextureEntry = textureEntry; s.ExtraParams = (byte[]) row["ExtraParams"]; - + if (!(row["Media"] is System.DBNull)) s.Media = PrimitiveBaseShape.MediaList.FromXml((string)row["Media"]); - + return s; } @@ -1908,7 +1906,7 @@ namespace OpenSim.Data.SQLite row["Texture"] = s.TextureEntry; row["ExtraParams"] = s.ExtraParams; - + if (s.Media != null) row["Media"] = s.Media.ToXml(); } @@ -2246,7 +2244,6 @@ namespace OpenSim.Data.SQLite delete.Parameters.Add(createSqliteParameter("AccessUUID", typeof(String))); da.DeleteCommand = delete; da.DeleteCommand.Connection = conn; - } private void setupRegionSettingsCommands(SqliteDataAdapter da, SqliteConnection conn) @@ -2318,7 +2315,7 @@ namespace OpenSim.Data.SQLite return DbType.String; } } - + static void PrintDataSet(DataSet ds) { // Print out any name and extended properties. diff --git a/OpenSim/Data/Tests/BasicDataServiceTest.cs b/OpenSim/Data/Tests/BasicDataServiceTest.cs index 272a2ca2e1..7d85f0c8eb 100644 --- a/OpenSim/Data/Tests/BasicDataServiceTest.cs +++ b/OpenSim/Data/Tests/BasicDataServiceTest.cs @@ -68,13 +68,13 @@ namespace OpenSim.Data.Tests { m_connStr = !String.IsNullOrEmpty(conn) ? conn : DefaultTestConns.Get(typeof(TConn)); - m_log = LogManager.GetLogger(this.GetType()); + m_log = LogManager.GetLogger(this.GetType()); OpenSim.Tests.Common.TestLogging.LogToConsole(); // TODO: Is that right? } /// /// To be overridden in derived classes. Do whatever init with the m_service, like setting the conn string to it. - /// You'd probably want to to cast the 'service' to a more specific type and store it in a member var. + /// You'd probably want to to cast the 'service' to a more specific type and store it in a member var. /// This framework takes care of disposing it, if it's disposable. /// /// The service being tested @@ -145,12 +145,12 @@ namespace OpenSim.Data.Tests { if (m_service != null) { - if( m_service is IDisposable) + if (m_service is IDisposable) ((IDisposable)m_service).Dispose(); m_service = null; } - if( !String.IsNullOrEmpty(m_file) && File.Exists(m_file) ) + if (!String.IsNullOrEmpty(m_file) && File.Exists(m_file)) File.Delete(m_file); } @@ -231,7 +231,7 @@ namespace OpenSim.Data.Tests lst += ", " + s; } - string sCond = stores.Length > 1 ? ("in (" + lst + ")") : ("=" + lst); + string sCond = stores.Length > 1 ? ("in (" + lst + ")") : ("=" + lst); try { ExecuteSql("DELETE FROM migrations where name " + sCond); diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs index 8a339fedc9..6f32adfc7f 100644 --- a/OpenSim/Framework/Capabilities/Caps.cs +++ b/OpenSim/Framework/Capabilities/Caps.cs @@ -760,7 +760,7 @@ namespace OpenSim.Framework.Capabilities string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); BakedTextureUploader uploader = - new BakedTextureUploader( capsBase + uploaderPath, + new BakedTextureUploader(capsBase + uploaderPath, m_httpListener); uploader.OnUpLoad += BakedTextureUploaded; diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index b17dbc08de..52bcd5599b 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs @@ -151,7 +151,7 @@ namespace OpenSim.Framework.Console help.Add(commandInfo.descriptive_help); if (descriptiveHelp != string.Empty) - help.Add(string.Empty); + help.Add(string.Empty); } else { diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index c968031c11..6043094440 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs @@ -38,7 +38,7 @@ namespace OpenSim.Framework.Console { /// /// A console that uses cursor control and color - /// + /// public class LocalConsole : CommandConsole { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -100,8 +100,8 @@ namespace OpenSim.Framework.Console private int SetCursorTop(int top) { // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try - // to set a cursor row position with a currently invalid column, mono will throw an exception. - // Therefore, we need to make sure that the column position is valid first. + // to set a cursor row position with a currently invalid column, mono will throw an exception. + // Therefore, we need to make sure that the column position is valid first. int left = System.Console.CursorLeft; if (left < 0) @@ -121,7 +121,7 @@ namespace OpenSim.Framework.Console { top = 0; } - else + else { int bh = System.Console.BufferHeight; @@ -133,7 +133,7 @@ namespace OpenSim.Framework.Console System.Console.CursorTop = top; return top; - } + } /// /// Set the cursor column. @@ -145,12 +145,12 @@ namespace OpenSim.Framework.Console /// /// /// The new cursor column. - /// + /// private int SetCursorLeft(int left) { // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try - // to set a cursor column position with a currently invalid row, mono will throw an exception. - // Therefore, we need to make sure that the row position is valid first. + // to set a cursor column position with a currently invalid row, mono will throw an exception. + // Therefore, we need to make sure that the row position is valid first. int top = System.Console.CursorTop; if (top < 0) @@ -214,7 +214,7 @@ namespace OpenSim.Framework.Console System.Console.Write("{0}", prompt); SetCursorTop(new_y); - SetCursorLeft(new_x); + SetCursorLeft(new_x); } } diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs index 8d3266b944..accf52ec44 100644 --- a/OpenSim/Framework/LandData.cs +++ b/OpenSim/Framework/LandData.cs @@ -89,13 +89,13 @@ namespace OpenSim.Framework private Vector3 _userLocation = new Vector3(); private Vector3 _userLookAt = new Vector3(); private int _otherCleanTime = 0; - private string _mediaType = "none/none"; - private string _mediaDescription = ""; - private int _mediaHeight = 0; - private int _mediaWidth = 0; - private bool _mediaLoop = false; - private bool _obscureMusic = false; - private bool _obscureMedia = false; + private string _mediaType = "none/none"; + private string _mediaDescription = ""; + private int _mediaHeight = 0; + private int _mediaWidth = 0; + private bool _mediaLoop = false; + private bool _obscureMusic = false; + private bool _obscureMedia = false; /// /// Whether to obscure parcel media URL @@ -690,13 +690,13 @@ namespace OpenSim.Framework landData._userLocation = _userLocation; landData._userLookAt = _userLookAt; landData._otherCleanTime = _otherCleanTime; - landData._mediaType = _mediaType; - landData._mediaDescription = _mediaDescription; - landData._mediaWidth = _mediaWidth; - landData._mediaHeight = _mediaHeight; - landData._mediaLoop = _mediaLoop; - landData._obscureMusic = _obscureMusic; - landData._obscureMedia = _obscureMedia; + landData._mediaType = _mediaType; + landData._mediaDescription = _mediaDescription; + landData._mediaWidth = _mediaWidth; + landData._mediaHeight = _mediaHeight; + landData._mediaLoop = _mediaLoop; + landData._obscureMusic = _obscureMusic; + landData._obscureMedia = _obscureMedia; landData._parcelAccessList.Clear(); foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList) diff --git a/OpenSim/Framework/LandUpdateArgs.cs b/OpenSim/Framework/LandUpdateArgs.cs index ed496a1455..7d6c4f2dab 100644 --- a/OpenSim/Framework/LandUpdateArgs.cs +++ b/OpenSim/Framework/LandUpdateArgs.cs @@ -49,12 +49,12 @@ namespace OpenSim.Framework public UUID SnapshotID; public Vector3 UserLocation; public Vector3 UserLookAt; - public string MediaType; - public string MediaDescription; - public int MediaHeight; - public int MediaWidth; - public bool MediaLoop; - public bool ObscureMusic; - public bool ObscureMedia; + public string MediaType; + public string MediaDescription; + public int MediaHeight; + public int MediaWidth; + public bool MediaLoop; + public bool ObscureMusic; + public bool ObscureMedia; } } diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 70a61cc622..0a81363b85 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs @@ -175,7 +175,7 @@ namespace OpenSim.Framework } } } - + /// /// Entries to store media textures on each face /// @@ -1216,28 +1216,28 @@ namespace OpenSim.Framework prim.Properties.Permissions = new Permissions(); prim.Properties.SalePrice = 10; prim.Properties.SaleType = new SaleType(); - + return prim; } - + /// /// Encapsulates a list of media entries. /// - /// This class is necessary because we want to replace auto-serialization of MediaEntry with something more + /// This class is necessary because we want to replace auto-serialization of MediaEntry with something more /// OSD like and less vulnerable to change. public class MediaList : List, IXmlSerializable - { + { public const string MEDIA_TEXTURE_TYPE = "sl"; - + public MediaList() : base() {} public MediaList(IEnumerable collection) : base(collection) {} public MediaList(int capacity) : base(capacity) {} - + public XmlSchema GetSchema() { return null; } - + public string ToXml() { lock (this) @@ -1245,78 +1245,78 @@ namespace OpenSim.Framework using (StringWriter sw = new StringWriter()) { using (XmlTextWriter xtw = new XmlTextWriter(sw)) - { + { xtw.WriteStartElement("OSMedia"); xtw.WriteAttributeString("type", MEDIA_TEXTURE_TYPE); xtw.WriteAttributeString("version", "0.1"); - + OSDArray meArray = new OSDArray(); foreach (MediaEntry me in this) { OSD osd = (null == me ? new OSD() : me.GetOSD()); meArray.Add(osd); - } - + } + xtw.WriteStartElement("OSData"); xtw.WriteRaw(OSDParser.SerializeLLSDXmlString(meArray)); xtw.WriteEndElement(); - + xtw.WriteEndElement(); - - xtw.Flush(); + + xtw.Flush(); return sw.ToString(); } - } - } + } + } } - + public void WriteXml(XmlWriter writer) - { + { writer.WriteRaw(ToXml()); } - + public static MediaList FromXml(string rawXml) { MediaList ml = new MediaList(); ml.ReadXml(rawXml); return ml; } - + public void ReadXml(string rawXml) - { + { using (StringReader sr = new StringReader(rawXml)) { using (XmlTextReader xtr = new XmlTextReader(sr)) - { + { xtr.MoveToContent(); - + string type = xtr.GetAttribute("type"); //m_log.DebugFormat("[MOAP]: Loaded media texture entry with type {0}", type); - + if (type != MEDIA_TEXTURE_TYPE) - return; - - xtr.ReadStartElement("OSMedia"); - + return; + + xtr.ReadStartElement("OSMedia"); + OSDArray osdMeArray = (OSDArray)OSDParser.DeserializeLLSDXml(xtr.ReadInnerXml()); foreach (OSD osdMe in osdMeArray) { MediaEntry me = (osdMe is OSDMap ? MediaEntry.FromOSD(osdMe) : new MediaEntry()); Add(me); } - - xtr.ReadEndElement(); + + xtr.ReadEndElement(); } } - } - + } + public void ReadXml(XmlReader reader) { if (reader.IsEmptyElement) return; - + ReadXml(reader.ReadInnerXml()); - } + } } - } -} \ No newline at end of file + } +} diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index 12c58c3b76..08d5398a18 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -97,9 +97,9 @@ namespace OpenSim.Framework [Serializable] public class SimpleRegionInfo - { + { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + /// /// The port by which http communication occurs with the region (most noticeably, CAPS communication) /// @@ -344,7 +344,7 @@ namespace OpenSim.Framework public string proxyUrl = ""; public int ProxyOffset = 0; public string regionSecret = UUID.Random().ToString(); - + public string osSecret; public UUID lastMapUUID = UUID.Zero; @@ -699,7 +699,7 @@ namespace OpenSim.Framework RegionID = new UUID(regionUUID); originRegionID = RegionID; // What IS this?! - + RegionName = name; string location = config.GetString("Location", String.Empty); @@ -720,7 +720,7 @@ namespace OpenSim.Framework // Internal IP IPAddress address; - + if (config.Contains("InternalAddress")) { address = IPAddress.Parse(config.GetString("InternalAddress", String.Empty)); @@ -774,7 +774,7 @@ namespace OpenSim.Framework { m_externalHostName = Util.GetLocalHost().ToString(); m_log.InfoFormat( - "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}", + "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}", m_externalHostName, name); } else @@ -909,16 +909,16 @@ namespace OpenSim.Framework configMember.addConfigurationOption("nonphysical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Maximum size for nonphysical prims", m_nonphysPrimMax.ToString(), true); - + configMember.addConfigurationOption("physical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Maximum size for physical prims", m_physPrimMax.ToString(), true); - + configMember.addConfigurationOption("clamp_prim_size", ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN, "Clamp prims to max size", m_clampPrimSize.ToString(), true); - + configMember.addConfigurationOption("object_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Max objects this sim will hold", m_objectCapacity.ToString(), true); - + configMember.addConfigurationOption("scope_id", ConfigurationOption.ConfigurationTypes.TYPE_UUID, "Scope ID for this region", ScopeID.ToString(), true); @@ -956,16 +956,16 @@ namespace OpenSim.Framework configMember.addConfigurationOption("lastmap_refresh", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Last Map Refresh", Util.UnixTimeSinceEpoch().ToString(), true); - + configMember.addConfigurationOption("nonphysical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Maximum size for nonphysical prims", "0", true); - + configMember.addConfigurationOption("physical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Maximum size for physical prims", "0", true); - + configMember.addConfigurationOption("clamp_prim_size", ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN, "Clamp prims to max size", "false", true); - + configMember.addConfigurationOption("object_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Max objects this sim will hold", "0", true); diff --git a/OpenSim/Framework/Serialization/ArchiveConstants.cs b/OpenSim/Framework/Serialization/ArchiveConstants.cs index 3143e3bec7..7a9b33dc8c 100644 --- a/OpenSim/Framework/Serialization/ArchiveConstants.cs +++ b/OpenSim/Framework/Serialization/ArchiveConstants.cs @@ -157,9 +157,9 @@ namespace OpenSim.Framework.Serialization public static string CreateOarObjectFilename(string objectName, UUID uuid, Vector3 pos) { return string.Format( - OAR_OBJECT_FILENAME_TEMPLATE, objectName, + OAR_OBJECT_FILENAME_TEMPLATE, objectName, Math.Round(pos.X), Math.Round(pos.Y), Math.Round(pos.Z), - uuid); + uuid); } /// @@ -171,9 +171,9 @@ namespace OpenSim.Framework.Serialization /// public static string CreateOarObjectPath(string objectName, UUID uuid, Vector3 pos) { - return OBJECTS_PATH + CreateOarObjectFilename(objectName, uuid, pos); - } - + return OBJECTS_PATH + CreateOarObjectFilename(objectName, uuid, pos); + } + /// /// Extract a plain path from an IAR path /// @@ -184,18 +184,18 @@ namespace OpenSim.Framework.Serialization List plainDirs = new List(); string[] iarDirs = iarPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - + foreach (string iarDir in iarDirs) { if (!iarDir.Contains(ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR)) plainDirs.Add(iarDir); - + int i = iarDir.LastIndexOf(ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); plainDirs.Add(iarDir.Remove(i)); } - - return string.Join("/", plainDirs.ToArray()); + + return string.Join("/", plainDirs.ToArray()); } } -} \ No newline at end of file +} diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index d20f8c9b25..452df38d31 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -51,7 +51,7 @@ namespace OpenSim.Framework.Servers.HttpServer { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); - + private volatile int NotSocketErrors = 0; public volatile bool HTTPDRunning = false; @@ -160,7 +160,7 @@ namespace OpenSim.Framework.Servers.HttpServer m_rpcHandlers[method] = handler; m_rpcHandlersKeepAlive[method] = keepAlive; // default } - + return true; } @@ -182,7 +182,7 @@ namespace OpenSim.Framework.Servers.HttpServer public bool AddHTTPHandler(string methodName, GenericHTTPMethod handler) { //m_log.DebugFormat("[BASE HTTP SERVER]: Registering {0}", methodName); - + lock (m_HTTPHandlers) { if (!m_HTTPHandlers.ContainsKey(methodName)) @@ -204,14 +204,14 @@ namespace OpenSim.Framework.Servers.HttpServer if (!m_pollHandlers.ContainsKey(methodName)) { m_pollHandlers.Add(methodName,args); - pollHandlerResult = true; + pollHandlerResult = true; } } - + if (pollHandlerResult) return AddHTTPHandler(methodName, handler); - return false; + return false; } // Note that the agent string is provided simply to differentiate @@ -257,51 +257,51 @@ namespace OpenSim.Framework.Servers.HttpServer { IHttpClientContext context = (IHttpClientContext)source; IHttpRequest request = args.Request; - + PollServiceEventArgs psEvArgs; - + if (TryGetPollServiceHTTPHandler(request.UriPath.ToString(), out psEvArgs)) { PollServiceHttpRequest psreq = new PollServiceHttpRequest(psEvArgs, context, request); - + if (psEvArgs.Request != null) { OSHttpRequest req = new OSHttpRequest(context, request); - + Stream requestStream = req.InputStream; - + Encoding encoding = Encoding.UTF8; StreamReader reader = new StreamReader(requestStream, encoding); - + string requestBody = reader.ReadToEnd(); - + Hashtable keysvals = new Hashtable(); Hashtable headervals = new Hashtable(); - + string[] querystringkeys = req.QueryString.AllKeys; string[] rHeaders = req.Headers.AllKeys; - + keysvals.Add("body", requestBody); keysvals.Add("uri", req.RawUrl); keysvals.Add("content-type", req.ContentType); keysvals.Add("http-method", req.HttpMethod); - + foreach (string queryname in querystringkeys) { keysvals.Add(queryname, req.QueryString[queryname]); } - + foreach (string headername in rHeaders) { headervals[headername] = req.Headers[headername]; } - + keysvals.Add("headers", headervals); keysvals.Add("querystringkeys", querystringkeys); - + psEvArgs.Request(psreq.RequestID, keysvals); } - + m_PollServiceManager.Enqueue(psreq); } else @@ -348,10 +348,10 @@ namespace OpenSim.Framework.Servers.HttpServer { try { -// m_log.Debug("[BASE HTTP SERVER]: Handling request to " + request.RawUrl); - +// m_log.Debug("[BASE HTTP SERVER]: Handling request to " + request.RawUrl); + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", true); - + // This is the REST agent interface. We require an agent to properly identify // itself. If the REST handler recognizes the prefix it will attempt to // satisfy the request. If it is not recognizable, and no damage has occurred @@ -456,7 +456,7 @@ namespace OpenSim.Framework.Servers.HttpServer } request.InputStream.Close(); - + // HTTP IN support. The script engine taes it from here // Nothing to worry about for us. // @@ -540,7 +540,7 @@ namespace OpenSim.Framework.Servers.HttpServer HandleLLSDRequests(request, response); return; } - + // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); if (DoWeHaveAHTTPHandler(request.RawUrl)) { @@ -594,7 +594,7 @@ namespace OpenSim.Framework.Servers.HttpServer } } } - + if (String.IsNullOrEmpty(bestMatch)) { streamHandler = null; @@ -641,7 +641,7 @@ namespace OpenSim.Framework.Servers.HttpServer private bool TryGetHTTPHandler(string handlerKey, out GenericHTTPMethod HTTPHandler) { // m_log.DebugFormat("[BASE HTTP HANDLER]: Looking for HTTP handler for {0}", handlerKey); - + string bestMatch = null; lock (m_HTTPHandlers) @@ -727,14 +727,14 @@ namespace OpenSim.Framework.Servers.HttpServer { xmlRprcRequest.Params.Add(request.RemoteIPEndPoint); // Param[1] XmlRpcResponse xmlRpcResponse; - + XmlRpcMethod method; bool methodWasFound; lock (m_rpcHandlers) { methodWasFound = m_rpcHandlers.TryGetValue(methodName, out method); } - + if (methodWasFound) { xmlRprcRequest.Params.Add(request.Url); // Param[2] @@ -766,10 +766,10 @@ namespace OpenSim.Framework.Servers.HttpServer else { xmlRpcResponse = new XmlRpcResponse(); - + // Code set in accordance with http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php xmlRpcResponse.SetFault( - XmlRpcErrorCodes.SERVER_ERROR_METHOD, + XmlRpcErrorCodes.SERVER_ERROR_METHOD, String.Format("Requested method [{0}] not found", methodName)); } @@ -786,11 +786,11 @@ namespace OpenSim.Framework.Servers.HttpServer response.KeepAlive = false; m_log.ErrorFormat("[BASE HTTP SERVER]: Handler not found for http request {0}", request.RawUrl); - + response.SendChunked = false; response.ContentLength64 = buf.Length; response.ContentEncoding = Encoding.UTF8; - + try { response.OutputStream.Write(buf, 0, buf.Length); @@ -872,13 +872,13 @@ namespace OpenSim.Framework.Servers.HttpServer OSD llsdRequest = null; OSD llsdResponse = null; - + bool LegacyLLSDLoginLibOMV = (requestBody.Contains("passwd") && requestBody.Contains("mac") && requestBody.Contains("viewer_digest")); - + if (requestBody.Length == 0) // Get Request { - requestBody = "requestget"; + requestBody = "requestget"; } try { @@ -1090,7 +1090,7 @@ namespace OpenSim.Framework.Servers.HttpServer string bestMatch = null; //m_log.DebugFormat("[BASE HTTP HANDLER]: Checking if we have an HTTP handler for {0}", searchquery); - + lock (m_HTTPHandlers) { foreach (string pattern in m_HTTPHandlers.Keys) @@ -1156,7 +1156,7 @@ namespace OpenSim.Framework.Servers.HttpServer // You have to specifically register for '/' and to get it, you must specificaly request it // if (pattern == "/" && searchquery == "/" || pattern != "/") - bestMatch = pattern; + bestMatch = pattern; } } } @@ -1236,11 +1236,11 @@ namespace OpenSim.Framework.Servers.HttpServer } public void HandleHTTPRequest(OSHttpRequest request, OSHttpResponse response) - { + { // m_log.DebugFormat( -// "[BASE HTTP SERVER]: HandleHTTPRequest for request to {0}, method {1}", +// "[BASE HTTP SERVER]: HandleHTTPRequest for request to {0}, method {1}", // request.RawUrl, request.HttpMethod); - + switch (request.HttpMethod) { case "OPTIONS": @@ -1256,7 +1256,7 @@ namespace OpenSim.Framework.Servers.HttpServer private void HandleContentVerbs(OSHttpRequest request, OSHttpResponse response) { // m_log.DebugFormat("[BASE HTTP SERVER]: HandleContentVerbs for request to {0}", request.RawUrl); - + // This is a test. There's a workable alternative.. as this way sucks. // We'd like to put this into a text file parhaps that's easily editable. // @@ -1391,7 +1391,7 @@ namespace OpenSim.Framework.Servers.HttpServer // m_log.DebugFormat( // "[BASE HTTP HANDLER]: TryGetHTTPHandlerPathBased() looking for HTTP handler to match {0}", searchquery); - + lock (m_HTTPHandlers) { foreach (string pattern in m_HTTPHandlers.Keys) @@ -1452,7 +1452,7 @@ namespace OpenSim.Framework.Servers.HttpServer //Even though only one other part of the entire code uses HTTPHandlers, we shouldn't expect this //and should check for NullReferenceExceptions - + if (string.IsNullOrEmpty(contentType)) { contentType = "text/html"; @@ -1472,8 +1472,8 @@ namespace OpenSim.Framework.Servers.HttpServer byte[] buffer; - if (!(contentType.Contains("image") - || contentType.Contains("x-shockwave-flash") + if (!(contentType.Contains("image") + || contentType.Contains("x-shockwave-flash") || contentType.Contains("application/x-oar"))) { // Text @@ -1504,7 +1504,7 @@ namespace OpenSim.Framework.Servers.HttpServer { response.OutputStream.Flush(); response.Send(); - + //if (!response.KeepAlive && response.ReuseContext) // response.FreeContext(); } @@ -1611,11 +1611,11 @@ namespace OpenSim.Framework.Servers.HttpServer m_httpListener2 = CoolHTTPListener.Create(m_listenIPAddress, (int)m_port); m_httpListener2.ExceptionThrown += httpServerException; m_httpListener2.LogWriter = httpserverlog; - - // Uncomment this line in addition to those in HttpServerLogWriter + + // Uncomment this line in addition to those in HttpServerLogWriter // if you want more detailed trace information from the HttpServer //m_httpListener2.UseTraceLogs = true; - + //m_httpListener2.DisconnectHandler = httpServerDisconnectMonitor; } else @@ -1643,8 +1643,8 @@ namespace OpenSim.Framework.Servers.HttpServer { m_log.Error("[BASE HTTP SERVER]: Error - " + e.Message); m_log.Error("[BASE HTTP SERVER]: Tip: Do you have permission to listen on port " + m_port + ", " + m_sslport + "?"); - - // We want this exception to halt the entire server since in current configurations we aren't too + + // We want this exception to halt the entire server since in current configurations we aren't too // useful without inbound HTTP. throw e; } @@ -1656,7 +1656,7 @@ namespace OpenSim.Framework.Servers.HttpServer { case SocketError.NotSocket: NotSocketErrors++; - + break; } } @@ -1686,12 +1686,11 @@ namespace OpenSim.Framework.Servers.HttpServer m_httpListener2.LogWriter = null; m_httpListener2.RequestReceived -= OnRequest; m_httpListener2.Stop(); - } + } catch (NullReferenceException) { m_log.Warn("[BASE HTTP SERVER]: Null Reference when stopping HttpServer."); } - } public void RemoveStreamHandler(string httpMethod, string path) @@ -1712,7 +1711,7 @@ namespace OpenSim.Framework.Servers.HttpServer m_HTTPHandlers.Remove(path); return; } - + m_HTTPHandlers.Remove(GetHandlerKey(httpMethod, path)); } } @@ -1728,7 +1727,6 @@ namespace OpenSim.Framework.Servers.HttpServer } RemoveHTTPHandler(httpMethod, path); - } public bool RemoveAgentHandler(string agent, IHttpAgentHandler handler) @@ -1759,7 +1757,6 @@ namespace OpenSim.Framework.Servers.HttpServer } } - public bool RemoveLLSDHandler(string path, LLSDMethod handler) { try @@ -1833,7 +1830,7 @@ namespace OpenSim.Framework.Servers.HttpServer oresp = osresp; } } - + /// /// Relays HttpServer log messages to our own logging mechanism. /// @@ -1852,7 +1849,7 @@ namespace OpenSim.Framework.Servers.HttpServer { case LogPrio.Trace: m_log.DebugFormat("[{0}]: {1}", source, message); - break; + break; case LogPrio.Debug: m_log.DebugFormat("[{0}]: {1}", source, message); break; @@ -1872,8 +1869,8 @@ namespace OpenSim.Framework.Servers.HttpServer break; } */ - + return; } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs index b860cf6bc0..d120f03dc9 100644 --- a/OpenSim/Region/Application/Application.cs +++ b/OpenSim/Region/Application/Application.cs @@ -225,7 +225,7 @@ namespace OpenSim } } MainConsole.Instance = null; - } + } */ configSource.Alias.AddAlias("On", true); configSource.Alias.AddAlias("Off", false); diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 4f2d223bbc..c85ff824d2 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -152,7 +152,7 @@ namespace OpenSim RegisterConsoleCommands(); base.StartupSpecific(); - + MainServer.Instance.AddStreamHandler(new OpenSim.SimStatusHandler()); MainServer.Instance.AddStreamHandler(new OpenSim.XSimStatusHandler(this)); if (userStatsURI != String.Empty) @@ -192,7 +192,7 @@ namespace OpenSim // Hook up to the watchdog timer Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler; - PrintFileToConsole("startuplogo.txt"); + PrintFileToConsole("startuplogo.txt"); // For now, start at the 'root' level by default if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it @@ -218,8 +218,8 @@ namespace OpenSim m_console.Commands.AddCommand("region", false, "debug packet", "debug packet ", - "Turn on packet debugging", - "If level > 255 then all incoming and outgoing packets are logged.\n" + "Turn on packet debugging", + "If level > 255 then all incoming and outgoing packets are logged.\n" + "If level <= 255 then incoming AgentUpdate and outgoing SimStats and SimulatorViewerTimeMessage packets are not logged.\n" + "If level <= 200 then incoming RequestImage and outgoing ImagePacket, ImageData, LayerData and CoarseLocationUpdate packets are not logged.\n" + "If level <= 100 then incoming ViewerEffect and AgentAnimation and outgoing ViewerEffect and AvatarAnimation packets are not logged.\n" @@ -561,11 +561,11 @@ namespace OpenSim { regInfo = new RegionInfo(regionName, regionFile, false, ConfigSource.Source, regionName); } - + IScene scene; PopulateRegionEstateInfo(regInfo); - CreateRegion(regInfo, true, out scene); - regInfo.EstateSettings.Save(); + CreateRegion(regInfo, true, out scene); + regInfo.EstateSettings.Save(); } /// @@ -943,7 +943,7 @@ namespace OpenSim delegate(Scene scene) { MainConsole.Instance.Output(String.Format( - "Region Name: {0}, Region XLoc: {1}, Region YLoc: {2}, Region Port: {3}", + "Region Name: {0}, Region XLoc: {1}, Region YLoc: {2}, Region Port: {3}", scene.RegionInfo.RegionName, scene.RegionInfo.RegionLocX, scene.RegionInfo.RegionLocY, diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index a6315a9a1e..f35691acb5 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -63,7 +63,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// Debug packet level. See OpenSim.RegisterConsoleCommands() for more details. /// protected int m_debugPacketLevel = 0; - + #region Events public event GenericMessage OnGenericMessage; @@ -287,7 +287,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event MuteListEntryRemove OnRemoveMuteListEntry; public event GodlikeMessage onGodlikeMessage; public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; - #endregion Events @@ -329,12 +328,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// ownerless phantom. /// /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock - /// + /// /// protected HashSet m_killRecord; - -// protected HashSet m_attachmentsSent; - + +// protected HashSet m_attachmentsSent; + private int m_moneyBalance; private int m_animationSequenceNumber = 1; private bool m_SendLogoutPacketWhenClosing = true; @@ -383,22 +382,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP public string ActiveGroupName { get { return m_activeGroupName; } } public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } - + /// /// First name of the agent/avatar represented by the client /// public string FirstName { get { return m_firstName; } } - + /// /// Last name of the agent/avatar represented by the client /// public string LastName { get { return m_lastName; } } - + /// /// Full name of the client (first name and last name) /// public string Name { get { return FirstName + " " + LastName; } } - + public uint CircuitCode { get { return m_circuitCode; } } public int MoneyBalance { get { return m_moneyBalance; } } public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } } @@ -440,7 +439,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); m_fullUpdateDataBlocksBuilder = new List(); m_killRecord = new HashSet(); -// m_attachmentsSent = new HashSet(); +// m_attachmentsSent = new HashSet(); m_assetService = m_scene.RequestModuleInterface(); m_GroupsModule = scene.RequestModuleInterface(); @@ -654,7 +653,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Make sure that we see any exception caused by the asynchronous operation. m_log.Error( string.Format("[LLCLIENTVIEW]: Caught exception while processing {0}", packetObject.Pack), e); - } + } } #endregion Packet Handling @@ -865,7 +864,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP foreach (GroupActiveProposals Proposal in Proposals) { GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket(); - + GAPIRP.AgentData.AgentID = AgentId; GAPIRP.AgentData.GroupID = groupID; GAPIRP.TransactionData.TransactionID = transactionID; @@ -889,7 +888,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (Proposals.Length == 0) { GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket(); - + GAPIRP.AgentData.AgentID = AgentId; GAPIRP.AgentData.GroupID = groupID; GAPIRP.TransactionData.TransactionID = transactionID; @@ -944,7 +943,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (Votes.Length == 0) { GroupVoteHistoryItemReplyPacket GVHIRP = new GroupVoteHistoryItemReplyPacket(); - + GVHIRP.AgentData.AgentID = AgentId; GVHIRP.AgentData.GroupID = groupID; GVHIRP.TransactionData.TransactionID = transactionID; @@ -968,7 +967,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(GVHIRP, ThrottleOutPacketType.Task); } } - + public void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt) { GroupAccountDetailsReplyPacket GADRP = new GroupAccountDetailsReplyPacket(); @@ -987,13 +986,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP GADRP.HistoryData[0] = History; OutPacket(GADRP, ThrottleOutPacketType.Task); } - + public void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier) { GroupAccountSummaryReplyPacket GASRP = (GroupAccountSummaryReplyPacket)PacketPool.Instance.GetPacket( PacketType.GroupAccountSummaryReply); - + GASRP.AgentData = new GroupAccountSummaryReplyPacket.AgentDataBlock(); GASRP.AgentData.AgentID = sender.AgentId; GASRP.AgentData.GroupID = groupID; @@ -1020,13 +1019,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP GASRP.MoneyData.LightTaxEstimate = 0; OutPacket(GASRP, ThrottleOutPacketType.Task); } - + public void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt) { GroupAccountTransactionsReplyPacket GATRP = (GroupAccountTransactionsReplyPacket)PacketPool.Instance.GetPacket( PacketType.GroupAccountTransactionsReply); - + GATRP.AgentData = new GroupAccountTransactionsReplyPacket.AgentDataBlock(); GATRP.AgentData.AgentID = sender.AgentId; GATRP.AgentData.GroupID = groupID; @@ -1510,7 +1509,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public void SendKillObject(ulong regionHandle, uint localID) { // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle); - + KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); // TODO: don't create new blocks if recycling an old packet kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; @@ -3469,9 +3468,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence); OutPacket(objupdate, ThrottleOutPacketType.Task); - + // We need to record the avatar local id since the root prim of an attachment points to this. -// m_attachmentsSent.Add(avatar.LocalId); +// m_attachmentsSent.Add(avatar.LocalId); } public void SendCoarseLocationUpdate(List users, List CoarseLocations) @@ -3519,7 +3518,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Primitive Packet/Data Sending Methods /// - /// Generate one of the object update packets based on PrimUpdateFlags + /// Generate one of the object update packets based on PrimUpdateFlags /// and broadcast the packet to clients /// public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) @@ -3527,7 +3526,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP double priority = m_prioritizer.GetUpdatePriority(this, entity); lock (m_entityUpdates.SyncRoot) - m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId); + m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId); } private void ProcessEntityUpdates(int maxUpdates) @@ -3544,20 +3543,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP EntityUpdate update; while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) { - // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client + // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client // will never receive an update after a prim kill. Even then, keeping the kill record may be a good // safety measure. // - // Receiving updates after kills results in undeleteable prims that persist until relog and + // Receiving updates after kills results in undeleteable prims that persist until relog and // currently occurs because prims can be deleted before all queued updates are sent. if (m_killRecord.Contains(update.Entity.LocalId)) { // m_log.WarnFormat( -// "[CLIENT]: Preventing full update for prim with local id {0} after client for user {1} told it was deleted", -// update.Entity.LocalId, Name); +// "[CLIENT]: Preventing full update for prim with local id {0} after client for user {1} told it was deleted", +// update.Entity.LocalId, Name); continue; } - + if (update.Entity is SceneObjectPart) { SceneObjectPart part = (SceneObjectPart)update.Entity; @@ -3642,28 +3641,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP // string text = sop.Text; // if (text.IndexOf("\n") >= 0) // text = text.Remove(text.IndexOf("\n")); -// +// // if (m_attachmentsSent.Contains(sop.ParentID)) // { //// m_log.DebugFormat( //// "[CLIENT]: Sending full info about attached prim {0} text {1}", //// sop.LocalId, text); -// +// // objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock(sop, this.m_agentId)); -// +// // m_attachmentsSent.Add(sop.LocalId); // } // else // { // m_log.DebugFormat( -// "[CLIENT]: Requeueing full update of prim {0} text {1} since we haven't sent its parent {2} yet", +// "[CLIENT]: Requeueing full update of prim {0} text {1} since we haven't sent its parent {2} yet", // sop.LocalId, text, sop.ParentID); -// -// m_entityUpdates.Enqueue(double.MaxValue, update, sop.LocalId); +// +// m_entityUpdates.Enqueue(double.MaxValue, update, sop.LocalId); // } // } // else -// { +// { objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId)); // } } @@ -3977,7 +3976,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_propertiesPacketTimer.Stop(); return; } - + m_propertiesPacketTimer.Stop(); m_propertiesPacketTimer.Start(); } @@ -4208,7 +4207,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) { - ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage(); + ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage(); updateMessage.AABBMax = landData.AABBMax; updateMessage.AABBMin = landData.AABBMin; @@ -4252,7 +4251,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP updateMessage.PassHours = landData.PassHours; updateMessage.PassPrice = landData.PassPrice; updateMessage.PublicCount = 0; //TODO: Unimplemented - + updateMessage.RegionPushOverride = (regionFlags & (uint)RegionFlags.RestrictPushObject) > 0; updateMessage.RegionDenyAnonymous = (regionFlags & (uint)RegionFlags.DenyAnonymous) > 0; @@ -4282,13 +4281,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP updateMessage.UserLocation = landData.UserLocation; updateMessage.UserLookAt = landData.UserLookAt; - updateMessage.MediaType = landData.MediaType; - updateMessage.MediaDesc = landData.MediaDescription; - updateMessage.MediaWidth = landData.MediaWidth; - updateMessage.MediaHeight = landData.MediaHeight; - updateMessage.MediaLoop = landData.MediaLoop; - updateMessage.ObscureMusic = landData.ObscureMusic; - updateMessage.ObscureMedia = landData.ObscureMedia; + updateMessage.MediaType = landData.MediaType; + updateMessage.MediaDesc = landData.MediaDescription; + updateMessage.MediaWidth = landData.MediaWidth; + updateMessage.MediaHeight = landData.MediaHeight; + updateMessage.MediaLoop = landData.MediaLoop; + updateMessage.ObscureMusic = landData.ObscureMusic; + updateMessage.ObscureMedia = landData.ObscureMedia; try { @@ -4297,8 +4296,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { eq.ParcelProperties(updateMessage, this.AgentId); } else { - m_log.Warn("No EQ Interface when sending parcel data."); - } + m_log.Warn("No EQ Interface when sending parcel data."); + } } catch (Exception ex) { @@ -4671,9 +4670,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } // m_log.DebugFormat( -// "[LLCLIENTVIEW]: Constructing client update for part {0} {1} with flags {2}, localId {3}", +// "[LLCLIENTVIEW]: Constructing client update for part {0} {1} with flags {2}, localId {3}", // data.Name, update.FullID, flags, update.ID); - + update.UpdateFlags = (uint)flags; #endregion PrimFlags @@ -4806,11 +4805,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale); AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation); AddLocalPacketHandler(PacketType.ObjectFlagUpdate, HandleObjectFlagUpdate); - + // Handle ObjectImage (TextureEntry) updates synchronously, since when updating multiple prim faces at once, // some clients will send out a separate ObjectImage packet for each face AddLocalPacketHandler(PacketType.ObjectImage, HandleObjectImage, false); - + AddLocalPacketHandler(PacketType.ObjectGrab, HandleObjectGrab, false); AddLocalPacketHandler(PacketType.ObjectGrabUpdate, HandleObjectGrabUpdate, false); AddLocalPacketHandler(PacketType.ObjectDeGrab, HandleObjectDeGrab); @@ -5065,12 +5064,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP return false; } - + private bool HandleParcelGodMarkAsContent(IClientAPI client, Packet Packet) { ParcelGodMarkAsContentPacket ParcelGodMarkAsContent = (ParcelGodMarkAsContentPacket)Packet; - + ParcelGodMark ParcelGodMarkAsContentHandler = OnParcelGodMark; if (ParcelGodMarkAsContentHandler != null) { @@ -5081,11 +5080,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleFreezeUser(IClientAPI client, Packet Packet) { FreezeUserPacket FreezeUser = (FreezeUserPacket)Packet; - + FreezeUserUpdate FreezeUserHandler = OnParcelFreezeUser; if (FreezeUserHandler != null) { @@ -5097,12 +5096,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleEjectUser(IClientAPI client, Packet Packet) { EjectUserPacket EjectUser = (EjectUserPacket)Packet; - + EjectUserUpdate EjectUserHandler = OnParcelEjectUser; if (EjectUserHandler != null) { @@ -5114,12 +5113,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleParcelBuyPass(IClientAPI client, Packet Packet) { ParcelBuyPassPacket ParcelBuyPass = (ParcelBuyPassPacket)Packet; - + ParcelBuyPass ParcelBuyPassHandler = OnParcelBuyPass; if (ParcelBuyPassHandler != null) { @@ -5130,7 +5129,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleParcelBuyRequest(IClientAPI sender, Packet Pack) { ParcelBuyPacket parcel = (ParcelBuyPacket)Pack; @@ -5352,7 +5351,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket)Pack; //m_log.DebugFormat("[CLIENT]: Received ScriptDialogReply from {0}", rdialog.Data.ObjectID); - + #region Packet Session and User Check if (m_checkPackets) { @@ -5498,12 +5497,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return true; } - + private bool HandleFindAgent(IClientAPI client, Packet Packet) { FindAgentPacket FindAgent = (FindAgentPacket)Packet; - + FindAgentUpdate FindAgentHandler = OnFindAgent; if (FindAgentHandler != null) { @@ -5512,12 +5511,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleTrackAgent(IClientAPI client, Packet Packet) { TrackAgentPacket TrackAgent = (TrackAgentPacket)Packet; - + TrackAgentUpdate TrackAgentHandler = OnTrackAgent; if (TrackAgentHandler != null) { @@ -5528,7 +5527,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandlerRezObject(IClientAPI sender, Packet Pack) { RezObjectPacket rezPacket = (RezObjectPacket)Pack; @@ -7184,19 +7183,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP UUID requestID = new UUID(transfer.TransferInfo.Params, 80); // m_log.DebugFormat( -// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}", +// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}", // requestID, itemID, taskID, Name); - + if (!(((Scene)m_scene).Permissions.BypassPermissions())) { if (taskID != UUID.Zero) // Prim { SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); - + if (part == null) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist", + "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist", Name, requestID, itemID, taskID); return true; } @@ -7205,11 +7204,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (tii == null) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist", - Name, requestID, itemID, taskID); + "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist", + Name, requestID, itemID, taskID); return true; - } - + } + if (tii.Type == (int)AssetType.LSLText) { if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId)) @@ -7228,41 +7227,41 @@ namespace OpenSim.Region.ClientStack.LindenUDP { m_log.WarnFormat( "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}", - Name, requestID, itemID, taskID, part.OwnerID); + Name, requestID, itemID, taskID, part.OwnerID); return true; } - + if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set", - Name, requestID, itemID, taskID); + "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set", + Name, requestID, itemID, taskID); return true; } - + if (tii.OwnerID != AgentId) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}", - Name, requestID, itemID, taskID, tii.OwnerID); + "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}", + Name, requestID, itemID, taskID, tii.OwnerID); return true; } - + if (( - tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) + tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer", - Name, requestID, itemID, taskID); + "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer", + Name, requestID, itemID, taskID); return true; } - + if (tii.AssetID != requestID) { m_log.WarnFormat( - "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}", - Name, requestID, itemID, taskID, tii.AssetID); + "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}", + Name, requestID, itemID, taskID, tii.AssetID); return true; } } @@ -7866,7 +7865,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP newTaskItem, updatetask.UpdateData.LocalID); } } - } + } return true; } @@ -8861,7 +8860,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP // return true; } - + private bool HandleRequestRegionInfo(IClientAPI sender, Packet Pack) { RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData; @@ -8882,7 +8881,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return true; } - + private bool HandleEstateCovenantRequest(IClientAPI sender, Packet Pack) { @@ -8919,7 +8918,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP return true; } - + private bool HandleGodUpdateRegionInfoUpdate(IClientAPI client, Packet Packet) { GodUpdateRegionInfoPacket GodUpdateRegionInfo = @@ -8939,7 +8938,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleSimWideDeletes(IClientAPI client, Packet Packet) { SimWideDeletesPacket SimWideDeletesRequest = @@ -8952,7 +8951,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGodlikeMessage(IClientAPI client, Packet Packet) { GodlikeMessagePacket GodlikeMessage = @@ -8969,7 +8968,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleSaveStatePacket(IClientAPI client, Packet Packet) { StateSavePacket SaveStateMessage = @@ -8982,7 +8981,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGodKickUser(IClientAPI sender, Packet Pack) { GodKickUserPacket gkupack = (GodKickUserPacket)Pack; @@ -9120,7 +9119,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return true; } - + #endregion Economy/Transaction Packets #region Script Packets @@ -9333,7 +9332,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return true; } - + private bool HandleUpdateMuteListEntry(IClientAPI client, Packet Packet) { UpdateMuteListEntryPacket UpdateMuteListEntry = @@ -9349,7 +9348,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleRemoveMuteListEntry(IClientAPI client, Packet Packet) { RemoveMuteListEntryPacket RemoveMuteListEntry = @@ -9365,7 +9364,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleUserReport(IClientAPI client, Packet Packet) { UserReportPacket UserReport = @@ -9390,7 +9389,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleSendPostcard(IClientAPI client, Packet packet) { // SendPostcardPacket SendPostcard = @@ -9672,7 +9671,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP return true; } - + private bool HandleGroupVoteHistoryRequest(IClientAPI client, Packet Packet) { GroupVoteHistoryRequestPacket GroupVoteHistoryRequest = @@ -9685,7 +9684,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGroupActiveProposalsRequest(IClientAPI client, Packet Packet) { GroupActiveProposalsRequestPacket GroupActiveProposalsRequest = @@ -9698,7 +9697,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGroupAccountDetailsRequest(IClientAPI client, Packet Packet) { GroupAccountDetailsRequestPacket GroupAccountDetailsRequest = @@ -9711,7 +9710,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGroupAccountSummaryRequest(IClientAPI client, Packet Packet) { GroupAccountSummaryRequestPacket GroupAccountSummaryRequest = @@ -9724,7 +9723,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGroupTransactionsDetailsRequest(IClientAPI client, Packet Packet) { GroupAccountTransactionsRequestPacket GroupAccountTransactionsRequest = @@ -9737,7 +9736,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } return false; } - + private bool HandleGroupTitlesRequest(IClientAPI sender, Packet Pack) { GroupTitlesRequestPacket groupTitlesRequest = @@ -11185,26 +11184,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (m_debugPacketLevel > 0) { bool outputPacket = true; - - if (m_debugPacketLevel <= 255 + + if (m_debugPacketLevel <= 255 && (packet.Type == PacketType.SimStats || packet.Type == PacketType.SimulatorViewerTimeMessage)) outputPacket = false; - - if (m_debugPacketLevel <= 200 - && - (packet.Type == PacketType.ImagePacket + + if (m_debugPacketLevel <= 200 + && (packet.Type == PacketType.ImagePacket || packet.Type == PacketType.ImageData || packet.Type == PacketType.LayerData - || packet.Type == PacketType.CoarseLocationUpdate)) + || packet.Type == PacketType.CoarseLocationUpdate)) outputPacket = false; - + if (m_debugPacketLevel <= 100 && (packet.Type == PacketType.AvatarAnimation || packet.Type == PacketType.ViewerEffect)) - outputPacket = false; - + outputPacket = false; + if (outputPacket) m_log.DebugFormat("[CLIENT]: Packet OUT {0}", packet.Type); } - + m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting); } @@ -11279,16 +11277,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (m_debugPacketLevel > 0) { bool outputPacket = true; - + if (m_debugPacketLevel <= 255 && packet.Type == PacketType.AgentUpdate) outputPacket = false; - + if (m_debugPacketLevel <= 200 && packet.Type == PacketType.RequestImage) outputPacket = false; - + if (m_debugPacketLevel <= 100 && (packet.Type == PacketType.ViewerEffect || packet.Type == PacketType.AgentAnimation)) outputPacket = false; - + if (outputPacket) m_log.DebugFormat("[CLIENT]: Packet IN {0}", packet.Type); } @@ -11551,12 +11549,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP UUID requestID = UUID.Zero; byte source = (byte)SourceType.Asset; - - if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) + + if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) { requestID = new UUID(transferRequest.TransferInfo.Params, 0); } - else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) + else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) { requestID = new UUID(transferRequest.TransferInfo.Params, 80); source = (byte)SourceType.SimInventoryItem; @@ -11802,7 +11800,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public PacketMethod method; public bool Async; } - + public class AsyncPacketProcess { public bool result = false; @@ -11871,8 +11869,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName); dialog.Data.LastName = Util.StringToBytes256(ownerLastName); dialog.Data.Message = Util.StringToBytes256(message); - - + ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[1]; buttons[0] = new ScriptDialogPacket.ButtonsBlock(); buttons[0].ButtonLabel = Util.StringToBytes256("!!llTextBox!!"); @@ -11886,7 +11883,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { ScenePresence presence = p as ScenePresence; // It turns out to get the agent to stop flying, you have to feed it stop flying velocities - // There's no explicit message to send the client to tell it to stop flying.. it relies on the + // There's no explicit message to send the client to tell it to stop flying.. it relies on the // velocity, collision plane and avatar height // Add 1/6 the avatar's height to it's position so it doesn't shoot into the air @@ -11903,7 +11900,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP // attach a suitable collision plane regardless of the actual situation to force the LLClient to land. // Collision plane below the avatar's position a 6th of the avatar's height is suitable. - // Mind you, that this method doesn't get called if the avatar's velocity magnitude is greater then a + // Mind you, that this method doesn't get called if the avatar's velocity magnitude is greater then a // certain amount.. because the LLClient wouldn't land in that situation anyway. // why are we still testing for this really old height value default??? diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 7270304a2d..5604f490f2 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -48,8 +48,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments protected Scene m_scene = null; - public string Name { get { return "Attachments Module"; } } - public Type ReplaceableInterface { get { return null; } } + public string Name { get { return "Attachments Module"; } } + public Type ReplaceableInterface { get { return null; } } public void Initialise(IConfigSource source) {} @@ -80,7 +80,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachmentsFromInventory; client.OnObjectAttach += AttachObject; client.OnObjectDetach += DetachObject; - client.OnDetachAttachmentIntoInv += ShowDetachInUserInventory; + client.OnDetachAttachmentIntoInv += ShowDetachInUserInventory; } public void UnsubscribeFromClientEvents(IClientAPI client) @@ -89,7 +89,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachmentsFromInventory; client.OnObjectAttach -= AttachObject; client.OnObjectDetach -= DetachObject; - client.OnDetachAttachmentIntoInv -= ShowDetachInUserInventory; + client.OnDetachAttachmentIntoInv -= ShowDetachInUserInventory; } /// @@ -173,12 +173,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments UUID itemID = UUID.Zero; if (sp != null) { - foreach(SceneObjectGroup grp in sp.GetAttachments(AttachmentPt)) + foreach (SceneObjectGroup grp in sp.GetAttachments(AttachmentPt)) { itemID = grp.GetFromItemID(); if (itemID != UUID.Zero) DetachSingleAttachmentToInv(itemID, remoteClient); - } + } } if (group.GetFromItemID() == UUID.Zero) @@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments public UUID RezSingleAttachmentFromInventory( IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus) - { + { SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt); if (updateInventoryStatus) @@ -241,8 +241,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments if (null == att) return UUID.Zero; else - return att.UUID; - } + return att.UUID; + } protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( IClientAPI remoteClient, UUID itemID, uint AttachmentPt) @@ -298,7 +298,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } return null; - } + } public UUID SetAttachmentInventoryStatus( SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) @@ -473,7 +473,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments sog.RootPart.IsAttachment = false; sog.AbsolutePosition = sog.RootPart.AttachedPos; UpdateKnownItem(client, sog, sog.GetFromItemID(), sog.OwnerID); - sog.SetAttachmentPoint(attachmentPoint); + sog.SetAttachmentPoint(attachmentPoint); } /// @@ -600,7 +600,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // In case it is later dropped again, don't let // it get cleaned up so.RootPart.RemFlag(PrimFlags.TemporaryOnRez); - so.HasGroupChanged = false; + so.HasGroupChanged = false; } } } diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index 032e55a369..25322a17c0 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs @@ -132,7 +132,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule try { deadAvatar.ControllingClient.SendAgentAlertMessage(deadAvatarMessage, true); - if(killingAvatar != null) + if (killingAvatar != null) killingAvatar.ControllingClient.SendAlertMessage("You fragged " + deadAvatar.Firstname + " " + deadAvatar.Lastname); } catch (InvalidOperationException) @@ -143,7 +143,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule } private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID) - { + { try { ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index 4b30b0d9ee..5ec64d5141 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs @@ -58,13 +58,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods public void SubscribeToClientEvents(IClientAPI client) { client.OnGodKickUser += KickUser; - client.OnRequestGodlikePowers += RequestGodlikePowers; - } + client.OnRequestGodlikePowers += RequestGodlikePowers; + } public void UnsubscribeFromClientEvents(IClientAPI client) { client.OnGodKickUser -= KickUser; - client.OnRequestGodlikePowers -= RequestGodlikePowers; + client.OnRequestGodlikePowers -= RequestGodlikePowers; } public void RequestGodlikePowers( diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index 13bae2eac3..43bbf0d5ad 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs @@ -137,7 +137,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage { if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) - { + { // m_log.DebugFormat( // "[INSTANT MESSAGE]: Looking for root agent {0} in {1}", // toAgentID.ToString(), scene.RegionInfo.RegionName); diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index 52342ec357..c1df827069 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -179,14 +179,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver m_log.DebugFormat( "[INVENTORY ARCHIVER]: Successfully loaded {0} assets with {1} failures", successfulAssetRestores, failedAssetRestores); - m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", successfulItemRestores); + m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", successfulItemRestores); return loadedNodes; } finally { m_loadStream.Close(); - } + } } public void Close() @@ -201,7 +201,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// The item archive path to replicate /// The root folder for the inventory load /// - /// The folders that we have resolved so far for a given archive path. + /// The folders that we have resolved so far for a given archive path. /// This method will add more folders if necessary /// /// @@ -246,17 +246,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// The root folder for the inventory load /// /// - /// The folders that we have resolved so far for a given archive path. + /// The folders that we have resolved so far for a given archive path. /// /// /// The folder in the user's inventory that matches best the archive path given. If no such folder was found /// then the passed in root destination folder is returned. - /// + /// protected InventoryFolderBase ResolveDestinationFolder( - InventoryFolderBase rootDestFolder, - ref string archivePath, + InventoryFolderBase rootDestFolder, + ref string archivePath, Dictionary resolvedFolders) - { + { // string originalArchivePath = archivePath; while (archivePath.Length > 0) @@ -370,7 +370,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver if (0 == i) loadedNodes.Add(destFolder); - } + } } /// diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 9908018d25..bae5a7a289 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs @@ -119,7 +119,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver protected void ReceivedAllAssets(ICollection assetsFoundUuids, ICollection assetsNotFoundUuids) { Exception reportedException = null; - bool succeeded = true; + bool succeeded = true; try { @@ -136,7 +136,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver finally { m_saveStream.Close(); - } + } m_module.TriggerInventoryArchiveSaved( m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); @@ -270,7 +270,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver { // We couldn't find the path indicated string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath); - Exception e = new InventoryArchiverException(errorMessage); + Exception e = new InventoryArchiverException(errorMessage); m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e); throw e; } @@ -283,7 +283,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver "[INVENTORY ARCHIVER]: Found folder {0} {1} at {2}", inventoryFolder.Name, inventoryFolder.ID, - m_invPath == String.Empty ? InventoryFolderImpl.PATH_DELIMITER : m_invPath ); + m_invPath == String.Empty ? InventoryFolderImpl.PATH_DELIMITER : m_invPath); //recurse through all dirs getting dirs and files SaveInvFolder(inventoryFolder, ArchiveConstants.INVENTORY_PATH, !saveFolderContentsOnly); @@ -301,7 +301,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver //SaveUsers(); new AssetsRequest( - new AssetsArchiver(m_archiveWriter), m_assetUuids, m_scene.AssetService, ReceivedAllAssets).Execute(); + new AssetsArchiver(m_archiveWriter), m_assetUuids, m_scene.AssetService, ReceivedAllAssets).Execute(); } catch (Exception) { diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs index e07e2ca689..5fd1a7ee82 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverException.cs @@ -33,7 +33,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// Signals an inventory archiving problem /// public class InventoryArchiverException : Exception - { + { public InventoryArchiverException(string message) : base(message) {} public InventoryArchiverException(string message, Exception e) : base(message, e) {} } diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index f03f2a1514..2eaca499b0 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs @@ -91,12 +91,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver scene.AddCommand( this, "load iar", - "load iar []", + "load iar []", //"load iar [--merge] []", "Load user inventory archive (IAR).", //"--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones" //+ " is user's first name." + Environment.NewLine - " is user's first name." + Environment.NewLine + " is user's first name." + Environment.NewLine + " is user's last name." + Environment.NewLine + " is the path inside the user's inventory where the IAR should be loaded." + Environment.NewLine + " is the user's password." + Environment.NewLine @@ -241,7 +241,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver if (CheckPresence(userInfo.PrincipalID)) { InventoryArchiveReadRequest request; - bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); + bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); try { @@ -286,10 +286,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver if (CheckPresence(userInfo.PrincipalID)) { InventoryArchiveReadRequest request; - bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); + bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); try - { + { request = new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath, merge); } catch (EntryPointNotFoundException e) @@ -325,20 +325,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver protected void HandleLoadInvConsoleCommand(string module, string[] cmdparams) { try - { - m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME."); - - Dictionary options = new Dictionary(); + { + m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME."); + + Dictionary options = new Dictionary(); OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); List mainParams = optionSet.Parse(cmdparams); - + if (mainParams.Count < 6) { m_log.Error( "[INVENTORY ARCHIVER]: usage is load iar [--merge] []"); return; - } + } string firstName = mainParams[2]; string lastName = mainParams[3]; @@ -353,7 +353,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) m_log.InfoFormat( "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", - loadPath, firstName, lastName); + loadPath, firstName, lastName); } catch (InventoryArchiverException e) { @@ -390,7 +390,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}", savePath, invPath, firstName, lastName); - ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, new Dictionary()); + ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, new Dictionary()); } catch (InventoryArchiverException e) { @@ -398,7 +398,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver } lock (m_pendingConsoleSaves) - m_pendingConsoleSaves.Add(id); + m_pendingConsoleSaves.Add(id); } private void SaveInvConsoleCommandCompleted( diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index d66a1d0640..938886b2d3 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs @@ -58,18 +58,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests /// /// Stream of data representing a common IAR that can be reused in load tests. /// - protected MemoryStream m_iarStream; + protected MemoryStream m_iarStream; protected UserAccount m_ua1 = new UserAccount { PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000555"), FirstName = "Mr", - LastName = "Tiddles" }; + LastName = "Tiddles" }; protected UserAccount m_ua2 = new UserAccount { PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000666"), FirstName = "Lord", - LastName = "Lucan" }; + LastName = "Lucan" }; string m_item1Name = "b.lsl"; private void SaveCompleted( @@ -86,7 +86,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests } protected void ConstructDefaultIarForTestLoad() - { + { string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(m_item1Name, UUID.Random()); MemoryStream archiveWriteStream = new MemoryStream(); @@ -104,7 +104,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests string item1FileName = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); - tar.Close(); + tar.Close(); m_iarStream = new MemoryStream(archiveWriteStream.ToArray()); } @@ -341,7 +341,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests // Assert.That(gotObject2File, Is.True, "No object2 file in archive"); // TODO: Test presence of more files and contents of files. - } + } /// /// Test that things work when the load path specified starts with a slash @@ -349,22 +349,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests [Test] public void TestLoadIarPathStartsWithSlash() { - TestHelper.InMethod(); + TestHelper.InMethod(); // log4net.Config.XmlConfigurator.Configure(); SerialiserModule serialiserModule = new SerialiserModule(); - InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); - Scene scene = SceneSetupHelpers.SetupScene("inventory"); + InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); + Scene scene = SceneSetupHelpers.SetupScene("inventory"); SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); - UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "password"); + UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "password"); archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/Objects", "password", m_iarStream); InventoryItemBase foundItem1 = InventoryArchiveUtils.FindItemByPath( scene.InventoryService, m_ua1.PrincipalID, "/Objects/" + m_item1Name); - Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1 in TestLoadIarFolderStartsWithSlash()"); + Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1 in TestLoadIarFolderStartsWithSlash()"); } /// @@ -376,7 +376,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests [Test] public void TestLoadIarV0_1ExistingUsers() { - TestHelper.InMethod(); + TestHelper.InMethod(); //log4net.Config.XmlConfigurator.Configure(); SerialiserModule serialiserModule = new SerialiserModule(); @@ -386,9 +386,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests Scene scene = SceneSetupHelpers.SetupScene("inventory"); SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); - - UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "meowfood"); - UserProfileTestUtils.CreateUserWithInventory(scene, m_ua2, "hampshire"); + + UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "meowfood"); + UserProfileTestUtils.CreateUserWithInventory(scene, m_ua2, "hampshire"); archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/", "meowfood", m_iarStream); @@ -450,7 +450,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests string userFirstName = "Jock"; string userLastName = "Stirrup"; UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); - UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, "meowfood"); + UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, "meowfood"); // Create asset SceneObjectGroup object1; @@ -524,7 +524,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests [Test] public void TestLoadIarV0_1AbsentUsers() { - TestHelper.InMethod(); + TestHelper.InMethod(); //log4net.Config.XmlConfigurator.Configure(); string userFirstName = "Charlie"; @@ -562,7 +562,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests Scene scene = SceneSetupHelpers.SetupScene("inventory"); SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); - UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userUuid, "meowfood"); + UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userUuid, "meowfood"); archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream); @@ -680,8 +680,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests string folder2aArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2aName, UUID.Random()); string folder2bArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2bName, UUID.Random()); - string iarPath1 = string.Join("", new string[] { folder1ArchiveName, folder2aArchiveName }); - string iarPath2 = string.Join("", new string[] { folder1ArchiveName, folder2bArchiveName }); + string iarPath1 = string.Join("", new string[] { folder1ArchiveName, folder2aArchiveName }); + string iarPath2 = string.Join("", new string[] { folder1ArchiveName, folder2bArchiveName }); { // Test replication of path1 @@ -694,7 +694,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1Name); Assert.That(folder1Candidates.Count, Is.EqualTo(1)); - InventoryFolderBase folder1 = folder1Candidates[0]; + InventoryFolderBase folder1 = folder1Candidates[0]; List folder2aCandidates = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2aName); Assert.That(folder2aCandidates.Count, Is.EqualTo(1)); @@ -715,11 +715,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests List folder2aCandidates = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2aName); - Assert.That(folder2aCandidates.Count, Is.EqualTo(1)); + Assert.That(folder2aCandidates.Count, Is.EqualTo(1)); List folder2bCandidates = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2bName); - Assert.That(folder2bCandidates.Count, Is.EqualTo(1)); + Assert.That(folder2bCandidates.Count, Is.EqualTo(1)); } } @@ -741,7 +741,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests InventoryFolderBase folder1 = UserInventoryTestUtils.CreateInventoryFolder( - scene.InventoryService, ua1.PrincipalID, folder1ExistingName); + scene.InventoryService, ua1.PrincipalID, folder1ExistingName); string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1ExistingName, UUID.Random()); string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random()); @@ -772,7 +772,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests List folder2PostCandidates = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1Post, "b"); Assert.That(folder2PostCandidates.Count, Is.EqualTo(1)); - } + } /// /// Test replication of a partly existing archive path to the user's inventory. This should create @@ -792,7 +792,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests InventoryFolderBase folder1 = UserInventoryTestUtils.CreateInventoryFolder( - scene.InventoryService, ua1.PrincipalID, folder1ExistingName); + scene.InventoryService, ua1.PrincipalID, folder1ExistingName); string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1ExistingName, UUID.Random()); string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random()); @@ -812,6 +812,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests List folder2PostCandidates = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1PostCandidates[0], "b"); Assert.That(folder2PostCandidates.Count, Is.EqualTo(1)); - } + } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs index 35b70de8ab..05fe3eee04 100644 --- a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs @@ -138,7 +138,7 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue { if (!queues.ContainsKey(agentId)) { - /* + /* m_log.DebugFormat( "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", agentId, m_scene.RegionInfo.RegionName); @@ -701,7 +701,7 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue public void ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage, UUID avatarID) { - OSD item = EventQueueHelper.ParcelProperties(parcelPropertiesMessage); + OSD item = EventQueueHelper.ParcelProperties(parcelPropertiesMessage); Enqueue(item, avatarID); } diff --git a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs index b62df18c10..0d7d16a2ba 100644 --- a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs +++ b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueHelper.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue } // private static byte[] uintToByteArray(uint uIntValue) -// { +// { // byte[] result = new byte[4]; // Utils.UIntToBytesBig(uIntValue, result, 0); // return result; @@ -386,14 +386,14 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue return placesReply; } - public static OSD ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage) - { - OSDMap message = new OSDMap(); - message.Add("message", OSD.FromString("ParcelProperties")); - OSD message_body = parcelPropertiesMessage.Serialize(); - message.Add("body", message_body); - return message; - } + public static OSD ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage) + { + OSDMap message = new OSDMap(); + message.Add("message", OSD.FromString("ParcelProperties")); + OSD message_body = parcelPropertiesMessage.Serialize(); + message.Add("body", message_body); + return message; + } } } diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index d87f7f1d04..4c4eeff0e8 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -594,7 +594,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess rootPart.Name = item.Name; rootPart.Description = item.Description; - List partList = null; + List partList = null; lock (group.Children) partList = new List(group.Children.Values); diff --git a/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs b/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs index b75a7001b8..a75ff6234e 100644 --- a/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Statistics/Logging/BinaryLoggingModule.cs @@ -49,8 +49,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments protected bool m_collectStats; protected Scene m_scene = null; - public string Name { get { return "Binary Statistics Logging Module"; } } - public Type ReplaceableInterface { get { return null; } } + public string Name { get { return "Binary Statistics Logging Module"; } } + public Type ReplaceableInterface { get { return null; } } public void Initialise(IConfigSource source) { @@ -79,7 +79,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments catch { // if it doesn't work, we don't collect anything - } + } } public void AddRegion(Scene scene) @@ -94,12 +94,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments public void RegionLoaded(Scene scene) { if (m_collectStats) - m_scene.StatsReporter.OnSendStatsResult += LogSimStats; + m_scene.StatsReporter.OnSendStatsResult += LogSimStats; } public void Close() { - } + } public class StatLogger { @@ -164,6 +164,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments } } return; - } + } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs index 4e2f6024cc..2322d7cb45 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs @@ -185,7 +185,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return folders[type]; } - m_log.WarnFormat("[INVENTORY CACHE]: Could not find folder for system type {0} for {1}", type, userID); + m_log.WarnFormat("[INVENTORY CACHE]: Could not find folder for system type {0} for {1}", type, userID); return null; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index cbd9e05de7..ab6be50ec6 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -220,7 +220,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { // m_log.DebugFormat( // "[LOCAL INVENTORY SERVICES CONNECTOR]: Adding inventory item {0} to user {1} folder {2}", -// item.Name, item.Owner, item.Folder); +// item.Name, item.Owner, item.Folder); return m_InventoryService.AddItem(item); } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index 4ab69474a1..34205e3df8 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -227,7 +227,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public bool AddItem(InventoryItemBase item) { if (item == null) - return false; + return false; return m_RemoteConnector.AddItem(item); } diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveHelpers.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveHelpers.cs index ddc3dd7644..c72acc332b 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveHelpers.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveHelpers.cs @@ -33,7 +33,7 @@ using OpenSim.Framework.Serialization; using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.CoreModules.World.Archiver -{ +{ /// /// Helper methods for archive manipulation /// @@ -50,7 +50,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver public static string CreateObjectFilename(SceneObjectGroup sog) { return ArchiveConstants.CreateOarObjectFilename(sog.Name, sog.UUID, sog.AbsolutePosition); - } + } /// /// Create the path used to store an object in an OpenSim Archive. @@ -62,7 +62,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver public static string CreateObjectPath(SceneObjectGroup sog) { return ArchiveConstants.CreateOarObjectPath(sog.Name, sog.UUID, sog.AbsolutePosition); - } + } /// /// Resolve path to a working FileStream @@ -123,6 +123,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver // return new BufferedStream(file, (int) response.ContentLength); return new BufferedStream(file, 1000000); - } + } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index ea71fd9f59..634685ace0 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -72,12 +72,12 @@ namespace OpenSim.Region.CoreModules.World.Land #pragma warning restore 0429 /// - /// Local land ids at specified region co-ordinates (region size / 4) + /// Local land ids at specified region co-ordinates (region size / 4) /// private readonly int[,] m_landIDList = new int[landArrayMax, landArrayMax]; /// - /// Land objects keyed by local id + /// Land objects keyed by local id /// private readonly Dictionary m_landList = new Dictionary(); @@ -92,8 +92,8 @@ namespace OpenSim.Region.CoreModules.World.Land #region INonSharedRegionModule Members - public Type ReplaceableInterface - { + public Type ReplaceableInterface + { get { return null; } } @@ -192,7 +192,7 @@ namespace OpenSim.Region.CoreModules.World.Land Debug.WriteLine(string.Format("Stopping force position because {0} is close enough to position {1}", forcedPosition.Value, clientAvatar.AbsolutePosition)); forcedPosition = null; } - //if we are far away, teleport + //if we are far away, teleport else if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition.Value) > 3) { Debug.WriteLine(string.Format("Teleporting out because {0} is too far from avatar position {1}", forcedPosition.Value, clientAvatar.AbsolutePosition)); @@ -321,8 +321,6 @@ namespace OpenSim.Region.CoreModules.World.Land } } - - private void ForceAvatarToPosition(ScenePresence avatar, Vector3? position) { if (m_scene.Permissions.IsGod(avatar.UUID)) return; @@ -336,7 +334,6 @@ namespace OpenSim.Region.CoreModules.World.Land { avatar.ControllingClient.SendAlertMessage( "You are not allowed on this parcel because the land owner has restricted access."); - } public void EventManagerOnAvatarEnteringNewParcel(ScenePresence avatar, int localLandID, UUID regionID) @@ -448,7 +445,7 @@ namespace OpenSim.Region.CoreModules.World.Land if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT && clientAvatar.sentMessageAboutRestrictedParcelFlyingDown) { - EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.LandData.LocalID, + EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.LandData.LocalID, m_scene.RegionInfo.RegionID); //They are going under the safety line! if (!parcel.IsBannedFromLand(clientAvatar.UUID)) @@ -652,7 +649,7 @@ namespace OpenSim.Region.CoreModules.World.Land if (x_float > Constants.RegionSize || x_float <= 0 || y_float > Constants.RegionSize || y_float <= 0) return null; - + try { x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float) / 4.0)); @@ -667,7 +664,7 @@ namespace OpenSim.Region.CoreModules.World.Land { return null; } - + lock (m_landList) { // Corner case. If an autoreturn happens during sim startup @@ -687,7 +684,7 @@ namespace OpenSim.Region.CoreModules.World.Land // they happen every time at border crossings throw new Exception("Error: Parcel not found at point " + x + ", " + y); } - + lock (m_landIDList) { try @@ -741,7 +738,6 @@ namespace OpenSim.Region.CoreModules.World.Land public void EventManagerOnObjectBeingRemovedFromScene(SceneObjectGroup obj) { - lock (m_landList) { foreach (LandObject p in m_landList.Values) @@ -936,7 +932,7 @@ namespace OpenSim.Region.CoreModules.World.Land return; } } - + lock (m_landList) { foreach (ILandObject slaveLandObject in selectedLandObjects) @@ -1078,7 +1074,6 @@ namespace OpenSim.Region.CoreModules.World.Land temp.Add(currentParcel); } } - } } @@ -1121,7 +1116,7 @@ namespace OpenSim.Region.CoreModules.World.Land join(west, south, east, north, remote_client.AgentId); } - public void ClientOnParcelSelectObjects(int local_id, int request_type, + public void ClientOnParcelSelectObjects(int local_id, int request_type, List returnIDs, IClientAPI remote_client) { m_landList[local_id].SendForceObjectSelect(local_id, request_type, returnIDs, remote_client); @@ -1358,31 +1353,31 @@ namespace OpenSim.Region.CoreModules.World.Land { return RemoteParcelRequest(request, path, param, agentID, caps); })); - UUID parcelCapID = UUID.Random(); - caps.RegisterHandler("ParcelPropertiesUpdate", - new RestStreamHandler("POST", "/CAPS/" + parcelCapID, - delegate(string request, string path, string param, - OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - return ProcessPropertiesUpdate(request, path, param, agentID, caps); - })); + UUID parcelCapID = UUID.Random(); + caps.RegisterHandler("ParcelPropertiesUpdate", + new RestStreamHandler("POST", "/CAPS/" + parcelCapID, + delegate(string request, string path, string param, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + return ProcessPropertiesUpdate(request, path, param, agentID, caps); + })); } - private string ProcessPropertiesUpdate(string request, string path, string param, UUID agentID, Caps caps) - { - IClientAPI client; - if ( ! m_scene.TryGetClient(agentID, out client) ) { - m_log.WarnFormat("[LAND] unable to retrieve IClientAPI for {0}", agentID.ToString() ); - return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty()); - } - - ParcelPropertiesUpdateMessage properties = new ParcelPropertiesUpdateMessage(); - OpenMetaverse.StructuredData.OSDMap args = (OpenMetaverse.StructuredData.OSDMap) OSDParser.DeserializeLLSDXml(request); + private string ProcessPropertiesUpdate(string request, string path, string param, UUID agentID, Caps caps) + { + IClientAPI client; + if (! m_scene.TryGetClient(agentID, out client)) { + m_log.WarnFormat("[LAND] unable to retrieve IClientAPI for {0}", agentID.ToString()); + return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty()); + } - properties.Deserialize(args); - - LandUpdateArgs land_update = new LandUpdateArgs(); - int parcelID = properties.LocalID; - land_update.AuthBuyerID = properties.AuthBuyerID; + ParcelPropertiesUpdateMessage properties = new ParcelPropertiesUpdateMessage(); + OpenMetaverse.StructuredData.OSDMap args = (OpenMetaverse.StructuredData.OSDMap) OSDParser.DeserializeLLSDXml(request); + + properties.Deserialize(args); + + LandUpdateArgs land_update = new LandUpdateArgs(); + int parcelID = properties.LocalID; + land_update.AuthBuyerID = properties.AuthBuyerID; land_update.Category = properties.Category; land_update.Desc = properties.Desc; land_update.GroupID = properties.GroupID; @@ -1399,15 +1394,15 @@ namespace OpenSim.Region.CoreModules.World.Land land_update.SnapshotID = properties.SnapshotID; land_update.UserLocation = properties.UserLocation; land_update.UserLookAt = properties.UserLookAt; - land_update.MediaDescription = properties.MediaDesc; - land_update.MediaType = properties.MediaType; - land_update.MediaWidth = properties.MediaWidth; - land_update.MediaHeight = properties.MediaHeight; - land_update.MediaLoop = properties.MediaLoop; - land_update.ObscureMusic = properties.ObscureMusic; - land_update.ObscureMedia = properties.ObscureMedia; - - ILandObject land; + land_update.MediaDescription = properties.MediaDesc; + land_update.MediaType = properties.MediaType; + land_update.MediaWidth = properties.MediaWidth; + land_update.MediaHeight = properties.MediaHeight; + land_update.MediaLoop = properties.MediaLoop; + land_update.ObscureMusic = properties.ObscureMusic; + land_update.ObscureMedia = properties.ObscureMedia; + + ILandObject land; lock (m_landList) { m_landList.TryGetValue(parcelID, out land); @@ -1415,15 +1410,15 @@ namespace OpenSim.Region.CoreModules.World.Land if (land != null) { - land.UpdateLandProperties(land_update, client); + land.UpdateLandProperties(land_update, client); m_scene.EventManager.TriggerOnParcelPropertiesUpdateRequest(land_update, parcelID, client); - } + } else { - m_log.WarnFormat("[LAND] unable to find parcelID {0}", parcelID); - } + m_log.WarnFormat("[LAND] unable to find parcelID {0}", parcelID); + } return LLSDHelpers.SerialiseLLSDReply(new LLSDEmpty()); - } + } // we cheat here: As we don't have (and want) a grid-global parcel-store, we can't return the // "real" parcelID, because we wouldn't be able to map that to the region the parcel belongs to. // So, we create a "fake" parcelID by using the regionHandle (64 bit), and the local (integer) x @@ -1500,19 +1495,19 @@ namespace OpenSim.Region.CoreModules.World.Land if (parcelID == UUID.Zero) return; - ExtendedLandData data = - (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), - delegate(string id) + ExtendedLandData data = + (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), + delegate(string id) { UUID parcel = UUID.Zero; UUID.TryParse(id, out parcel); // assume we've got the parcelID we just computed in RemoteParcelRequest ExtendedLandData extLandData = new ExtendedLandData(); - Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle, + Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle, out extLandData.X, out extLandData.Y); m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", extLandData.RegionHandle, extLandData.X, extLandData.Y); - + // for this region or for somewhere else? if (extLandData.RegionHandle == m_scene.RegionInfo.RegionHandle) { diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 499b60ccdb..d87352f849 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -229,13 +229,13 @@ namespace OpenSim.Region.CoreModules.World.Land newData.SnapshotID = args.SnapshotID; newData.UserLocation = args.UserLocation; newData.UserLookAt = args.UserLookAt; - newData.MediaType = args.MediaType; - newData.MediaDescription = args.MediaDescription; - newData.MediaWidth = args.MediaWidth; - newData.MediaHeight = args.MediaHeight; - newData.MediaLoop = args.MediaLoop; - newData.ObscureMusic = args.ObscureMusic; - newData.ObscureMedia = args.ObscureMedia; + newData.MediaType = args.MediaType; + newData.MediaDescription = args.MediaDescription; + newData.MediaWidth = args.MediaWidth; + newData.MediaHeight = args.MediaHeight; + newData.MediaLoop = args.MediaLoop; + newData.ObscureMusic = args.ObscureMusic; + newData.ObscureMedia = args.ObscureMedia; m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData); diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index 82ad109a49..7c5d044347 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs @@ -54,11 +54,11 @@ namespace OpenSim.Region.CoreModules.Media.Moap { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MoapModule")] public class MoapModule : INonSharedRegionModule, IMoapModule - { + { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public string Name { get { return "MoapModule"; } } - public Type ReplaceableInterface { get { return null; } } + public string Name { get { return "MoapModule"; } } + public Type ReplaceableInterface { get { return null; } } /// /// Is this module enabled? @@ -78,17 +78,17 @@ namespace OpenSim.Region.CoreModules.Media.Moap /// /// Track the ObjectMedia capabilities given to users keyed by agent. Lock m_omCapUsers to manipulate. /// - protected Dictionary m_omCapUrls = new Dictionary(); + protected Dictionary m_omCapUrls = new Dictionary(); /// /// Track the ObjectMediaUpdate capabilities given to users keyed by path - /// + /// protected Dictionary m_omuCapUsers = new Dictionary(); /// /// Track the ObjectMediaUpdate capabilities given to users keyed by agent. Lock m_omuCapUsers to manipulate - /// - protected Dictionary m_omuCapUrls = new Dictionary(); + /// + protected Dictionary m_omuCapUrls = new Dictionary(); public void Initialise(IConfigSource configSource) { @@ -129,7 +129,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap m_scene.EventManager.OnRegisterCaps -= OnRegisterCaps; m_scene.EventManager.OnDeregisterCaps -= OnDeregisterCaps; m_scene.EventManager.OnSceneObjectPartCopy -= OnSceneObjectPartCopy; - } + } public void OnRegisterCaps(UUID agentID, Caps caps) { @@ -159,7 +159,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap caps.RegisterHandler( "ObjectMediaNavigate", new RestStreamHandler("POST", omuCapUrl, HandleObjectMediaNavigateMessage)); } - } + } public void OnDeregisterCaps(UUID agentID, Caps caps) { @@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap } protected void OnSceneObjectPartCopy(SceneObjectPart copy, SceneObjectPart original, bool userExposed) - { + { if (original.Shape.Media != null) { PrimitiveBaseShape.MediaList dupeMedia = new PrimitiveBaseShape.MediaList(); @@ -195,7 +195,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap } copy.Shape.Media = dupeMedia; - } + } } public MediaEntry GetMediaEntry(SceneObjectPart part, int face) @@ -211,9 +211,9 @@ namespace OpenSim.Region.CoreModules.Media.Moap me = null; } else - { + { lock (media) - me = media[face]; + me = media[face]; // TODO: Really need a proper copy constructor down in libopenmetaverse if (me != null) @@ -227,17 +227,17 @@ namespace OpenSim.Region.CoreModules.Media.Moap public void SetMediaEntry(SceneObjectPart part, int face, MediaEntry me) { - CheckFaceParam(part, face); + CheckFaceParam(part, face); if (null == part.Shape.Media) part.Shape.Media = new PrimitiveBaseShape.MediaList(new MediaEntry[part.GetNumberOfSides()]); - lock (part.Shape.Media) + lock (part.Shape.Media) part.Shape.Media[face] = me; - UpdateMediaUrl(part, UUID.Zero); + UpdateMediaUrl(part, UUID.Zero); part.ScheduleFullUpdate(); - part.TriggerScriptChangedEvent(Changed.MEDIA); + part.TriggerScriptChangedEvent(Changed.MEDIA); } public void ClearMediaEntry(SceneObjectPart part, int face) @@ -256,7 +256,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap /// protected string HandleObjectMediaMessage( string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { + { // m_log.DebugFormat("[MOAP]: Got ObjectMedia path [{0}], raw request [{1}]", path, request); OSDMap osd = (OSDMap)OSDParser.DeserializeLLSDXml(request); @@ -266,12 +266,12 @@ namespace OpenSim.Region.CoreModules.Media.Moap if (omm.Request is ObjectMediaRequest) return HandleObjectMediaRequest(omm.Request as ObjectMediaRequest); else if (omm.Request is ObjectMediaUpdate) - return HandleObjectMediaUpdate(path, omm.Request as ObjectMediaUpdate); + return HandleObjectMediaUpdate(path, omm.Request as ObjectMediaUpdate); throw new Exception( string.Format( "[MOAP]: ObjectMediaMessage has unrecognized ObjectMediaBlock of {0}", - omm.Request.GetType())); + omm.Request.GetType())); } /// @@ -279,7 +279,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap /// /// /// - protected string HandleObjectMediaRequest(ObjectMediaRequest omr) + protected string HandleObjectMediaRequest(ObjectMediaRequest omr) { UUID primId = omr.PrimID; @@ -318,7 +318,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap /// Path on which this request was made /// /param> /// - protected string HandleObjectMediaUpdate(string path, ObjectMediaUpdate omu) + protected string HandleObjectMediaUpdate(string path, ObjectMediaUpdate omu) { UUID primId = omu.PrimID; @@ -330,9 +330,9 @@ namespace OpenSim.Region.CoreModules.Media.Moap "[MOAP]: Received an UPDATE ObjectMediaRequest for prim {0} but this doesn't exist in region {1}", primId, m_scene.RegionInfo.RegionName); return string.Empty; - } + } -// m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", omu.FaceMedia.Length, primId); +// m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", omu.FaceMedia.Length, primId); // for (int i = 0; i < omu.FaceMedia.Length; i++) // { @@ -374,14 +374,14 @@ namespace OpenSim.Region.CoreModules.Media.Moap part.Shape.Textures = te; // m_log.DebugFormat( // "[MOAP]: Media flags for face {0} is {1}", -// i, part.Shape.Textures.FaceTextures[i].MediaFlags); +// i, part.Shape.Textures.FaceTextures[i].MediaFlags); } } } else - { + { // We need to go through the media textures one at a time to make sure that we have permission - // to change them + // to change them // FIXME: Race condition here since some other texture entry manipulator may overwrite/get // overwritten. Unfortunately, PrimitiveBaseShape does not allow us to change texture entry @@ -391,18 +391,18 @@ namespace OpenSim.Region.CoreModules.Media.Moap lock (media) { for (int i = 0; i < media.Count; i++) - { + { if (m_scene.Permissions.CanControlPrimMedia(agentId, part.UUID, i)) - { + { media[i] = omu.FaceMedia[i]; // When a face is cleared this is done by setting the MediaFlags in the TextureEntry via a normal // texture update, so we don't need to worry about clearing MediaFlags here. if (null == media[i]) - continue; + continue; Primitive.TextureEntryFace face = te.CreateFace((uint)i); - face.MediaFlags = true; + face.MediaFlags = true; // m_log.DebugFormat( // "[MOAP]: Media flags for face {0} is {1}", @@ -414,11 +414,11 @@ namespace OpenSim.Region.CoreModules.Media.Moap part.Shape.Textures = te; -// for (int i2 = 0; i2 < part.Shape.Textures.FaceTextures.Length; i2++) -// m_log.DebugFormat("[MOAP]: FaceTexture[{0}] is {1}", i2, part.Shape.Textures.FaceTextures[i2]); +// for (int i2 = 0; i2 < part.Shape.Textures.FaceTextures.Length; i2++) +// m_log.DebugFormat("[MOAP]: FaceTexture[{0}] is {1}", i2, part.Shape.Textures.FaceTextures[i2]); } - UpdateMediaUrl(part, agentId); + UpdateMediaUrl(part, agentId); // Arguably, we could avoid sending a full update to the avatar that just changed the texture. part.ScheduleFullUpdate(); @@ -439,16 +439,16 @@ namespace OpenSim.Region.CoreModules.Media.Moap /// protected string HandleObjectMediaNavigateMessage( string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { + { // m_log.DebugFormat("[MOAP]: Got ObjectMediaNavigate request [{0}]", request); OSDMap osd = (OSDMap)OSDParser.DeserializeLLSDXml(request); ObjectMediaNavigateMessage omn = new ObjectMediaNavigateMessage(); - omn.Deserialize(osd); + omn.Deserialize(osd); UUID primId = omn.PrimID; - SceneObjectPart part = m_scene.GetSceneObjectPart(primId); + SceneObjectPart part = m_scene.GetSceneObjectPart(primId); if (null == part) { @@ -456,12 +456,12 @@ namespace OpenSim.Region.CoreModules.Media.Moap "[MOAP]: Received an ObjectMediaNavigateMessage for prim {0} but this doesn't exist in region {1}", primId, m_scene.RegionInfo.RegionName); return string.Empty; - } + } UUID agentId = default(UUID); lock (m_omuCapUsers) - agentId = m_omuCapUsers[path]; + agentId = m_omuCapUsers[path]; if (!m_scene.Permissions.CanInteractWithPrimMedia(agentId, part.UUID, omn.Face)) return string.Empty; @@ -484,7 +484,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap return string.Empty; if (me.EnableWhiteList) - { + { if (!CheckUrlAgainstWhitelist(omn.URL, me.WhiteList)) { // m_log.DebugFormat( @@ -493,18 +493,18 @@ namespace OpenSim.Region.CoreModules.Media.Moap return string.Empty; } - } + } me.CurrentURL = omn.URL; UpdateMediaUrl(part, agentId); - part.ScheduleFullUpdate(); + part.ScheduleFullUpdate(); part.TriggerScriptChangedEvent(Changed.MEDIA); return OSDParser.SerializeLLSDXmlString(new OSD()); - } + } /// /// Check that the face number is valid for the given prim. @@ -519,7 +519,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap int maxFaces = part.GetNumberOfSides() - 1; if (face > maxFaces) throw new ArgumentException( - string.Format("Face argument was {0} but max is {1}", face, maxFaces)); + string.Format("Face argument was {0} but max is {1}", face, maxFaces)); } /// @@ -542,9 +542,9 @@ namespace OpenSim.Region.CoreModules.Media.Moap string rawVersion = part.MediaUrl.Substring(5, 10); int version = int.Parse(rawVersion); part.MediaUrl = string.Format("x-mv:{0:D10}/{1}", ++version, updateId); - } + } -// m_log.DebugFormat("[MOAP]: Storing media url [{0}] in prim {1} {2}", part.MediaUrl, part.Name, part.UUID); +// m_log.DebugFormat("[MOAP]: Storing media url [{0}] in prim {1} {2}", part.MediaUrl, part.Name, part.UUID); } /// @@ -554,7 +554,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap /// /// true if the url matches an entry on the whitelist, false otherwise protected bool CheckUrlAgainstWhitelist(string rawUrl, string[] whitelist) - { + { Uri url = new Uri(rawUrl); foreach (string origWlUrl in whitelist) @@ -575,7 +575,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap if (url.Host.Contains(wlUrl)) { // m_log.DebugFormat("[MOAP]: Whitelist URL {0} matches {1}", origWlUrl, rawUrl); - return true; + return true; } } else @@ -588,7 +588,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap return true; } } - } + } return false; } diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index 12750c5e2c..db50339fec 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -49,8 +49,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell protected Scene m_scene = null; protected IDialogModule m_dialogModule; - public string Name { get { return "Object BuySell Module"; } } - public Type ReplaceableInterface { get { return null; } } + public string Name { get { return "Object BuySell Module"; } } + public Type ReplaceableInterface { get { return null; } } public void Initialise(IConfigSource source) {} @@ -78,8 +78,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell public void SubscribeToClientEvents(IClientAPI client) { - client.OnObjectSaleInfo += ObjectSaleInfo; - } + client.OnObjectSaleInfo += ObjectSaleInfo; + } protected void ObjectSaleInfo( IClientAPI client, UUID agentID, UUID sessionID, uint localID, byte saleType, int salePrice) @@ -99,7 +99,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell part.ParentGroup.HasGroupChanged = true; part.GetProperties(client); - } + } public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType) { @@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell } else { - if (m_dialogModule != null) + if (m_dialogModule != null) m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); return false; } @@ -261,6 +261,6 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell } return true; - } + } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index bc54997a0a..573a22a377 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -397,13 +397,13 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_groupsModule = m_scene.RequestModuleInterface(); if (m_groupsModule == null) - m_log.Warn("[PERMISSIONS]: Groups module not found, group permissions will not work"); + m_log.Warn("[PERMISSIONS]: Groups module not found, group permissions will not work"); m_moapModule = m_scene.RequestModuleInterface(); // This log line will be commented out when no longer required for debugging // if (m_moapModule == null) -// m_log.Warn("[PERMISSIONS]: Media on a prim module not found, media on a prim permissions will not work"); +// m_log.Warn("[PERMISSIONS]: Media on a prim module not found, media on a prim permissions will not work"); } public void Close() @@ -1906,7 +1906,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions } private bool CanControlPrimMedia(UUID agentID, UUID primID, int face) - { + { // m_log.DebugFormat( // "[PERMISSONS]: Performing CanControlPrimMedia check with agentID {0}, primID {1}, face {2}", // agentID, primID, face); @@ -1918,7 +1918,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions if (null == part) return false; - MediaEntry me = m_moapModule.GetMediaEntry(part, face); + MediaEntry me = m_moapModule.GetMediaEntry(part, face); // If there is no existing media entry then it can be controlled (in this context, created). if (null == me) @@ -1929,7 +1929,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions // agentID, primID, face, me.ControlPermissions); return GenericPrimMediaPermission(part, agentID, me.ControlPermissions); - } + } private bool CanInteractWithPrimMedia(UUID agentID, UUID primID, int face) { @@ -1952,15 +1952,15 @@ namespace OpenSim.Region.CoreModules.World.Permissions // m_log.DebugFormat( // "[PERMISSIONS]: Checking CanInteractWithPrimMedia for {0} on {1} face {2} with interact permissions {3}", -// agentID, primID, face, me.InteractPermissions); +// agentID, primID, face, me.InteractPermissions); return GenericPrimMediaPermission(part, agentID, me.InteractPermissions); - } + } private bool GenericPrimMediaPermission(SceneObjectPart part, UUID agentID, MediaPermission perms) { // if (IsAdministrator(agentID)) -// return true; +// return true; if ((perms & MediaPermission.Anyone) == MediaPermission.Anyone) return true; @@ -1969,15 +1969,15 @@ namespace OpenSim.Region.CoreModules.World.Permissions { if (agentID == part.OwnerID) return true; - } + } if ((perms & MediaPermission.Group) == MediaPermission.Group) { if (IsGroupMember(part.GroupID, agentID, 0)) return true; - } + } - return false; + return false; } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index cb801111f9..25d73c2c0f 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -814,7 +814,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain { //m_log.Debug("Terrain packet unacked, resending patch: " + patchX + " , " + patchY); client.SendLayerData(patchX, patchY, m_scene.Heightmap.GetFloatsSerialised()); - } + } private void StoreUndoState() { diff --git a/OpenSim/Region/CoreModules/World/Wind/WindModule.cs b/OpenSim/Region/CoreModules/World/Wind/WindModule.cs index 9736b73adf..6bac5559e9 100644 --- a/OpenSim/Region/CoreModules/World/Wind/WindModule.cs +++ b/OpenSim/Region/CoreModules/World/Wind/WindModule.cs @@ -425,7 +425,7 @@ namespace OpenSim.Region.CoreModules { if (m_ready) { - if(m_scene.GetRootAgentCount() > 0) + if (m_scene.GetRootAgentCount() > 0) { // Ask wind plugin to generate a LL wind array to be cached locally // Try not to update this too often, as it may involve array copies diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs index 1d9c2bdc07..1bd1371c53 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs @@ -228,7 +228,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap SceneObjectGroup mapdot = (SceneObjectGroup)obj; Color mapdotspot = Color.Gray; // Default color when prim color is white - // Loop over prim in group + // Loop over prim in group List partList = null; lock (mapdot.Children) partList = new List(mapdot.Children.Values); diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index f036d85910..fbc8a50350 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -307,7 +307,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap lock (m_rootAgents) { m_rootAgents.Remove(AgentId); - if(m_rootAgents.Count == 0) + if (m_rootAgents.Count == 0) StopThread(); } } diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index 05c1e009fc..1140b9b8dc 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// - /// true if the object was successfully attached, false otherwise + /// true if the object was successfully attached, false otherwise bool AttachObject( IClientAPI remoteClient, SceneObjectGroup grp, uint AttachmentPt, bool silent); diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs index 2c091e753f..4c501f669b 100644 --- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs @@ -65,7 +65,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Get a group /// /// ID of the group - /// The group's data. Null if there is no such group. + /// The group's data. Null if there is no such group. GroupRecord GetGroupRecord(UUID GroupID); void ActivateGroup(IClientAPI remoteClient, UUID groupID); @@ -74,14 +74,14 @@ namespace OpenSim.Region.Framework.Interfaces List GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID); List GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID); GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID); - GroupMembershipData[] GetMembershipData(UUID UserID); + GroupMembershipData[] GetMembershipData(UUID UserID); GroupMembershipData GetMembershipData(UUID GroupID, UUID UserID); void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile); - void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID); + void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID); GroupNoticeData[] GroupNoticesListRequest(IClientAPI remoteClient, UUID GroupID); string GetGroupTitle(UUID avatarID); diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs index 01066e6ab1..ddf7565945 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs @@ -43,14 +43,14 @@ namespace OpenSim.Region.Framework.Interfaces /// Contains the exception generated if the save did not succeed public delegate void InventoryArchiveSaved( Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException); - + public interface IInventoryArchiverModule { /// /// Fired when an archive inventory save has been completed. /// event InventoryArchiveSaved OnInventoryArchiveSaved; - + /// /// Dearchive a user's inventory folder from the given stream /// @@ -60,7 +60,7 @@ namespace OpenSim.Region.Framework.Interfaces /// The stream from which the inventory archive will be loaded /// true if the first stage of the operation succeeded, false otherwise bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream); - + /// /// Dearchive a user's inventory folder from the given stream /// @@ -72,8 +72,8 @@ namespace OpenSim.Region.Framework.Interfaces /// the loaded IAR with existing folders where possible. /// true if the first stage of the operation succeeded, false otherwise bool DearchiveInventory( - string firstName, string lastName, string invPath, string pass, Stream loadStream, - Dictionary options); + string firstName, string lastName, string invPath, string pass, Stream loadStream, + Dictionary options); /// /// Archive a user's inventory folder to the given stream @@ -85,7 +85,7 @@ namespace OpenSim.Region.Framework.Interfaces /// The stream to which the inventory archive will be saved /// true if the first stage of the operation succeeded, false otherwise bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream); - + /// /// Archive a user's inventory folder to the given stream /// @@ -97,7 +97,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Archiving options. Currently, there are none. /// true if the first stage of the operation succeeded, false otherwise bool ArchiveInventory( - Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, - Dictionary options); + Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, + Dictionary options); } } diff --git a/OpenSim/Region/Framework/Interfaces/IMoapModule.cs b/OpenSim/Region/Framework/Interfaces/IMoapModule.cs index 24b6860742..1d3d240b04 100644 --- a/OpenSim/Region/Framework/Interfaces/IMoapModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IMoapModule.cs @@ -63,5 +63,5 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /param> void ClearMediaEntry(SceneObjectPart part, int face); - } + } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs b/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs index d6e31f4503..65c57a6eb8 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldMapModule.cs @@ -31,7 +31,7 @@ namespace OpenSim.Region.Framework.Interfaces { /// /// Generate a map tile for the scene. a terrain texture for this scene - /// + /// void GenerateMaptile(); } } diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 6b2e03ec75..ff4595e6d3 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -332,7 +332,7 @@ namespace OpenSim.Region.Framework.Scenes /// If the object is being attached, then the avatarID will be present. If the object is being detached then /// the avatarID is UUID.Zero (I know, this doesn't make much sense but now it's historical). public delegate void Attach(uint localID, UUID itemID, UUID avatarID); - public event Attach OnAttach; + public event Attach OnAttach; /// /// Called immediately after an object is loaded from storage. @@ -344,7 +344,7 @@ namespace OpenSim.Region.Framework.Scenes /// Called immediately before an object is saved to storage. /// /// - /// The scene object being persisted. + /// The scene object being persisted. /// This is actually a copy of the original scene object so changes made here will be saved to storage but will not be kept in memory. /// /// @@ -363,7 +363,7 @@ namespace OpenSim.Region.Framework.Scenes public delegate void SceneObjectPartCopyDelegate(SceneObjectPart copy, SceneObjectPart original, bool userExposed); public delegate void RegionUp(GridRegion region); - public event RegionUp OnRegionUp; + public event RegionUp OnRegionUp; public class MoneyTransferArgs : EventArgs { @@ -2063,7 +2063,7 @@ namespace OpenSim.Region.Framework.Scenes } } } - } + } public void TriggerOnSceneObjectPreSave(SceneObjectGroup persistingSo, SceneObjectGroup originalSo) { @@ -2105,7 +2105,7 @@ namespace OpenSim.Region.Framework.Scenes } } } - } + } public void TriggerOnParcelPropertiesUpdateRequest(LandUpdateArgs args, int local_id, IClientAPI remote_client) @@ -2127,6 +2127,6 @@ namespace OpenSim.Region.Framework.Scenes } } } - } + } } } diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs index 581b11c4a1..19f8180780 100644 --- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs +++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs @@ -62,7 +62,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// This is added to the priority of all child prims, to make sure that the root prim update is sent to the - /// viewer before child prim updates. + /// viewer before child prim updates. /// The adjustment is added to child prims and subtracted from root prims, so the gap ends up /// being double. We do it both ways so that there is a still a priority delta even if the priority is already /// double.MinValue or double.MaxValue. @@ -150,9 +150,9 @@ namespace OpenSim.Region.Framework.Scenes if (entity is SceneObjectPart) { // Can't use Scene.GetGroupByPrim() here, since the entity may have been delete from the scene - // before its scheduled update was triggered + // before its scheduled update was triggered //entityPos = m_scene.GetGroupByPrim(entity.LocalId).AbsolutePosition; - entityPos = ((SceneObjectPart)entity).ParentGroup.AbsolutePosition; + entityPos = ((SceneObjectPart)entity).ParentGroup.AbsolutePosition; } else { @@ -177,11 +177,11 @@ namespace OpenSim.Region.Framework.Scenes // Use group position for child prims Vector3 entityPos = entity.AbsolutePosition; if (entity is SceneObjectPart) - { + { // Can't use Scene.GetGroupByPrim() here, since the entity may have been delete from the scene // before its scheduled update was triggered //entityPos = m_scene.GetGroupByPrim(entity.LocalId).AbsolutePosition; - entityPos = ((SceneObjectPart)entity).ParentGroup.AbsolutePosition; + entityPos = ((SceneObjectPart)entity).ParentGroup.AbsolutePosition; } else { diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a439eb9f1f..838c6480b3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -145,7 +145,7 @@ namespace OpenSim.Region.Framework.Scenes item.Owner, item.Name, item.ID); return false; - } + } } /// @@ -253,7 +253,7 @@ namespace OpenSim.Region.Framework.Scenes // Update item with new asset item.AssetID = asset.FullID; if (group.UpdateInventoryItem(item)) - remoteClient.SendAgentAlertMessage("Script saved", false); + remoteClient.SendAgentAlertMessage("Script saved", false); part.GetProperties(remoteClient); @@ -1975,7 +1975,7 @@ namespace OpenSim.Region.Framework.Scenes return null; if (!Permissions.CanRezObject(group.PrimCount, item.OwnerID, pos)) - return null; + return null; if (!Permissions.BypassPermissions()) { @@ -2053,7 +2053,7 @@ namespace OpenSim.Region.Framework.Scenes List partList = null; lock (sog.Children) - partList = new List(sog.Children.Values); + partList = new List(sog.Children.Values); foreach (SceneObjectPart child in partList) child.Inventory.ChangeInventoryOwner(ownerID); @@ -2068,7 +2068,7 @@ namespace OpenSim.Region.Framework.Scenes List partList = null; lock (sog.Children) - partList = new List(sog.Children.Values); + partList = new List(sog.Children.Values); foreach (SceneObjectPart child in partList) { @@ -2078,7 +2078,7 @@ namespace OpenSim.Region.Framework.Scenes sog.SetOwnerId(groupID); sog.ApplyNextOwnerPermissions(); - } + } } foreach (uint localID in localIDs) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 2f69476664..7788e43c18 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -164,7 +164,7 @@ namespace OpenSim.Region.Framework.Scenes List partList = null; lock (sog.Children) - partList = new List(sog.Children.Values); + partList = new List(sog.Children.Values); foreach (SceneObjectPart part in partList) { diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index 4e80bf2e32..06890a02e1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -997,6 +997,6 @@ namespace OpenSim.Region.Framework.Scenes } } return true; - } + } } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 46b84bb442..f8877e49f2 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1916,7 +1916,7 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.ScheduleGroupForFullUpdate(); return sceneObject; - } + } /// /// Add an object into the scene that has come from storage @@ -2009,7 +2009,7 @@ namespace OpenSim.Region.Framework.Scenes /// public bool AddNewSceneObject( SceneObjectGroup sceneObject, bool attachToBackup, Vector3 pos, Quaternion rot, Vector3 vel) - { + { return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, pos, rot, vel); } @@ -2102,12 +2102,12 @@ namespace OpenSim.Region.Framework.Scenes // group has recently been delinked from another group but that this change has not been persisted // to the DB. ForceSceneObjectBackup(so); - so.DetachFromBackup(); + so.DetachFromBackup(); m_storageManager.DataStore.RemoveObject(so.UUID, m_regInfo.RegionID); } // We need to keep track of this state in case this group is still queued for further backup. - so.IsDeleted = true; + so.IsDeleted = true; return true; } @@ -2394,7 +2394,7 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence sp = GetScenePresence(userID); if (sp != null && AttachmentsModule != null) { - uint attPt = (uint)sp.Appearance.GetAttachpoint(itemID); + uint attPt = (uint)sp.Appearance.GetAttachpoint(itemID); AttachmentsModule.RezSingleAttachmentFromInventory(sp.ControllingClient, itemID, attPt); } @@ -2437,7 +2437,7 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.RootPart.AddFlag(PrimFlags.Phantom); // Don't sent a full update here because this will cause full updates to be sent twice for - // attachments on region crossings, resulting in viewer glitches. + // attachments on region crossings, resulting in viewer glitches. AddRestoredSceneObject(sceneObject, false, false, false); // Handle attachment special case @@ -2681,7 +2681,7 @@ namespace OpenSim.Region.Framework.Scenes } public virtual void SubscribeToClientPrimEvents(IClientAPI client) - { + { client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimPosition; client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimRotation; @@ -2717,7 +2717,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnUndo += m_sceneGraph.HandleUndo; client.OnRedo += m_sceneGraph.HandleRedo; client.OnObjectDescription += m_sceneGraph.PrimDescription; - client.OnObjectDrop += m_sceneGraph.DropObject; + client.OnObjectDrop += m_sceneGraph.DropObject; client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable; client.OnObjectOwner += ObjectOwner; } @@ -3669,7 +3669,7 @@ namespace OpenSim.Region.Framework.Scenes public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) { ScenePresence presence = GetScenePresence(agentID); - if(presence != null) + if (presence != null) { try { diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index f8591ba8ad..c71aefadee 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -521,7 +521,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - /// + /// public void AddCommand( object mod, string command, string shorthelp, string longhelp, string descriptivehelp, CommandDelegate callback) { diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index f779a6dbaa..5ac8ff5fef 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -298,7 +298,7 @@ namespace OpenSim.Region.Framework.Scenes /// Position of the object /// Rotation of the object /// Velocity of the object. This parameter only has an effect if the object is physical - /// + /// public bool AddNewSceneObject( SceneObjectGroup sceneObject, bool attachToBackup, Vector3 pos, Quaternion rot, Vector3 vel) { @@ -322,7 +322,7 @@ namespace OpenSim.Region.Framework.Scenes } return true; - } + } /// /// Add an object to the scene. This will both update the scene, and send information about the @@ -1284,7 +1284,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(localID); if (group != null) - { + { if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0)) { if (m_parentScene.AttachmentsModule != null) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 4024328afb..4caa4397a9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -677,7 +677,7 @@ namespace OpenSim.Region.Framework.Scenes minY = 256f; minZ = 8192f; - lock(m_parts) + lock (m_parts) { foreach (SceneObjectPart part in m_parts.Values) { @@ -1005,7 +1005,7 @@ namespace OpenSim.Region.Framework.Scenes AbsolutePosition = detachedpos; m_rootPart.AttachedAvatar = UUID.Zero; - //Anakin Lohner bug #3839 + //Anakin Lohner bug #3839 lock (m_parts) { foreach (SceneObjectPart p in m_parts.Values) @@ -1226,7 +1226,7 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Delete this group from its scene. + /// Delete this group from its scene. /// /// /// This only handles the in-world consequences of deletion (e.g. any avatars sitting on it are forcibly stood @@ -1383,7 +1383,7 @@ namespace OpenSim.Region.Framework.Scenes if (!m_isBackedUp) { // m_log.DebugFormat( -// "[WATER WARS]: Ignoring backup of {0} {1} since object is not marked to be backed up", Name, UUID); +// "[WATER WARS]: Ignoring backup of {0} {1} since object is not marked to be backed up", Name, UUID); return; } @@ -1395,7 +1395,7 @@ namespace OpenSim.Region.Framework.Scenes } // Since this is the top of the section of call stack for backing up a particular scene object, don't let - // any exception propogate upwards. + // any exception propogate upwards. try { if (!m_scene.ShuttingDown) // if shutting down then there will be nothing to handle the return so leave till next restart @@ -1546,7 +1546,7 @@ namespace OpenSim.Region.Framework.Scenes newPart.LinkNum = part.LinkNum; } - // Need to duplicate the physics actor as well + // Need to duplicate the physics actor as well if (part.PhysActor != null && userExposed) { PrimitiveBaseShape pbs = part.Shape; @@ -1562,7 +1562,7 @@ namespace OpenSim.Region.Framework.Scenes part.PhysActor.LocalID = part.LocalId; part.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true); - } + } } if (userExposed) @@ -1838,7 +1838,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart newPart = null; lock (m_parts) - { + { newPart = part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed); newPart.SetParent(this); m_parts.Add(newPart.UUID, newPart); @@ -2337,7 +2337,7 @@ namespace OpenSim.Region.Framework.Scenes if (p.LinkNum > linkPart.LinkNum) p.LinkNum--; } - } + } } linkPart.ParentID = 0; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 3753dcbba8..024bdc97bf 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1010,12 +1010,12 @@ namespace OpenSim.Region.Framework.Scenes return m_mediaUrl; } - set - { + set + { m_mediaUrl = value; if (ParentGroup != null) - ParentGroup.HasGroupChanged = true; + ParentGroup.HasGroupChanged = true; } } @@ -1028,7 +1028,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat("[SOP]: Setting CreateSelected to {0} for {1} {2}", value, Name, UUID); m_createSelected = value; } - } + } #endregion @@ -1189,7 +1189,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Property flags. See OpenMetaverse.PrimFlags - /// + /// /// Example properties are PrimFlags.Phantom and PrimFlags.DieAtEdge public PrimFlags Flags { @@ -1355,7 +1355,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Tell the scene presence that it should send updates for this part to its client - /// + /// public void AddFullUpdateToAvatar(ScenePresence presence) { presence.SceneViewer.QueuePartForUpdate(this); @@ -1414,7 +1414,7 @@ namespace OpenSim.Region.Framework.Scenes m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence sp) { - if(!sp.IsChildAgent) + if (!sp.IsChildAgent) sp.ControllingClient.SendAttachedSoundGainChange(UUID, (float)volume); }); } @@ -1659,7 +1659,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat("[SCENE OBJECT PART]: Clone of {0} {1} finished", Name, UUID); - return dupe; + return dupe; } protected void AssetReceived(string id, Object sender, AssetBase asset) @@ -1969,10 +1969,10 @@ namespace OpenSim.Region.Framework.Scenes } public uint GetEffectiveObjectFlags() - { + { // Commenting this section of code out since it doesn't actually do anything, as enums are handled by // value rather than reference -// PrimFlags f = _flags; +// PrimFlags f = _flags; // if (m_parentGroup == null || m_parentGroup.RootPart == this) // f &= ~(PrimFlags.Touch | PrimFlags.Money); @@ -4733,7 +4733,7 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null || ParentGroup.IsDeleted) return; - if (IsAttachment && ParentGroup.RootPart != this) + if (IsAttachment && ParentGroup.RootPart != this) return; // Causes this thread to dig into the Client Thread Data. diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 1984d45f06..4affdef4a8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1094,7 +1094,7 @@ namespace OpenSim.Region.Framework.Scenes item.OwnerChanged = false; engine.ResumeScript(item.ItemID); } - } + } } } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index cc9355e031..177cf1e742 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1287,7 +1287,7 @@ namespace OpenSim.Region.Framework.Scenes // Setting parent ID would fix this, if we knew what value // to use. Or we could add a m_isSitting variable. //Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); - SitGround = true; + SitGround = true; } // In the future, these values might need to go global. diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs index 7aa5a93e8b..b45291fcba 100644 --- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs +++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs @@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Scenes { m_pendingObjects = new Queue(); - lock(m_pendingObjects) + lock (m_pendingObjects) { EntityBase[] entities = m_presence.Scene.Entities.GetEntities(); foreach (EntityBase e in entities) @@ -85,7 +85,7 @@ namespace OpenSim.Region.Framework.Scenes } } - lock(m_pendingObjects) + lock (m_pendingObjects) { while (m_pendingObjects != null && m_pendingObjects.Count > 0) { diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs index c9662ef9eb..7d9a6a9e99 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs @@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(dupeSo.Children.Count, Is.EqualTo(2)); SceneObjectPart dupePart1 = dupeSo.GetLinkNumPart(1); - SceneObjectPart dupePart2 = dupeSo.GetLinkNumPart(2); + SceneObjectPart dupePart2 = dupeSo.GetLinkNumPart(2); Assert.That(dupePart1.LocalId, Is.Not.EqualTo(part1.LocalId)); Assert.That(dupePart2.LocalId, Is.Not.EqualTo(part2.LocalId)); @@ -84,6 +84,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(dupePart1.PhysActor, Is.Not.Null); Assert.That(dupePart2.PhysActor, Is.Not.Null); */ - } + } } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index e3ef263b11..9f787c9faa 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -270,7 +270,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelper.InMethod(); //log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneSetupHelpers.SetupScene(); + TestScene scene = SceneSetupHelpers.SetupScene(); string rootPartName = "rootpart"; UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); @@ -282,11 +282,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests { Name = rootPartName, UUID = rootPartUuid }; SceneObjectPart linkPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) - { Name = linkPartName, UUID = linkPartUuid }; + { Name = linkPartName, UUID = linkPartUuid }; SceneObjectGroup sog = new SceneObjectGroup(rootPart); - sog.AddPart(linkPart); - scene.AddNewSceneObject(sog, true); + sog.AddPart(linkPart); + scene.AddNewSceneObject(sog, true); // In a test, we have to crank the backup handle manually. Normally this would be done by the timer invoked // scene backup thread. @@ -309,7 +309,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestHelper.InMethod(); //log4net.Config.XmlConfigurator.Configure(); - TestScene scene = SceneSetupHelpers.SetupScene(); + TestScene scene = SceneSetupHelpers.SetupScene(); string rootPartName = "rootpart"; UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); @@ -321,11 +321,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests { Name = rootPartName, UUID = rootPartUuid }; SceneObjectPart linkPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) - { Name = linkPartName, UUID = linkPartUuid }; + { Name = linkPartName, UUID = linkPartUuid }; SceneObjectGroup sog = new SceneObjectGroup(rootPart); - sog.AddPart(linkPart); - scene.AddNewSceneObject(sog, true); + sog.AddPart(linkPart); + scene.AddNewSceneObject(sog, true); // In a test, we have to crank the backup handle manually. Normally this would be done by the timer invoked // scene backup thread. @@ -333,7 +333,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // These changes should occur immediately without waiting for a backup pass SceneObjectGroup groupToDelete = sog.DelinkFromGroup(linkPart, false); - scene.DeleteSceneObject(groupToDelete, false); + scene.DeleteSceneObject(groupToDelete, false); List storedObjects = scene.StorageManager.DataStore.LoadObjects(scene.RegionInfo.RegionID); diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index 5e491c2403..fe59d4f031 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -59,8 +59,8 @@ namespace OpenSim.Region.Framework.Tests string userFirstName = "Jock"; string userLastName = "Stirrup"; string userPassword = "troll"; - UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); - return UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, userPassword); + UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); + return UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, userPassword); } protected SceneObjectGroup CreateSO1(Scene scene, UUID ownerId) @@ -70,7 +70,7 @@ namespace OpenSim.Region.Framework.Tests SceneObjectPart part1 = new SceneObjectPart(ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = part1Name, UUID = part1Id }; - return new SceneObjectGroup(part1); + return new SceneObjectGroup(part1); } protected TaskInventoryItem CreateSOItem1(Scene scene, SceneObjectPart part) @@ -79,7 +79,7 @@ namespace OpenSim.Region.Framework.Tests nc.BodyText = "Hello World!"; nc.Encode(); UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000"); - UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); + UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000"); AssetBase ncAsset = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero); scene.AssetService.Store(ncAsset); @@ -114,9 +114,9 @@ namespace OpenSim.Region.Framework.Tests scene.MoveTaskInventoryItem(user1.PrincipalID, folder.ID, sop1, sopItem1.ItemID); InventoryItemBase ncUserItem - = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem"); + = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Objects/ncItem"); Assert.That(ncUserItem, Is.Not.Null, "Objects/ncItem was not found"); - } + } /// /// Test MoveTaskInventoryItem where the item has no parent folder assigned. @@ -138,7 +138,7 @@ namespace OpenSim.Region.Framework.Tests scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID); InventoryItemBase ncUserItem - = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem"); + = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, user1.PrincipalID, "Notecards/ncItem"); Assert.That(ncUserItem, Is.Not.Null, "Notecards/ncItem was not found"); } } diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 29695034ae..6f044e0086 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs @@ -962,7 +962,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups if ((groupInfo == null) || (account == null)) { return; - } + } // Send Message to Ejectee GridInstantMessage msg = new GridInstantMessage(); diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs index 9363205263..0d265f2501 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs @@ -91,11 +91,11 @@ using OpenSim.Services.Interfaces; * + RoleID * * GroupID -> GroupNotice -> NoticeID - * + TimeStamp [uint] - * + FromName [string] - * + Subject [string] - * + Message [string] - * + BinaryBucket [byte[]] + * + TimeStamp [uint] + * + FromName [string] + * + Subject [string] + * + Message [string] + * + BinaryBucket [byte[]] * * */ @@ -309,7 +309,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups GroupInfoMap["OwnerRoleID"] = OSD.FromUUID(OwnerRoleID); GroupInfoMap["OwnersPowers"] = OSD.FromULong((ulong)m_DefaultOwnerPowers); - if(SimianAddGeneric(GroupID, "Group", name, GroupInfoMap)) + if (SimianAddGeneric(GroupID, "Group", name, GroupInfoMap)) { AddGroupRole(requestingAgentID, GroupID, UUID.Zero, "Everyone", "Members of " + name, "Member of " + name, (ulong)m_DefaultEveryonePowers); AddGroupRole(requestingAgentID, GroupID, OwnerRoleID, "Owners", "Owners of " + name, "Owner of " + name, (ulong)m_DefaultOwnerPowers); @@ -334,7 +334,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups string GroupName; OSDMap GroupInfoMap; - if( SimianGetFirstGenericEntry(groupID, "GroupInfo", out GroupName, out GroupInfoMap) ) + if (SimianGetFirstGenericEntry(groupID, "GroupInfo", out GroupName, out GroupInfoMap)) { GroupInfoMap["Charter"] = OSD.FromString(charter); GroupInfoMap["ShowInList"] = OSD.FromBoolean(showInList); @@ -379,7 +379,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups string GroupRoleMemberType = "GroupRole" + groupID.ToString(); if (SimianGetGenericEntries(GroupRoleMemberType, roleID.ToString(), out GroupRoleMembers)) { - foreach(UUID UserID in GroupRoleMembers.Keys) + foreach (UUID UserID in GroupRoleMembers.Keys) { EnsureRoleNotSelectedByMember(groupID, roleID, UserID); @@ -724,7 +724,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups } OSDMap UserGroupMemberInfo; - if( SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo) ) + if (SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo)) { data.AcceptNotices = UserGroupMemberInfo["AcceptNotices"].AsBoolean(); data.Contribution = UserGroupMemberInfo["Contribution"].AsInteger(); @@ -736,7 +736,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // OSDMap GroupRoleInfo; - if( SimianGetGenericEntry(groupID, "GroupRole", data.ActiveRole.ToString(), out GroupRoleInfo) ) + if (SimianGetGenericEntry(groupID, "GroupRole", data.ActiveRole.ToString(), out GroupRoleInfo)) { data.GroupTitle = GroupRoleInfo["Title"].AsString(); data.GroupPowers = GroupRoleInfo["Powers"].AsULong(); @@ -748,7 +748,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // OSDMap GroupInfo; string GroupName; - if( SimianGetFirstGenericEntry(groupID, "Group", out GroupName, out GroupInfo) ) + if (SimianGetFirstGenericEntry(groupID, "Group", out GroupName, out GroupInfo)) { data.GroupID = groupID; data.AllowPublish = GroupInfo["AllowPublish"].AsBoolean(); @@ -928,12 +928,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Dictionary GroupRoles; if (SimianGetGenericEntries(groupID, "GroupRole", out GroupRoles)) { - foreach( KeyValuePair Role in GroupRoles ) + foreach (KeyValuePair Role in GroupRoles) { Dictionary GroupRoleMembers; - if( SimianGetGenericEntries("GroupRole"+groupID.ToString(), Role.Key, out GroupRoleMembers) ) + if (SimianGetGenericEntries("GroupRole"+groupID.ToString(), Role.Key, out GroupRoleMembers)) { - foreach( KeyValuePair GroupRoleMember in GroupRoleMembers ) + foreach (KeyValuePair GroupRoleMember in GroupRoleMembers) { GroupRoleMembersData data = new GroupRoleMembersData(); @@ -1264,7 +1264,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}", entryMap["Value"].AsString()); maps.Add(entryMap["Key"].AsString(), (OSDMap)OSDParser.DeserializeJson(entryMap["Value"].AsString())); } - if(maps.Count == 0) + if (maps.Count == 0) { if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] No Generics Results"); } @@ -1352,17 +1352,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups } // Check if this is an update or a request - if ( requestArgs["RequestMethod"] == "RemoveGeneric" - || requestArgs["RequestMethod"] == "AddGeneric" - ) - + if (requestArgs["RequestMethod"] == "RemoveGeneric" + || requestArgs["RequestMethod"] == "AddGeneric") { // Any and all updates cause the cache to clear m_memoryCache.Clear(); // Send update to server, return the response without caching it return WebUtil.PostToService(m_groupsServerURI, requestArgs); - } // If we're not doing an update, we must be requesting data @@ -1372,7 +1369,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups OSDMap response = null; if (!m_memoryCache.TryGetValue(CacheKey, out response)) { - // if it wasn't in the cache, pass the request to the Simian Grid Services + // if it wasn't in the cache, pass the request to the Simian Grid Services response = WebUtil.PostToService(m_groupsServerURI, requestArgs); // and cache the response diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs index 79b9a167d0..a88c5e2d60 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs @@ -960,7 +960,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups } - if( resp == null ) + if (resp == null) { string UserService; UUID SessionID; @@ -1065,7 +1065,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups /// /// Group Request Tokens are an attempt to allow the groups service to authenticate - /// requests. + /// requests. /// TODO: This broke after the big grid refactor, either find a better way, or discard this /// /// diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs index 796f437974..d7838c56f0 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs @@ -161,7 +161,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement //finalize m_Entity.RootPart.PhysActor = null; - m_Entity.Children = parts; + m_Entity.Children = parts; } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs index c439e3ec20..59ad9d87a8 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs @@ -432,7 +432,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule return; } - foreach(string button in buttons) + foreach (string button in buttons) { if (button == String.Empty) { @@ -448,7 +448,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule dm.SendDialogToUser( avatar, GetSOP().Name, GetSOP().UUID, GetSOP().OwnerID, - message, new UUID("00000000-0000-2222-3333-100000001000"), chat_channel, buttons); + message, new UUID("00000000-0000-2222-3333-100000001000"), chat_channel, buttons); } diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs index 61cbb907d9..cc51c3b020 100644 --- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs +++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs @@ -824,5 +824,5 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule RegionMoneyRequest = 1, Gift = 2, Purchase = 3 - } + } } \ No newline at end of file diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs index a0d6197004..f424e7f42c 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs @@ -49,7 +49,7 @@ namespace OpenSim.Region.RegionCombinerModule public void ClientConnect(IClientAPI client) { m_virtScene.UnSubscribeToClientPrimEvents(client); - m_virtScene.UnSubscribeToClientPrimRezEvents(client); + m_virtScene.UnSubscribeToClientPrimRezEvents(client); m_virtScene.UnSubscribeToClientInventoryEvents(client); ((AttachmentsModule)m_virtScene.AttachmentsModule).UnsubscribeFromClientEvents(client); //m_virtScene.UnSubscribeToClientTeleportEvents(client); @@ -66,7 +66,7 @@ namespace OpenSim.Region.RegionCombinerModule client.OnRezObject += LocalRezObject; m_rootScene.SubscribeToClientInventoryEvents(client); - ((AttachmentsModule)m_rootScene.AttachmentsModule).SubscribeToClientEvents(client); + ((AttachmentsModule)m_rootScene.AttachmentsModule).SubscribeToClientEvents(client); //m_rootScene.SubscribeToClientTeleportEvents(client); m_rootScene.SubscribeToClientScriptEvents(client); diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs index 33ff707e9f..be5411a34b 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs @@ -118,7 +118,7 @@ public class RegionCombinerLargeLandChannel : ILandChannel return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY); } } - + ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene); obj.LandData.Name = "NO LAND"; return obj; @@ -142,14 +142,14 @@ public class RegionCombinerLargeLandChannel : ILandChannel public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) { - RootRegionLandChannel.Join(start_x, start_y, end_x, end_y, attempting_user_id); + RootRegionLandChannel.Join(start_x, start_y, end_x, end_y, attempting_user_id); } public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) { RootRegionLandChannel.Subdivide(start_x, start_y, end_x, end_y, attempting_user_id); } - + public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) { RootRegionLandChannel.ReturnObjectsInParcel(localID, returnType, agentIDs, taskIDs, remoteClient); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a9c5d10e52..0692fdbe47 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -7977,7 +7977,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api res.Add(new LSL_Integer((int)me.ControlPermissions)); break; } - } + } return res; } @@ -7993,7 +7993,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (face < 0 || face > m_host.GetNumberOfSides() - 1) return ScriptBaseClass.LSL_STATUS_OK; - return SetPrimMediaParams(face, rules); + return SetPrimMediaParams(face, rules); } private LSL_Integer SetPrimMediaParams(int face, LSL_List rules) @@ -8082,7 +8082,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api me.ControlPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); break; } - } + } module.SetMediaEntry(m_host, face, me); @@ -8102,7 +8102,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) - throw new Exception("Media on a prim functions not available"); + throw new Exception("Media on a prim functions not available"); module.ClearMediaEntry(m_host, face); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index a529a944fb..477c52d79c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1190,7 +1190,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api World.LandChannel.Join(startx,starty,endx,endy,m_host.OwnerID); } - + public void osParcelSubdivide(LSL_Vector pos1, LSL_Vector pos2) { CheckThreatLevel(ThreatLevel.High, "osParcelSubdivide"); @@ -1213,7 +1213,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // can modify it ILandObject startLandObject = World.LandChannel.GetLandObject((int)pos.x, (int)pos.y); - if (startLandObject == null) + if (startLandObject == null) { OSSLShoutError("There is no land at that location"); return; @@ -1230,7 +1230,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api UUID uuid; // Process the rules, not sure what the impact would be of changing owner or group - for (int idx = 0; idx < rules.Length; ) + for (int idx = 0; idx < rules.Length;) { int code = rules.GetLSLIntegerItem(idx++); string arg = rules.GetLSLStringItem(idx++); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 2b67e841b2..fefbb35760 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs @@ -416,7 +416,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins List sensedEntities = new List(); // If nobody about quit fast - if(m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) + if (m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) return sensedEntities; SceneObjectPart SensePoint = ts.host; @@ -485,7 +485,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins { ScenePresence sp; // Try direct lookup by UUID - if(!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) + if (!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) return sensedEntities; senseEntity(sp); } diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 8102acd457..427d4e5b16 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -564,7 +564,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine bool postOnRez = (bool)p[4]; StateSource stateSource = (StateSource)p[5]; - lock(m_CompileDict) + lock (m_CompileDict) { if (!m_CompileDict.ContainsKey(itemID)) return false; diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index e7a8294fef..f4472c7dc0 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs @@ -62,7 +62,7 @@ namespace OpenSim.Server.Base /// /// /// The arguments which control which constructor is invoked on the plugin - /// + /// public static T LoadPlugin(string dllName, Object[] args) where T:class { string[] parts = dllName.Split(new char[] {':'}); diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index f5b59823e6..479a80e297 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -86,7 +86,7 @@ namespace OpenSim.Services.Connectors.Hypergrid paramList.Add(hash); XmlRpcRequest request = new XmlRpcRequest("link_region", paramList); - string uri = "http://" + ((info.ServerURI != null && info.ServerURI != string.Empty && !info.ServerURI.StartsWith("http:")) ? info.ServerURI : info.ExternalEndPoint.Address + ":" + info.HttpPort + "/" ); + string uri = "http://" + ((info.ServerURI != null && info.ServerURI != string.Empty && !info.ServerURI.StartsWith("http:")) ? info.ServerURI : info.ExternalEndPoint.Address + ":" + info.HttpPort + "/"); m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: Linking to " + uri); XmlRpcResponse response = null; try diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs index e25e7ebd3c..403ee15b38 100644 --- a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs @@ -526,7 +526,7 @@ namespace OpenSim.Services.Connectors InventoryFolderBase folder = new InventoryFolderBase(); try - { + { folder.ParentID = new UUID(data["ParentID"].ToString()); folder.Type = short.Parse(data["Type"].ToString()); folder.Version = ushort.Parse(data["Version"].ToString()); diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index 86bca79d6b..e543337c71 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -276,11 +276,11 @@ namespace OpenSim.Services.InventoryService List folders = RequestSubFolders(root.ID); foreach (InventoryFolderBase folder in folders) - { + { if (folder.Type == (short)type) { // m_log.DebugFormat( -// "[INVENTORY SERVICE]: Found folder {0} type {1}", folder.Name, (AssetType)folder.Type); +// "[INVENTORY SERVICE]: Found folder {0} type {1}", folder.Name, (AssetType)folder.Type); return folder; } diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 3f9bc19c9d..d30c149cf0 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -308,7 +308,7 @@ namespace OpenSim.Services.LLLoginService { // something went wrong, make something up, so that we don't have to test this anywhere else guinfo = new GridUserInfo(); - guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); + guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 65c247f334..f376cf825b 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -97,10 +97,10 @@ namespace OpenSim.Services.UserAccountService public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) { -// m_log.DebugFormat( -// "[USER ACCOUNT SERVICE]: Retrieving account by username for {0} {1}, scope {2}", -// firstName, lastName, scopeID); - +// m_log.DebugFormat( +// "[USER ACCOUNT SERVICE]: Retrieving account by username for {0} {1}, scope {2}", +// firstName, lastName, scopeID); + UserAccountData[] d; if (scopeID != UUID.Zero) @@ -235,10 +235,10 @@ namespace OpenSim.Services.UserAccountService public bool StoreUserAccount(UserAccount data) { -// m_log.DebugFormat( -// "[USER ACCOUNT SERVICE]: Storing user account for {0} {1} {2}, scope {3}", -// data.FirstName, data.LastName, data.PrincipalID, data.ScopeID); - +// m_log.DebugFormat( +// "[USER ACCOUNT SERVICE]: Storing user account for {0} {1} {2}, scope {3}", +// data.FirstName, data.LastName, data.PrincipalID, data.ScopeID); + UserAccountData d = new UserAccountData(); d.FirstName = data.FirstName; @@ -285,7 +285,7 @@ namespace OpenSim.Services.UserAccountService #endregion #region Console commands - + /// /// Handle the create user command from the console. /// @@ -296,7 +296,7 @@ namespace OpenSim.Services.UserAccountService string lastName; string password; string email; - + List excluded = new List(new char[]{' '}); if (cmdparams.Length < 3) diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs index 315d4052e7..f453a4bf33 100644 --- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs @@ -99,7 +99,7 @@ namespace OpenSim.Data.Null } public void RemoveObject(UUID obj, UUID regionUUID) - { + { // All parts belonging to the object with the uuid are removed. List parts = new List(m_sceneObjectParts.Values); foreach (SceneObjectPart part in parts) @@ -108,7 +108,7 @@ namespace OpenSim.Data.Null { m_log.DebugFormat( "[MOCK REGION DATA PLUGIN]: Removing part {0} {1} as part of object {2} from {3}", - part.Name, part.UUID, obj, regionUUID); + part.Name, part.UUID, obj, regionUUID); m_sceneObjectParts.Remove(part.UUID); } } @@ -129,7 +129,7 @@ namespace OpenSim.Data.Null if (prim.IsRoot) { m_log.DebugFormat( - "[MOCK REGION DATA PLUGIN]: Loading root part {0} {1} in {2}", prim.Name, prim.UUID, regionUUID); + "[MOCK REGION DATA PLUGIN]: Loading root part {0} {1} in {2}", prim.Name, prim.UUID, regionUUID); objects[prim.UUID] = new SceneObjectGroup(prim); } } diff --git a/OpenSim/Tests/Common/Mock/TestScene.cs b/OpenSim/Tests/Common/Mock/TestScene.cs index 615e519b2d..13f364b187 100644 --- a/OpenSim/Tests/Common/Mock/TestScene.cs +++ b/OpenSim/Tests/Common/Mock/TestScene.cs @@ -69,6 +69,6 @@ namespace OpenSim.Tests.Common.Mock public AsyncSceneObjectGroupDeleter SceneObjectGroupDeleter { get { return m_asyncSceneObjectDeleter; } - } + } } } \ No newline at end of file diff --git a/OpenSim/Tests/Common/Setup/AssetHelpers.cs b/OpenSim/Tests/Common/Setup/AssetHelpers.cs index f9a80b05b2..8647cfed51 100644 --- a/OpenSim/Tests/Common/Setup/AssetHelpers.cs +++ b/OpenSim/Tests/Common/Setup/AssetHelpers.cs @@ -54,8 +54,8 @@ namespace OpenSim.Tests.Common { AssetBase asset = CreateAsset(UUID.Random(), AssetType.Notecard, "hello", creatorId); scene.AssetService.Store(asset); - return asset; - } + return asset; + } /// /// Create an asset from the given scene object. diff --git a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs index 9318a27d05..889389b6ea 100644 --- a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs +++ b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs @@ -58,7 +58,7 @@ namespace OpenSim.Tests.Common.Setup public class SceneSetupHelpers { // These static variables in order to allow regions to be linked by shared modules and same - // CommunicationsManager. + // CommunicationsManager. private static ISharedRegionModule m_assetService = null; // private static ISharedRegionModule m_authenticationService = null; private static ISharedRegionModule m_inventoryService = null; @@ -69,19 +69,19 @@ namespace OpenSim.Tests.Common.Setup /// /// Set up a test scene /// - /// + /// /// Automatically starts service threads, as would the normal runtime. - /// + /// /// public static TestScene SetupScene() { return SetupScene(""); } - + /// /// Set up a test scene /// - /// + /// /// Starts real inventory and asset services, as opposed to mock ones, if true /// public static TestScene SetupScene(String realServices) @@ -94,7 +94,7 @@ namespace OpenSim.Tests.Common.Setup ///// ///// Set up a test scene ///// - ///// + ///// ///// Starts real inventory and asset services, as opposed to mock ones, if true ///// This should be the same if simulating two scenes within a standalone ///// @@ -167,13 +167,13 @@ namespace OpenSim.Tests.Common.Setup capsModule.Initialise(new IniConfigSource()); testScene.AddRegionModule(capsModule.Name, capsModule); capsModule.AddRegion(testScene); - + IRegionModule godsModule = new GodsModule(); godsModule.Initialise(testScene, new IniConfigSource()); testScene.AddModule(godsModule.Name, godsModule); realServices = realServices.ToLower(); // IConfigSource config = new IniConfigSource(); - + // If we have a brand new scene, need to initialize shared region modules if ((m_assetService == null && m_inventoryService == null) || newScene) { @@ -184,13 +184,13 @@ namespace OpenSim.Tests.Common.Setup // For now, always started a 'real' authentication service StartAuthenticationService(testScene, true); - + if (realServices.Contains("inventory")) StartInventoryService(testScene, true); else StartInventoryService(testScene, false); - - StartGridService(testScene, true); + + StartGridService(testScene, true); StartUserAccountService(testScene); StartPresenceService(testScene); } @@ -207,7 +207,7 @@ namespace OpenSim.Tests.Common.Setup m_presenceService.RegionLoaded(testScene); } - + m_inventoryService.PostInitialise(); m_assetService.PostInitialise(); m_userAccountService.PostInitialise(); @@ -250,7 +250,7 @@ namespace OpenSim.Tests.Common.Setup else config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Tests.Common.dll:MockAssetService"); config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); - assetService.Initialise(config); + assetService.Initialise(config); assetService.AddRegion(testScene); assetService.RegionLoaded(testScene); testScene.AddRegionModule(assetService.Name, assetService); @@ -277,7 +277,7 @@ namespace OpenSim.Tests.Common.Setup testScene.AddRegionModule(service.Name, service); //m_authenticationService = service; } - + private static void StartInventoryService(Scene testScene, bool real) { ISharedRegionModule inventoryService = new LocalInventoryServicesConnector(); @@ -285,7 +285,7 @@ namespace OpenSim.Tests.Common.Setup config.AddConfig("Modules"); config.AddConfig("InventoryService"); config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector"); - + if (real) { config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService"); @@ -294,7 +294,7 @@ namespace OpenSim.Tests.Common.Setup { config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Tests.Common.dll:MockInventoryService"); } - + config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); inventoryService.Initialise(config); inventoryService.AddRegion(testScene); @@ -338,14 +338,14 @@ namespace OpenSim.Tests.Common.Setup config.Configs["UserAccountService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); config.Configs["UserAccountService"].Set( "LocalServiceModule", "OpenSim.Services.UserAccountService.dll:UserAccountService"); - + if (m_userAccountService == null) { ISharedRegionModule userAccountService = new LocalUserAccountServicesConnector(); userAccountService.Initialise(config); m_userAccountService = userAccountService; } - + m_userAccountService.AddRegion(testScene); m_userAccountService.RegionLoaded(testScene); testScene.AddRegionModule(m_userAccountService.Name, m_userAccountService); @@ -559,5 +559,4 @@ namespace OpenSim.Tests.Common.Setup sogd.InventoryDeQueueAndDelete(); } } - } diff --git a/OpenSim/Tests/Common/Setup/UserInventoryTestUtils.cs b/OpenSim/Tests/Common/Setup/UserInventoryTestUtils.cs index 915af7e58d..135c50eb74 100644 --- a/OpenSim/Tests/Common/Setup/UserInventoryTestUtils.cs +++ b/OpenSim/Tests/Common/Setup/UserInventoryTestUtils.cs @@ -42,7 +42,7 @@ namespace OpenSim.Tests.Common public static InventoryItemBase CreateInventoryItem( Scene scene, string itemName, UUID itemId, string folderPath, UUID userId) - { + { InventoryItemBase item = new InventoryItemBase(); item.Name = itemName; item.AssetID = AssetHelpers.CreateAsset(scene, userId).FullID; @@ -52,7 +52,7 @@ namespace OpenSim.Tests.Common InventoryFolderBase objsFolder = scene.InventoryService.GetFolderForType(userId, AssetType.Object); item.Folder = objsFolder.ID; - scene.AddInventoryItem(item); + scene.AddInventoryItem(item); return item; } diff --git a/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs b/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs index 26156f396f..d01521dbdb 100644 --- a/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs +++ b/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs @@ -53,7 +53,7 @@ namespace OpenSim.Tests.Common.Setup // UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000099"); // return CreateUserWithInventory(commsManager, userId, callback); // } -// +// // /// // /// Create a test user with a standard inventory // /// @@ -108,11 +108,11 @@ namespace OpenSim.Tests.Common.Setup // { // LocalUserServices lus = (LocalUserServices)commsManager.UserService; // lus.AddUser(firstName, lastName, password, "bill@bailey.com", 1000, 1000, userId); -// +// // CachedUserInfo userInfo = commsManager.UserProfileCacheService.GetUserDetails(userId); // userInfo.OnInventoryReceived += callback; // userInfo.FetchInventory(); -// +// // return userInfo; // } @@ -140,6 +140,6 @@ namespace OpenSim.Tests.Common.Setup scene.UserAccountService.StoreUserAccount(ua); scene.InventoryService.CreateUserInventory(ua.PrincipalID); scene.AuthenticationService.SetPassword(ua.PrincipalID, pw); - } + } } } \ No newline at end of file From 0db1ed0b5a6f5bd104c6008f142d173c84263ce5 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sun, 12 Sep 2010 14:20:26 -0700 Subject: [PATCH 34/35] * Added ISimulationDataService and IEstateDataService * Removed StorageManager * CONFIG CHANGE: There are no more database settings in OpenSim.ini. Check the config-include configuration files for region store and estate store database settings --- .../RemoteController/RemoteAdminPlugin.cs | 12 +- OpenSim/Data/MSSQL/MSSQLEstateData.cs | 9 ++ OpenSim/Data/MSSQL/MSSQLSimulationData.cs | 10 ++ OpenSim/Data/MySQL/MySQLEstateData.cs | 9 ++ OpenSim/Data/MySQL/MySQLSimulationData.cs | 9 ++ OpenSim/Data/SQLite/SQLiteEstateData.cs | 9 ++ OpenSim/Data/SQLite/SQLiteSimulationData.cs | 9 ++ OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs | 9 ++ .../Data/SQLiteLegacy/SQLiteSimulationData.cs | 9 ++ OpenSim/Framework/ConfigSettings.cs | 16 --- .../Region/Application/ConfigurationLoader.cs | 4 - OpenSim/Region/Application/OpenSimBase.cs | 56 +++++---- .../ClientStack/RegionApplicationBase.cs | 33 ++---- .../Framework/Interfaces/IEntityInventory.cs | 2 +- .../Interfaces/IEstateDataService.cs | 45 +++++++ .../Region/Framework/Scenes/EventManager.cs | 4 +- OpenSim/Region/Framework/Scenes/Scene.cs | 102 +++++++++++----- .../Framework/Scenes/SceneObjectGroup.cs | 2 +- .../Scenes/SceneObjectPartInventory.cs | 2 +- .../Scenes/Tests/SceneObjectLinkingTests.cs | 4 +- OpenSim/Region/Framework/StorageManager.cs | 80 ------------- .../Simulation/EstateDataService.cs | 112 ++++++++++++++++++ ...eConnector.cs => SimulationDataService.cs} | 71 ++++++----- OpenSim/Tests/Common/Mock/TestScene.cs | 10 +- .../Tests/Common/Setup/SceneSetupHelpers.cs | 5 +- bin/OpenSim.ini.example | 27 ----- bin/config-include/Grid.ini | 5 + bin/config-include/GridCommon.ini.example | 21 ++++ bin/config-include/GridHypergrid.ini | 6 + bin/config-include/HyperSimianGrid.ini | 6 + bin/config-include/SimianGrid.ini | 6 + bin/config-include/Standalone.ini | 6 + .../StandaloneCommon.ini.example | 2 + prebuild.xml | 5 +- 34 files changed, 461 insertions(+), 256 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/IEstateDataService.cs delete mode 100644 OpenSim/Region/Framework/StorageManager.cs create mode 100644 OpenSim/Services/Connectors/Simulation/EstateDataService.cs rename OpenSim/Services/Connectors/Simulation/{SimulationDataServiceConnector.cs => SimulationDataService.cs} (59%) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 4b5710a4bd..bb0a5b52c0 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -638,7 +638,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController // Set the estate // Check for an existing estate - List estateIDs = m_application.StorageManager.EstateDataStore.GetEstates((string) requestData["estate_name"]); + List estateIDs = m_application.EstateDataService.GetEstates((string) requestData["estate_name"]); if (estateIDs.Count < 1) { UUID userID = UUID.Zero; @@ -666,7 +666,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController } // Create a new estate with the name provided - region.EstateSettings = m_application.StorageManager.EstateDataStore.LoadEstateSettings(region.RegionID, true); + region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(region.RegionID, true); region.EstateSettings.EstateName = (string) requestData["estate_name"]; region.EstateSettings.EstateOwner = userID; @@ -676,10 +676,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController else { int estateID = estateIDs[0]; - - region.EstateSettings = m_application.StorageManager.EstateDataStore.LoadEstateSettings(estateID); - - if (!m_application.StorageManager.EstateDataStore.LinkRegion(region.RegionID, estateID)) + + region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(estateID); + + if (!m_application.EstateDataService.LinkRegion(region.RegionID, estateID)) throw new Exception("Failed to join estate."); } diff --git a/OpenSim/Data/MSSQL/MSSQLEstateData.cs b/OpenSim/Data/MSSQL/MSSQLEstateData.cs index 80bf10638d..e9a0935048 100644 --- a/OpenSim/Data/MSSQL/MSSQLEstateData.cs +++ b/OpenSim/Data/MSSQL/MSSQLEstateData.cs @@ -50,6 +50,15 @@ namespace OpenSim.Data.MSSQL #region Public methods + public MSSQLEstateStore() + { + } + + public MSSQLEstateStore(string connectionString) + { + Initialise(connectionString); + } + /// /// Initialises the estatedata class. /// diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index ae105d594a..8532af4a15 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs @@ -55,6 +55,16 @@ namespace OpenSim.Data.MSSQL /// private MSSQLManager _Database; private string m_connectionString; + + public MSSQLSimulationData() + { + } + + public MSSQLSimulationData(string connectionString) + { + Initialise(connectionString); + } + /// /// Initialises the region datastore /// diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs index 9158f7a427..c42c687ed9 100644 --- a/OpenSim/Data/MySQL/MySQLEstateData.cs +++ b/OpenSim/Data/MySQL/MySQLEstateData.cs @@ -54,6 +54,15 @@ namespace OpenSim.Data.MySQL private Dictionary m_FieldMap = new Dictionary(); + public MySQLEstateStore() + { + } + + public MySQLEstateStore(string connectionString) + { + Initialise(connectionString); + } + public void Initialise(string connectionString) { m_connectionString = connectionString; diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index 36f73ef49d..ac752f607f 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -52,6 +52,15 @@ namespace OpenSim.Data.MySQL private string m_connectionString; private object m_dbLock = new object(); + public MySQLSimulationData() + { + } + + public MySQLSimulationData(string connectionString) + { + Initialise(connectionString); + } + public void Initialise(string connectionString) { m_connectionString = connectionString; diff --git a/OpenSim/Data/SQLite/SQLiteEstateData.cs b/OpenSim/Data/SQLite/SQLiteEstateData.cs index fcf041e41f..d1d67ebdab 100644 --- a/OpenSim/Data/SQLite/SQLiteEstateData.cs +++ b/OpenSim/Data/SQLite/SQLiteEstateData.cs @@ -49,6 +49,15 @@ namespace OpenSim.Data.SQLite private Dictionary m_FieldMap = new Dictionary(); + public SQLiteEstateStore() + { + } + + public SQLiteEstateStore(string connectionString) + { + Initialise(connectionString); + } + public void Initialise(string connectionString) { m_connectionString = connectionString; diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 1820f78fac..7e62e84a75 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -70,6 +70,15 @@ namespace OpenSim.Data.SQLite private String m_connectionString; + public SQLiteSimulationData() + { + } + + public SQLiteSimulationData(string connectionString) + { + Initialise(connectionString); + } + // Temporary attribute while this is experimental /*********************************************************************** diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs index bf8ee147b5..547ea6b07d 100644 --- a/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs +++ b/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs @@ -49,6 +49,15 @@ namespace OpenSim.Data.SQLiteLegacy private Dictionary m_FieldMap = new Dictionary(); + public SQLiteEstateStore() + { + } + + public SQLiteEstateStore(string connectionString) + { + Initialise(connectionString); + } + public void Initialise(string connectionString) { m_connectionString = connectionString; diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs index e9c6aa5e34..2dde926fce 100644 --- a/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs @@ -69,6 +69,15 @@ namespace OpenSim.Data.SQLiteLegacy private String m_connectionString; + public SQLiteSimulationData() + { + } + + public SQLiteSimulationData(string connectionString) + { + Initialise(connectionString); + } + // Temporary attribute while this is experimental /*********************************************************************** diff --git a/OpenSim/Framework/ConfigSettings.cs b/OpenSim/Framework/ConfigSettings.cs index 8feaa372ee..be7734128f 100644 --- a/OpenSim/Framework/ConfigSettings.cs +++ b/OpenSim/Framework/ConfigSettings.cs @@ -124,22 +124,6 @@ namespace OpenSim.Framework set { m_standaloneUserSource = value; } } - protected string m_storageConnectionString; - - public string StorageConnectionString - { - get { return m_storageConnectionString; } - set { m_storageConnectionString = value; } - } - - protected string m_estateConnectionString; - - public string EstateConnectionString - { - get { return m_estateConnectionString; } - set { m_estateConnectionString = value; } - } - protected string m_librariesXMLFile; public string LibrariesXMLFile { diff --git a/OpenSim/Region/Application/ConfigurationLoader.cs b/OpenSim/Region/Application/ConfigurationLoader.cs index e69e3fc9d9..e2e06409c1 100644 --- a/OpenSim/Region/Application/ConfigurationLoader.cs +++ b/OpenSim/Region/Application/ConfigurationLoader.cs @@ -345,10 +345,6 @@ namespace OpenSim m_configSettings.StorageDll = startupConfig.GetString("storage_plugin"); - m_configSettings.StorageConnectionString - = startupConfig.GetString("storage_connection_string"); - m_configSettings.EstateConnectionString - = startupConfig.GetString("estate_connection_string", m_configSettings.StorageConnectionString); m_configSettings.ClientstackDll = startupConfig.GetString("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); } diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index d2d2607b39..74ad1685f9 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -45,6 +45,7 @@ using OpenSim.Region.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Physics.Manager; +using OpenSim.Server.Base; namespace OpenSim { @@ -186,6 +187,24 @@ namespace OpenSim userStatsURI = startupConfig.GetString("Stats_URI", String.Empty); } + // Load the simulation data service + IConfig simDataConfig = m_config.Source.Configs["SimulationDataStore"]; + if (simDataConfig == null) + throw new Exception("Configuration file is missing the [SimulationDataStore] section"); + string module = simDataConfig.GetString("LocalServiceModule", String.Empty); + if (String.IsNullOrEmpty(module)) + throw new Exception("Configuration file is missing the LocalServiceModule parameter in the [SimulationDataStore] section"); + m_simulationDataService = ServerUtils.LoadPlugin(module, new object[] { m_config.Source }); + + // Load the estate data service + IConfig estateDataConfig = m_config.Source.Configs["EstateDataStore"]; + if (estateDataConfig == null) + throw new Exception("Configuration file is missing the [EstateDataStore] section"); + module = estateDataConfig.GetString("LocalServiceModule", String.Empty); + if (String.IsNullOrEmpty(module)) + throw new Exception("Configuration file is missing the LocalServiceModule parameter in the [EstateDataStore] section"); + m_estateDataService = ServerUtils.LoadPlugin(module, new object[] { m_config.Source }); + base.StartupSpecific(); m_stats = StatsManager.StartCollectingSimExtraStats(); @@ -536,7 +555,7 @@ namespace OpenSim regionInfo.InternalEndPoint.Port = (int) port; - Scene scene = CreateScene(regionInfo, m_storageManager, circuitManager); + Scene scene = CreateScene(regionInfo, m_simulationDataService, m_estateDataService, circuitManager); if (m_autoCreateClientStack) { @@ -552,30 +571,19 @@ namespace OpenSim return scene; } - protected override StorageManager CreateStorageManager() - { - return - CreateStorageManager(m_configSettings.StorageConnectionString, m_configSettings.EstateConnectionString); - } - - protected StorageManager CreateStorageManager(string connectionstring, string estateconnectionstring) - { - return new StorageManager(m_configSettings.StorageDll, connectionstring, estateconnectionstring); - } - protected override ClientStackManager CreateClientStackManager() { return new ClientStackManager(m_configSettings.ClientstackDll); } - protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager, - AgentCircuitManager circuitManager) + protected override Scene CreateScene(RegionInfo regionInfo, ISimulationDataService simDataService, + IEstateDataService estateDataService, AgentCircuitManager circuitManager) { SceneCommunicationService sceneGridService = new SceneCommunicationService(); return new Scene( regionInfo, circuitManager, sceneGridService, - storageManager, m_moduleLoader, false, m_configSettings.PhysicalPrim, + simDataService, estateDataService, m_moduleLoader, false, m_configSettings.PhysicalPrim, m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version); } @@ -792,21 +800,23 @@ namespace OpenSim /// public void PopulateRegionEstateInfo(RegionInfo regInfo) { - if (m_storageManager.EstateDataStore != null) + IEstateDataService estateDataService = EstateDataService; + + if (estateDataService != null) { - regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(regInfo.RegionID, false); + regInfo.EstateSettings = estateDataService.LoadEstateSettings(regInfo.RegionID, false); } - + if (regInfo.EstateSettings.EstateID == 0) // No record at all { MainConsole.Instance.Output("Your region is not part of an estate."); while (true) { - string response = MainConsole.Instance.CmdPrompt("Do you wish to join an existing estate?", "no", new List() {"yes", "no"}); + string response = MainConsole.Instance.CmdPrompt("Do you wish to join an existing estate?", "no", new List() { "yes", "no" }); if (response == "no") { // Create a new estate - regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(regInfo.RegionID, true); + regInfo.EstateSettings = estateDataService.LoadEstateSettings(regInfo.RegionID, true); regInfo.EstateSettings.EstateName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); //regInfo.EstateSettings.Save(); @@ -818,7 +828,7 @@ namespace OpenSim if (response == "None") continue; - List estateIDs = m_storageManager.EstateDataStore.GetEstates(response); + List estateIDs = estateDataService.GetEstates(response); if (estateIDs.Count < 1) { MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again"); @@ -827,9 +837,9 @@ namespace OpenSim int estateID = estateIDs[0]; - regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(estateID); + regInfo.EstateSettings = estateDataService.LoadEstateSettings(estateID); - if (m_storageManager.EstateDataStore.LinkRegion(regInfo.RegionID, estateID)) + if (estateDataService.LinkRegion(regInfo.RegionID, estateID)) break; MainConsole.Instance.Output("Joining the estate failed. Please try again."); diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 46b68ec04b..ea1317a19c 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -36,6 +36,7 @@ using OpenSim.Framework.Communications; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Region.Framework; +using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Physics.Manager; @@ -48,28 +49,16 @@ namespace OpenSim.Region.ClientStack protected Dictionary m_clientCircuits = new Dictionary(); protected NetworkServersInfo m_networkServersInfo; - - public NetworkServersInfo NetServersInfo - { - get { return m_networkServersInfo; } - } - protected uint m_httpServerPort; - - protected StorageManager m_storageManager; - - public StorageManager StorageManager - { - get { return m_storageManager; } - } - + protected ISimulationDataService m_simulationDataService; + protected IEstateDataService m_estateDataService; protected ClientStackManager m_clientStackManager; - - public SceneManager SceneManager - { - get { return m_sceneManager; } - } protected SceneManager m_sceneManager = new SceneManager(); + + public SceneManager SceneManager { get { return m_sceneManager; } } + public NetworkServersInfo NetServersInfo { get { return m_networkServersInfo; } } + public ISimulationDataService SimulationDataService { get { return m_simulationDataService; } } + public IEstateDataService EstateDataService { get { return m_estateDataService; } } protected abstract void Initialize(); @@ -83,15 +72,11 @@ namespace OpenSim.Region.ClientStack /// protected abstract PhysicsScene GetPhysicsScene(string osSceneIdentifier); - protected abstract StorageManager CreateStorageManager(); protected abstract ClientStackManager CreateClientStackManager(); - protected abstract Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager, - AgentCircuitManager circuitManager); + protected abstract Scene CreateScene(RegionInfo regionInfo, ISimulationDataService simDataService, IEstateDataService estateDataService, AgentCircuitManager circuitManager); protected override void StartupSpecific() { - m_storageManager = CreateStorageManager(); - m_clientStackManager = CreateClientStackManager(); Initialize(); diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 54845fd96d..7edb43eda2 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -200,7 +200,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Backup the inventory to the given data store /// /// - void ProcessInventoryBackup(ISimulationDataStore datastore); + void ProcessInventoryBackup(ISimulationDataService datastore); uint MaskEffectivePermissions(); diff --git a/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs b/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs new file mode 100644 index 0000000000..95c9659bc1 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs @@ -0,0 +1,45 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using OpenSim.Framework; +using OpenMetaverse; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IEstateDataService + { + EstateSettings LoadEstateSettings(UUID regionID, bool create); + EstateSettings LoadEstateSettings(int estateID); + void StoreEstateSettings(EstateSettings es); + List GetEstates(string search); + bool LinkRegion(UUID regionID, int estateID); + List GetRegions(int estateID); + bool DeleteEstate(int estateID); + } +} diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 6b2e03ec75..72b8de8249 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -57,7 +57,7 @@ namespace OpenSim.Region.Framework.Scenes public event OnTerrainTickDelegate OnTerrainTick; - public delegate void OnBackupDelegate(ISimulationDataStore datastore, bool forceBackup); + public delegate void OnBackupDelegate(ISimulationDataService datastore, bool forceBackup); public event OnBackupDelegate OnBackup; @@ -684,7 +684,7 @@ namespace OpenSim.Region.Framework.Scenes } } - public void TriggerOnBackup(ISimulationDataStore dstore, bool forced) + public void TriggerOnBackup(ISimulationDataService dstore, bool forced) { OnBackupDelegate handlerOnAttach = OnBackup; if (handlerOnAttach != null) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 46b84bb442..9a9ef5f838 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -100,10 +100,11 @@ namespace OpenSim.Region.Framework.Scenes protected List m_neighbours = new List(); protected string m_simulatorVersion = "OpenSimulator Server"; protected ModuleLoader m_moduleLoader; - protected StorageManager m_storageManager; protected AgentCircuitManager m_authenticateHandler; protected SceneCommunicationService m_sceneGridService; + protected ISimulationDataService m_SimulationDataService; + protected IEstateDataService m_EstateDataService; protected IAssetService m_AssetService; protected IAuthorizationService m_AuthorizationService; protected IInventoryService m_InventoryService; @@ -216,6 +217,42 @@ namespace OpenSim.Region.Framework.Scenes get { return m_sceneGridService; } } + public ISimulationDataService SimulationDataService + { + get + { + if (m_SimulationDataService == null) + { + m_SimulationDataService = RequestModuleInterface(); + + if (m_SimulationDataService == null) + { + throw new Exception("No ISimulationDataService available."); + } + } + + return m_SimulationDataService; + } + } + + public IEstateDataService EstateDataService + { + get + { + if (m_EstateDataService == null) + { + m_EstateDataService = RequestModuleInterface(); + + if (m_EstateDataService == null) + { + throw new Exception("No IEstateDataService available."); + } + } + + return m_EstateDataService; + } + } + public IAssetService AssetService { get @@ -468,7 +505,7 @@ namespace OpenSim.Region.Framework.Scenes public Scene(RegionInfo regInfo, AgentCircuitManager authen, SceneCommunicationService sceneGridService, - StorageManager storeManager, + ISimulationDataService simDataService, IEstateDataService estateDataService, ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) { @@ -504,7 +541,8 @@ namespace OpenSim.Region.Framework.Scenes m_moduleLoader = moduleLoader; m_authenticateHandler = authen; m_sceneGridService = sceneGridService; - m_storageManager = storeManager; + m_SimulationDataService = simDataService; + m_EstateDataService = estateDataService; m_regInfo = regInfo; m_regionHandle = m_regInfo.RegionHandle; m_regionName = m_regInfo.RegionName; @@ -523,11 +561,9 @@ namespace OpenSim.Region.Framework.Scenes #region Region Settings // Load region settings - m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID); - if (m_storageManager.EstateDataStore != null) - { - m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false); - } + m_regInfo.RegionSettings = simDataService.LoadRegionSettings(m_regInfo.RegionID); + if (estateDataService != null) + m_regInfo.EstateSettings = estateDataService.LoadEstateSettings(m_regInfo.RegionID, false); #endregion Region Settings @@ -537,9 +573,9 @@ namespace OpenSim.Region.Framework.Scenes //Bind Storage Manager functions to some land manager functions for this scene EventManager.OnLandObjectAdded += - new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject); + new EventManager.LandObjectAdded(simDataService.StoreLandObject); EventManager.OnLandObjectRemoved += - new EventManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject); + new EventManager.LandObjectRemoved(simDataService.RemoveLandObject); m_sceneGraph = new SceneGraph(this, m_regInfo); @@ -1085,7 +1121,7 @@ namespace OpenSim.Region.Framework.Scenes { if (!entity.IsDeleted && entity is SceneObjectGroup && ((SceneObjectGroup)entity).HasGroupChanged) { - ((SceneObjectGroup)entity).ProcessBackup(m_storageManager.DataStore, false); + ((SceneObjectGroup)entity).ProcessBackup(SimulationDataService, false); } } @@ -1526,7 +1562,7 @@ namespace OpenSim.Region.Framework.Scenes { lock (m_returns) { - EventManager.TriggerOnBackup(m_storageManager.DataStore, forced); + EventManager.TriggerOnBackup(SimulationDataService, forced); m_backingup = false; foreach (KeyValuePair ret in m_returns) @@ -1567,7 +1603,7 @@ namespace OpenSim.Region.Framework.Scenes { if (group != null) { - group.ProcessBackup(m_storageManager.DataStore, true); + group.ProcessBackup(SimulationDataService, true); } } @@ -1609,19 +1645,19 @@ namespace OpenSim.Region.Framework.Scenes /// public void SaveTerrain() { - m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); + SimulationDataService.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); } public void StoreWindlightProfile(RegionLightShareData wl) { m_regInfo.WindlightSettings = wl; - m_storageManager.DataStore.StoreRegionWindlightSettings(wl); + SimulationDataService.StoreRegionWindlightSettings(wl); m_eventManager.TriggerOnSaveNewWindlightProfile(); } public void LoadWindlightProfile() { - m_regInfo.WindlightSettings = m_storageManager.DataStore.LoadRegionWindlightSettings(RegionInfo.RegionID); + m_regInfo.WindlightSettings = SimulationDataService.LoadRegionWindlightSettings(RegionInfo.RegionID); m_eventManager.TriggerOnSaveNewWindlightProfile(); } @@ -1632,13 +1668,13 @@ namespace OpenSim.Region.Framework.Scenes { try { - double[,] map = m_storageManager.DataStore.LoadTerrain(RegionInfo.RegionID); + double[,] map = SimulationDataService.LoadTerrain(RegionInfo.RegionID); if (map == null) { m_log.Info("[TERRAIN]: No default terrain. Generating a new terrain."); Heightmap = new TerrainChannel(); - m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); + SimulationDataService.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); } else { @@ -1655,7 +1691,7 @@ namespace OpenSim.Region.Framework.Scenes { Heightmap = new TerrainChannel(); - m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); + SimulationDataService.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); } } catch (Exception e) @@ -1702,7 +1738,7 @@ namespace OpenSim.Region.Framework.Scenes public void loadAllLandObjectsFromStorage(UUID regionID) { m_log.Info("[SCENE]: Loading land objects from storage"); - List landData = m_storageManager.DataStore.LoadLandObjects(regionID); + List landData = SimulationDataService.LoadLandObjects(regionID); if (LandChannel != null) { @@ -1733,7 +1769,7 @@ namespace OpenSim.Region.Framework.Scenes LoadingPrims = true; m_log.Info("[SCENE]: Loading objects from datastore"); - List PrimsFromDB = m_storageManager.DataStore.LoadObjects(regionID); + List PrimsFromDB = SimulationDataService.LoadObjects(regionID); m_log.Info("[SCENE]: Loaded " + PrimsFromDB.Count + " objects from the datastore"); @@ -2102,12 +2138,12 @@ namespace OpenSim.Region.Framework.Scenes // group has recently been delinked from another group but that this change has not been persisted // to the DB. ForceSceneObjectBackup(so); - so.DetachFromBackup(); - m_storageManager.DataStore.RemoveObject(so.UUID, m_regInfo.RegionID); + so.DetachFromBackup(); + SimulationDataService.RemoveObject(so.UUID, m_regInfo.RegionID); } // We need to keep track of this state in case this group is still queued for further backup. - so.IsDeleted = true; + so.IsDeleted = true; return true; } @@ -4408,7 +4444,7 @@ namespace OpenSim.Region.Framework.Scenes public void DeleteFromStorage(UUID uuid) { - m_storageManager.DataStore.RemoveObject(uuid, m_regInfo.RegionID); + SimulationDataService.RemoveObject(uuid, m_regInfo.RegionID); } public int GetHealth() @@ -4817,17 +4853,21 @@ namespace OpenSim.Region.Framework.Scenes public List GetEstateRegions(int estateID) { - if (m_storageManager.EstateDataStore == null) - return new List(); + IEstateDataService estateDataService = EstateDataService; + if (estateDataService == null) + return new List(0); - return m_storageManager.EstateDataStore.GetRegions(estateID); + return estateDataService.GetRegions(estateID); } public void ReloadEstateData() { - m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false); - - TriggerEstateSunUpdate(); + IEstateDataService estateDataService = EstateDataService; + if (estateDataService != null) + { + m_regInfo.EstateSettings = estateDataService.LoadEstateSettings(m_regInfo.RegionID, false); + TriggerEstateSunUpdate(); + } } public void TriggerEstateSunUpdate() diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 4024328afb..454f031ac8 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1378,7 +1378,7 @@ namespace OpenSim.Region.Framework.Scenes /// Processes backup. /// /// - public virtual void ProcessBackup(ISimulationDataStore datastore, bool forcedBackup) + public virtual void ProcessBackup(ISimulationDataService datastore, bool forcedBackup) { if (!m_isBackedUp) { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 1984d45f06..e45d4882d0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -848,7 +848,7 @@ namespace OpenSim.Region.Framework.Scenes /// Process inventory backup /// /// - public void ProcessInventoryBackup(ISimulationDataStore datastore) + public void ProcessInventoryBackup(ISimulationDataService datastore) { if (HasInventoryChanged) { diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index e3ef263b11..d634840d9b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs @@ -292,7 +292,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // scene backup thread. scene.Backup(true); - List storedObjects = scene.StorageManager.DataStore.LoadObjects(scene.RegionInfo.RegionID); + List storedObjects = scene.SimulationDataService.LoadObjects(scene.RegionInfo.RegionID); Assert.That(storedObjects.Count, Is.EqualTo(1)); Assert.That(storedObjects[0].Children.Count, Is.EqualTo(2)); @@ -335,7 +335,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests SceneObjectGroup groupToDelete = sog.DelinkFromGroup(linkPart, false); scene.DeleteSceneObject(groupToDelete, false); - List storedObjects = scene.StorageManager.DataStore.LoadObjects(scene.RegionInfo.RegionID); + List storedObjects = scene.SimulationDataService.LoadObjects(scene.RegionInfo.RegionID); Assert.That(storedObjects.Count, Is.EqualTo(1)); Assert.That(storedObjects[0].Children.Count, Is.EqualTo(1)); diff --git a/OpenSim/Region/Framework/StorageManager.cs b/OpenSim/Region/Framework/StorageManager.cs deleted file mode 100644 index c858d56926..0000000000 --- a/OpenSim/Region/Framework/StorageManager.cs +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Reflection; -using log4net; -using OpenSim.Region.Framework.Interfaces; - -namespace OpenSim.Region.Framework -{ - public class StorageManager - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public readonly ISimulationDataStore DataStore; - public readonly IEstateDataStore EstateDataStore; - - public StorageManager(string dllName, string connectionstring, string estateconnectionstring) - { - m_log.Info("[DATASTORE]: Attempting to load " + dllName); - Assembly pluginAssembly = Assembly.LoadFrom(dllName); - - foreach (Type pluginType in pluginAssembly.GetTypes()) - { - if (pluginType.IsPublic) - { - Type typeInterface = pluginType.GetInterface("ISimulationDataStore", true); - - if (typeInterface != null) - { - ISimulationDataStore plug = - (ISimulationDataStore)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); - plug.Initialise(connectionstring); - - DataStore = plug; - - m_log.Info("[DATASTORE]: Added ISimulationDataStore Interface"); - } - - typeInterface = pluginType.GetInterface("IEstateDataStore", true); - - if (typeInterface != null) - { - IEstateDataStore estPlug = - (IEstateDataStore) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); - estPlug.Initialise(estateconnectionstring); - - EstateDataStore = estPlug; - } - } - } - - //TODO: Add checking and warning to make sure it initialised. - } - } -} diff --git a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs b/OpenSim/Services/Connectors/Simulation/EstateDataService.cs new file mode 100644 index 0000000000..87c49d34a8 --- /dev/null +++ b/OpenSim/Services/Connectors/Simulation/EstateDataService.cs @@ -0,0 +1,112 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using OpenMetaverse; +using log4net; +using Mono.Addins; +using Nini.Config; +using System.Reflection; +using OpenSim.Services.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Data; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Services.Connectors +{ + public class EstateDataService : ServiceBase, IEstateDataService + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + protected IEstateDataStore m_database; + + public EstateDataService(IConfigSource config) + : base(config) + { + string dllName = String.Empty; + string connString = String.Empty; + + // Try reading the [DatabaseService] section, if it exists + IConfig dbConfig = config.Configs["DatabaseService"]; + if (dbConfig != null) + { + dllName = dbConfig.GetString("StorageProvider", String.Empty); + connString = dbConfig.GetString("EstateConnectionString", String.Empty); + if (String.IsNullOrEmpty(connString)) + connString = dbConfig.GetString("ConnectionString", String.Empty); + } + + // We tried, but this doesn't exist. We can't proceed + if (dllName == String.Empty) + throw new Exception("No StorageProvider configured"); + + m_database = LoadPlugin(dllName, new Object[] { connString }); + if (m_database == null) + throw new Exception("Could not find a storage interface in the given module"); + } + + public EstateSettings LoadEstateSettings(UUID regionID, bool create) + { + return m_database.LoadEstateSettings(regionID, create); + } + + public EstateSettings LoadEstateSettings(int estateID) + { + return m_database.LoadEstateSettings(estateID); + } + + public void StoreEstateSettings(EstateSettings es) + { + m_database.StoreEstateSettings(es); + } + + public List GetEstates(string search) + { + return m_database.GetEstates(search); + } + + public bool LinkRegion(UUID regionID, int estateID) + { + return m_database.LinkRegion(regionID, estateID); + } + + public List GetRegions(int estateID) + { + return m_database.GetRegions(estateID); + } + + public bool DeleteEstate(int estateID) + { + return m_database.DeleteEstate(estateID); + } + } +} diff --git a/OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs similarity index 59% rename from OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs rename to OpenSim/Services/Connectors/Simulation/SimulationDataService.cs index 93147d4bd3..946f7e48e1 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationDataServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs @@ -27,99 +27,114 @@ using System; using System.Collections.Generic; -using System.Reflection; -using log4net; -using Nini.Config; using OpenMetaverse; +using log4net; +using Mono.Addins; +using Nini.Config; +using System.Reflection; +using OpenSim.Services.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Data; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; -using OpenSim.Server.Base; -namespace OpenSim.Services.Connectors.Simulation +namespace OpenSim.Services.Connectors { - public class SimulationDataServiceConnector : ISimulationDataService + public class SimulationDataService : ServiceBase, ISimulationDataService { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); - private ISimulationDataStore m_simDataStore; + protected ISimulationDataStore m_database; - public SimulationDataServiceConnector() + public SimulationDataService(IConfigSource config) + : base(config) { - } + string dllName = String.Empty; + string connString = String.Empty; - public SimulationDataServiceConnector(IConfigSource config) - { - Initialise(config); - } + // Try reading the [DatabaseService] section, if it exists + IConfig dbConfig = config.Configs["DatabaseService"]; + if (dbConfig != null) + { + dllName = dbConfig.GetString("StorageProvider", String.Empty); + connString = dbConfig.GetString("ConnectionString", String.Empty); + } - public virtual void Initialise(IConfigSource config) - { - IConfig serverConfig = config.Configs["SimulationDataStore"]; - if (serverConfig == null) - throw new Exception("No section 'SimulationDataStore' in config file"); + // We tried, but this doesn't exist. We can't proceed + if (dllName == String.Empty) + throw new Exception("No StorageProvider configured"); - string simDataStore = serverConfig.GetString("StoreModule", String.Empty); - - Object[] args = new Object[] { config }; - m_simDataStore = ServerUtils.LoadPlugin(simDataStore, args); + m_database = LoadPlugin(dllName, new Object[] { connString }); + if (m_database == null) + throw new Exception("Could not find a storage interface in the given module"); } public void StoreObject(SceneObjectGroup obj, UUID regionUUID) { + m_database.StoreObject(obj, regionUUID); } public void RemoveObject(UUID uuid, UUID regionUUID) { + m_database.RemoveObject(uuid, regionUUID); } public void StorePrimInventory(UUID primID, ICollection items) { + m_database.StorePrimInventory(primID, items); } public List LoadObjects(UUID regionUUID) { - return new List(0); + return m_database.LoadObjects(regionUUID); } public void StoreTerrain(double[,] terrain, UUID regionID) { + m_database.StoreTerrain(terrain, regionID); } public double[,] LoadTerrain(UUID regionID) { - return new double[Constants.RegionSize, Constants.RegionSize]; + return m_database.LoadTerrain(regionID); } public void StoreLandObject(ILandObject Parcel) { + m_database.StoreLandObject(Parcel); } public void RemoveLandObject(UUID globalID) { + m_database.RemoveLandObject(globalID); } public List LoadLandObjects(UUID regionUUID) { - return new List(0); + return m_database.LoadLandObjects(regionUUID); } public void StoreRegionSettings(RegionSettings rs) { + m_database.StoreRegionSettings(rs); } public RegionSettings LoadRegionSettings(UUID regionUUID) { - return null; + return m_database.LoadRegionSettings(regionUUID); } public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID) { - return null; + return m_database.LoadRegionWindlightSettings(regionUUID); } public void StoreRegionWindlightSettings(RegionLightShareData wl) { + m_database.StoreRegionWindlightSettings(wl); } } } diff --git a/OpenSim/Tests/Common/Mock/TestScene.cs b/OpenSim/Tests/Common/Mock/TestScene.cs index 615e519b2d..4511228393 100644 --- a/OpenSim/Tests/Common/Mock/TestScene.cs +++ b/OpenSim/Tests/Common/Mock/TestScene.cs @@ -31,6 +31,7 @@ using OpenSim.Framework; using OpenSim.Framework.Communications; using OpenSim.Framework.Servers; using OpenSim.Region.Framework; +using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; namespace OpenSim.Tests.Common.Mock @@ -39,19 +40,14 @@ namespace OpenSim.Tests.Common.Mock { public TestScene( RegionInfo regInfo, AgentCircuitManager authen, - SceneCommunicationService sceneGridService, StorageManager storeManager, + SceneCommunicationService sceneGridService, ISimulationDataService simDataService, IEstateDataService estateDataService, ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) - : base(regInfo, authen, sceneGridService, storeManager, moduleLoader, + : base(regInfo, authen, sceneGridService, simDataService, estateDataService, moduleLoader, dumpAssetsToFile, physicalPrim, SeeIntoRegionFromNeighbor, config, simulatorVersion) { } - /// - /// Allow retrieval for test check purposes - /// - public StorageManager StorageManager { get { return m_storageManager; } } - /// /// Temporarily override session authentication for tests (namely teleport). /// diff --git a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs index 9318a27d05..ffd00781ae 100644 --- a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs +++ b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs @@ -157,11 +157,12 @@ namespace OpenSim.Tests.Common.Setup AgentCircuitManager acm = new AgentCircuitManager(); SceneCommunicationService scs = new SceneCommunicationService(); - StorageManager sm = new StorageManager("OpenSim.Tests.Common.dll", "", ""); + ISimulationDataService simDataService = null; + IEstateDataService estateDataService = null; IConfigSource configSource = new IniConfigSource(); TestScene testScene = new TestScene( - regInfo, acm, scs, sm, null, false, false, false, configSource, null); + regInfo, acm, scs, simDataService, estateDataService, null, false, false, false, configSource, null); INonSharedRegionModule capsModule = new CapabilitiesModule(); capsModule.Initialise(new IniConfigSource()); diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 08726ea8a0..8d714cecba 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -106,33 +106,6 @@ ; ## PRIM STORAGE ; ## - ; *** Prim Storage - only leave one storage_plugin uncommented *** - ; --- Null stores nothing - effectively disabling persistence: - ;storage_plugin = "OpenSim.Data.Null.dll" - - ; --- To use sqlite as region storage: - ; - ; PLEASE NOTE: Unfortunately, the current SQLite database plugin (necessary to use SQLite with Mono on Linux) is - ; not compatible with the sqlite3 library installed on Mac OSX. If you're using Mono 2.4 you can still use the old sqlite - ; library by uncommenting the SQLiteLegacy.dll storage plugin (and commenting out SQLite.dll). Unfortunately, the older library - ; will not work with Mono 2.6 on Mac OSX so you will either need to replace the OSX sqlite3 system library or use MySQL instead - ; - ; You will also need to do the same thing in config-include/StandaloneCommon.ini if you are running in standalone mode - storage_plugin = "OpenSim.Data.SQLite.dll" - ;storage_plugin = "OpenSim.Data.SQLiteLegacy.dll" - storage_connection_string="URI=file:OpenSim.db,version=3"; - - ; --- To use MySQL storage, supply your own connection string (this is only an example): - ; note that the supplied account needs create privilegies if you want it to auto-create needed tables. - ; - ; -->>> There are multiple connection strings defined in several places. Check it carefully! - ; - ; storage_plugin="OpenSim.Data.MySQL.dll" - ; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;"; - ; If you want to use a different database/server for estate data, then - ; uncomment and change this connect string. Defaults to the above if not set - ; estate_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; - ; Persistence of changed objects happens during regular sweeps. The following control that behaviour to ; prevent frequently changing objects from heavily loading the region data store. ; If both of these values are set to zero then persistence of all changed objects will happen on every sweep. diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini index 9a75f19845..4a6a082f0e 100644 --- a/bin/config-include/Grid.ini +++ b/bin/config-include/Grid.ini @@ -27,6 +27,11 @@ SimulationServiceInConnector = true LibraryModule = true +[SimulationDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" + +[EstateDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" [GridService] LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example index a19591bfaa..c2cd5c3ec5 100644 --- a/bin/config-include/GridCommon.ini.example +++ b/bin/config-include/GridCommon.ini.example @@ -1,3 +1,24 @@ +[DatabaseService] + ; + ; ### Choose the DB + ; + + ; SQLite + Include-Storage = "config-include/storage/SQLiteStandalone.ini"; + + ; Unfortunately the current SQLite database plugin is not compatible with Mac OSX. You can still use the older + ; legacy sqlite library if you are using Mono 2.4. Please see the notes in OpenSim.ini (search for sqlite) + ; for more details + ;Include-Storage = "config-include/storage/SQLiteLegacyStandalone.ini"; + + ; MySql + ; Uncomment these lines if you want to use mysql storage + ; Change the connection string to your db details + ;StorageProvider = "OpenSim.Data.MySQL.dll" + ;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;" + ; Uncomment this line if you are using MySQL and want to use a different database for estates + ;EstateConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;" + [AssetService] DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll" diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini index ab29018084..d69a94550b 100644 --- a/bin/config-include/GridHypergrid.ini +++ b/bin/config-include/GridHypergrid.ini @@ -30,6 +30,12 @@ SimulationServiceInConnector = true LibraryModule = true +[SimulationDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" + +[EstateDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" + [AssetService] LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector" HypergridAssetService = "OpenSim.Services.Connectors.dll:HGAssetServiceConnector" diff --git a/bin/config-include/HyperSimianGrid.ini b/bin/config-include/HyperSimianGrid.ini index 49ba2ca0d7..29b51deacd 100644 --- a/bin/config-include/HyperSimianGrid.ini +++ b/bin/config-include/HyperSimianGrid.ini @@ -41,6 +41,12 @@ AssetCaching = "FlotsamAssetCache" +[SimulationDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" + +[EstateDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" + [Friends] Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector" diff --git a/bin/config-include/SimianGrid.ini b/bin/config-include/SimianGrid.ini index 9b27cc7a9a..239ce3093c 100644 --- a/bin/config-include/SimianGrid.ini +++ b/bin/config-include/SimianGrid.ini @@ -41,6 +41,12 @@ AssetCaching = "FlotsamAssetCache" +[SimulationDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" + +[EstateDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" + [Friends] Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector" diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini index eae98016d3..d74b50ef76 100644 --- a/bin/config-include/Standalone.ini +++ b/bin/config-include/Standalone.ini @@ -22,6 +22,12 @@ LLLoginServiceInConnector = true GridInfoServiceInConnector = true +[SimulationDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" + +[EstateDataStore] + LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService" + [AssetService] LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService" diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index f86296087b..96ef602a03 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -18,6 +18,8 @@ ; Change the connection string to your db details ;StorageProvider = "OpenSim.Data.MySQL.dll" ;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" + ; Uncomment this line if you are using MySQL and want to use a different database for estates + ;EstateConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;" [AssetService] DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll" diff --git a/prebuild.xml b/prebuild.xml index 7dec8ba788..726991c4a1 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -924,13 +924,15 @@ - + + + @@ -1653,6 +1655,7 @@ + From 18a9ac6b39b91865c33eeffa1ef8ff3e8a847c1b Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Sun, 12 Sep 2010 15:04:51 -0700 Subject: [PATCH 35/35] Fix unit test SceneSetupHelpers to load the mock simulation data store --- .../Tests/Common/Mock/MockRegionDataPlugin.cs | 75 +++++++++++++++++++ .../Tests/Common/Setup/SceneSetupHelpers.cs | 2 +- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs index f453a4bf33..de6e815a9b 100644 --- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs @@ -35,6 +35,81 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Data.Null { + public class NullDataService : ISimulationDataService + { + private NullDataStore m_store; + + public NullDataService() + { + m_store = new NullDataStore(); + } + + public void StoreObject(SceneObjectGroup obj, UUID regionUUID) + { + m_store.StoreObject(obj, regionUUID); + } + + public void RemoveObject(UUID uuid, UUID regionUUID) + { + m_store.RemoveObject(uuid, regionUUID); + } + + public void StorePrimInventory(UUID primID, ICollection items) + { + m_store.StorePrimInventory(primID, items); + } + + public List LoadObjects(UUID regionUUID) + { + return m_store.LoadObjects(regionUUID); + } + + public void StoreTerrain(double[,] terrain, UUID regionID) + { + m_store.StoreTerrain(terrain, regionID); + } + + public double[,] LoadTerrain(UUID regionID) + { + return m_store.LoadTerrain(regionID); + } + + public void StoreLandObject(ILandObject Parcel) + { + m_store.StoreLandObject(Parcel); + } + + public void RemoveLandObject(UUID globalID) + { + m_store.RemoveLandObject(globalID); + } + + public List LoadLandObjects(UUID regionUUID) + { + return m_store.LoadLandObjects(regionUUID); + } + + public void StoreRegionSettings(RegionSettings rs) + { + m_store.StoreRegionSettings(rs); + } + + public RegionSettings LoadRegionSettings(UUID regionUUID) + { + return m_store.LoadRegionSettings(regionUUID); + } + + public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID) + { + return m_store.LoadRegionWindlightSettings(regionUUID); + } + + public void StoreRegionWindlightSettings(RegionLightShareData wl) + { + m_store.StoreRegionWindlightSettings(wl); + } + } + /// /// Mock region data plugin. This obeys the api contract for persistence but stores everything in memory, so that /// tests can check correct persistence. diff --git a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs index ee76db46ef..fc9db03932 100644 --- a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs +++ b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs @@ -157,7 +157,7 @@ namespace OpenSim.Tests.Common.Setup AgentCircuitManager acm = new AgentCircuitManager(); SceneCommunicationService scs = new SceneCommunicationService(); - ISimulationDataService simDataService = null; + ISimulationDataService simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin("OpenSim.Tests.Common.dll", null); IEstateDataService estateDataService = null; IConfigSource configSource = new IniConfigSource();